Openssl

如何從具有多個證書的 PEM 文件中選擇一個證書?

  • February 23, 2017

背景資訊:我正在使用 OS X 伺服器,我需要使用帶有 openssl smime 的密鑰鏈中的證書來加密 bash 腳本中的消息。為此,我使用security find-certificatewith-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)

引用自:https://serverfault.com/questions/832555