背景信息:我正在 OS X 服务器上工作,我需要使用 openssl smime 的密钥链中的证书来加密 bash 脚本中的消息。为此,我使用带有选项的命令从security find-certificate
OS -e
X 密钥链中提取某个电子邮件地址的证书。这很有效,但是,该命令会将为该电子邮件地址找到的所有证书提取到 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)