Відповіді:
З openssl
:
openssl x509 -enddate -noout -in file.pem
Вихід має форму:
notAfter=Nov 3 22:23:50 2014 GMT
Також дивіться відповідь MikeW про те, як легко перевірити, чи закінчився термін дії сертифіката чи ні, чи буде він протягом певного періоду часу, не потребуючи розбору дати, зазначеної вище.
Якщо ви просто хочете дізнатися, чи закінчився термін дії сертифікату (чи це буде зроблено протягом наступних N секунд), -checkend <seconds>
опція openssl x509
повідомить вам:
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
Це дозволяє економити необхідність порівняння дати та часу.
openssl
поверне код виходу 0
(нуль), якщо термін дії сертифікату не закінчився і не зробить це протягом наступних 86400 секунд, у прикладі вище. Якщо термін дії сертифікату закінчився або вже зробив це - або якась інша помилка, наприклад, недійсний / неіснуючий файл - код повернення є 1
.
(Звичайно, передбачається, що час / дата встановлено правильно)
-noout
опцію, щоб побачити корисне повідомлення за допомогою однієї команди без зайвої логіки. Наприклад, openssl x509 -checkend 0 -in file.pem
дасть вихід "Сертифікат закінчується" або "Сертифікат не закінчується", вказуючи, чи закінчиться термін дії сертифікату через нульові секунди.
Ось мій командний рядок bash, щоб перелічити декілька сертифікатів у порядку їх закінчення, останній закінчується останнім.
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
Вибірка зразка:
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
0 7 * * 1 /path/to/cert.sh | mail -s "certbot" my@email.com
Ось функція bash, яка перевіряє всі ваші сервери, припускаючи, що ви використовуєте DNS-круїн. Зауважте, що для цього потрібна дата GNU і вона не працюватиме на Mac OS
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
expiry_date
значення потрібно буде видалити назву часового поясу з кінця. Додайте додатковий cut
кінець труби, щоб зробити це:| cut -d ' ' -f 1-4
Один рядок, що перевіряє справжнє / хибне, якщо термін домену закінчиться через деякий час (наприклад, 15 днів):
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
Для MAC OSX (El Capitan) Ця модифікація прикладу Ніколаса працювала для мене.
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
Вибірка зразка:
2014-12-19: /path/to/certs/MDM_Certificate.pem
2015-11-13: /path/to/certs/MDM_AirWatch_Certificate.pem
macOS не сподобався --date=
або --iso-8601
прапори в моїй системі.
.cer
certs, які ви тільки що зробили та завантажили з сайту Apple Dev?
Відповідно до прийнятої відповіді, але зауважте, що вона працює навіть з .crt
файлом, а не лише з .pem
файлом, про всяк випадок, якщо ви не в змозі знайти .pem
місцезнаходження файлу.
openssl x509 -enddate -noout -in e71c8ea7fa97ad6c.crt
Результат:
notAfter=Mar 29 06:15:00 2020 GMT
-startdate
і-enddate
вбудовані параметри вx509
утиліту. Вони врятують васgrep
.