Назад | Перейти на главную страницу

Как я могу выбрать сертификат из файла PEM с несколькими сертификатами?

Справочная информация: я работаю на сервере 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)