Openssl
如何從具有多個證書的 PEM 文件中選擇一個證書?
背景資訊:我正在使用 OS X 伺服器,我需要使用帶有 openssl smime 的密鑰鏈中的證書來加密 bash 腳本中的消息。為此,我使用
security find-certificate
with-e
選項從 OS X 密鑰鏈中提取某個電子郵件地址的證書。這很好用,但是,該命令會將針對該電子郵件地址找到的所有證書提取到 PEM 文件中。該文件甚至會包含過期的證書。當我使用 PEM 文件進行郵件加密時
openssl smime
,顯然只使用了 PEM 文件中的第一個證書。那麼需要做的是從PEM文件中選擇過期日期最長的證書,這樣我就可以用openssl使用那個證書了,但是這怎麼能做到呢?
如果可以接受任何未過期的證書:
$ # 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)