Справочная информация: я работаю на сервере OS X, и мне нужно использовать сертификаты из цепочки ключей с openssl smime, чтобы зашифровать сообщения в сценарии bash. Для этого я использую security find-certificate
с -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)