如何从包含多个证书的 PEM 文件中选择一个证书?

如何从包含多个证书的 PEM 文件中选择一个证书?

背景信息:我正在 OS X 服务器上工作,我需要使用 openssl smime 的密钥链中的证书来加密 bash 脚本中的消息。为此,我使用带有选项的命令从security find-certificateOS -eX 密钥链中提取某个电子邮件地址的证书。这很有效,但是,该命令会将为该电子邮件地址找到的所有证书提取到 PEM 文件中。该文件甚至会包含过期的证书。

当我使用PEM文件进行邮件加密时openssl smime,显然只使用PEM文件中的第一个证书。

因此需要做的是从 PEM 文件中选择具有最高有效期的证书,这样我就可以将那个证书与 openssl 一起使用,但是如何做到这一点呢?

答案1

如果任何未过期的证书是可以接受的:

$ # adjust filenames for your environment as desired 

$ cat <<\EOF >awkscript # only need to do this setup once
BEGIN{ cmd="openssl x509 <tempfile -checkend 0" }
/^-----BEGIN/ {f=1} 
f {print >"tempfile"} 
/^-----END/ {f=0; close("tempfile"); cmd | getline status;
  if( status ~ "not expire" ){ exit 0 }; close(cmd) }
END{ exit 1 }
EOF

$ if awk -f awkscript combinedpemfile
> then # use tempfile as cert for encryption
> else # no unexpired cert found 
> fi

如果您特别需要最后到期的时间,我看不出有自动进行日期比较的简单方法,但这可以完成其余的工作:

$ cat <<\EOF >awkscript # again only once
BEGIN{ cmd="openssl x509 -noout -enddate" }
/^------BEGIN/ {f=1; t=""} f {t=t $0 ORS} 
/^-----END/ {f=0; out="tempcert#"(++i); print t >out; 
  printf "%s: ",out; print t | cmd; close(cmd) }
EOF

$ awk -f awkscript combinedpemfile
tempcert#1: notAfter=(expiryfor1)
tempcert#2: notAfter=(expiryfor2)
tempcert#3: notAfter=(expiryfor3)
...
$ # pick the latest expiry and use the corresponding file (and clean up)

相关内容