как определить дату истечения срока действия сертификата ssl из сертификата pem?

<p>если у меня есть настоящий файл и оболочка bash в mac или linux, как я могу запросить файл сертификата, когда он истечет? не веб-сайт, а фактически сам файл сертификата, при условии, что у меня есть файлы csr, key, pem и chain.</p>

<p>с <code>openssl</code>:</p><pre><code>openssl x509 -enddate -noout -in file.pem </code></pre><p>вывод находится в форме:</p><pre><code>notafter=nov 3 22:23:50 2014 gmt </code></pre><p>также см. <a href="https://stackoverflow.com/a/31718838/1899640">ответ mikew</a> , чтобы узнать, как легко проверить, истек ли срок действия сертификата или нет, или нет, в течение определенного периода времени, не анализируя вышеуказанную дату.</p>

<p>если вы просто хотите узнать, истек ли срок действия сертификата (или будет ли он в течение следующих n секунд), опция <code>-checkend <seconds></code> для <code>openssl x509</code> скажет вам:</p><pre><code>if openssl x509 -checkend 86400 -noout -in file.pem then echo "certificate is good for another day!" else echo "certificate has expired or will do so within 24 hours!" echo "(or is invalid/not found)" fi </code></pre><p>это избавляет от необходимости делать сравнение даты/времени самостоятельно.</p><p><code>openssl</code> вернет код завершения <code>0</code> (ноль), если срок действия сертификата не истек, и не будет выполняться в течение следующих 86400 секунд, как в примере выше. если срок действия сертификата истек или он уже был сделан, или возникла какая-либо другая ошибка, например, неверный/несуществующий файл, используйте код возврата <code>1</code>.</p><p>(конечно, предполагается, что время/дата установлены правильно)</p>

<p>вот моя командная строка bash для перечисления нескольких сертификатов в порядке их истечения, последний из которых истекает первым.</p><pre><code>for pem in /etc/ssl/certs/*.pem; do printf '%s: %s\n' \ "$(date --date="$(openssl x509 -enddate -noout -in "$pem"|cut -d= -f 2)" --iso-8601)"  "$pem" done | sort </code></pre><p>пример вывода:</p><pre><code>2015-12-16: /etc/ssl/certs/staat\_der\_nederlanden\_root\_ca.pem 2016-03-22: /etc/ssl/certs/ca\_disig.pem 2016-08-14: /etc/ssl/certs/ebg\_elektronik\_sertifika\_hizmet\_s.pem </code></pre>

<p>вот функция bash, которая проверяет все ваши серверы, если вы используете циклический перебор dns. обратите внимание, что для этого требуется gnu дата, и она не будет работать в mac os</p><pre><code>function check\_certs () { if [ -z "$1" ] then echo "domain name missing" exit 1 fi name="$1" shift now\_epoch=$( date +%s ) dig +noall +answer $name | while read \_ \_ \_ \_ ip; do echo -n "$ip:" expiry_date=$( echo | openssl s\_client -showcerts -servername $name -connect $ip:443 2>/dev/null | openssl x509 -inform pem -noout -enddate | cut -d "=" -f 2 ) echo -n " $expiry_date"; expiry_epoch=$( date -d "$expiry_date" +%s ) expiry_days="$(( ($expiry_epoch - $now\_epoch) / (3600 * 24) ))" echo " $expiry_days days" done } пример вывода:$ check\_certs stackoverflow.com 151.101.1.69: aug 14 12:00:00 2019 gmt 603 days 151.101.65.69: aug 14 12:00:00 2019 gmt 603 days 151.101.129.69: aug 14 12:00:00 2019 gmt 603 days 151.101.193.69: aug 14 12:00:00 2019 gmt 603 days </code></pre>

<p>для mac osx (el capitan) эта модификация примера николая сработала для меня.</p><pre><code>for pem in /path/to/certs/*.pem; do printf '%s: %s\n' \ "$(date -jf "%b %e %h:%m:%s %y %z" "$(openssl x509 -enddate -noout -in "$pem"|cut -d= -f 2)" +"%y-%m-%d")"  "$pem"; done | sort </code></pre><p>пример вывода:</p><pre><code>2014-12-19: /path/to/certs/mdm\_certificate.pem 2015-11-13: /path/to/certs/mdm\_airwatch\_certificate.pem </code></pre><p>macos не понравились флаги <code>--date=</code> или <code>--iso-8601</code> в моей системе.</p>

<p>проверка одной строки на true/false, если срок действия сертификата истек через некоторое время (например, 15 дней):</p><pre><code>if openssl x509 -checkend $(( 24*3600*15 )) -noout -in <(openssl s\_client -showcerts -connect may.domain.com:443 </dev/null 2>/dev/null | openssl x509 -outform pem) then echo 'good' else echo 'bad' fi </code></pre>

<p>если (по какой-то причине) вы хотите использовать приложение с графическим интерфейсом в linux, используйте <code>gcr-viewer</code> (в большинстве дистрибутивов оно устанавливается пакетом <code>gcr</code> (в противном случае в пакете <code>gcr-viewer</code>))</p><pre><code>gcr-viewer file.pem # or gcr-viewer file.crt </code></pre>