У меня была такая же проблема и я написал это ... Это быстро и грязно, но должно работать. Он будет регистрировать (и печатать на экране с включенной отладкой) любые сертификаты, которые еще не действительны или срок действия которых истекает в течение следующих 90 дней. Может содержать некоторые ошибки, но не стесняйтесь приводить их в порядок.
#!/bin/sh
DEBUG=false
warning_days=90 # Number of days to warn about soon-to-expire certs
certs_to_check='serverA.test.co.uk:443
serverB.test.co.uk:8140
serverC.test.co.uk:443'
for CERT in $certs_to_check
do
$DEBUG && echo "Checking cert: [$CERT]"
output=$(echo | openssl s_client -connect ${CERT} 2>/dev/null |\
sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' |\
openssl x509 -noout -subject -dates 2>/dev/null)
if [ "$?" -ne 0 ]; then
$DEBUG && echo "Error connecting to host for cert [$CERT]"
logger -p local6.warn "Error connecting to host for cert [$CERT]"
continue
fi
start_date=$(echo $output | sed 's/.*notBefore=\(.*\).*not.*/\1/g')
end_date=$(echo $output | sed 's/.*notAfter=\(.*\)$/\1/g')
start_epoch=$(date +%s -d "$start_date")
end_epoch=$(date +%s -d "$end_date")
epoch_now=$(date +%s)
if [ "$start_epoch" -gt "$epoch_now" ]; then
$DEBUG && echo "Certificate for [$CERT] is not yet valid"
logger -p local6.warn "Certificate for $CERT is not yet valid"
fi
seconds_to_expire=$(($end_epoch - $epoch_now))
days_to_expire=$(($seconds_to_expire / 86400))
$DEBUG && echo "Days to expiry: ($days_to_expire)"
warning_seconds=$((86400 * $warning_days))
if [ "$seconds_to_expire" -lt "$warning_seconds" ]; then
$DEBUG && echo "Cert [$CERT] is soon to expire ($seconds_to_expire seconds)"
logger -p local6.warn "cert [$CERT] is soon to expire ($seconds_to_expire seconds)"
fi
done
Если вы используете OS X, вы можете обнаружить, что date
команда работает неправильно. Это связано с различиями в версии этой утилиты для Unix и Linux. В связанном посте есть варианты сделать эту работу.
-servername
аргумент, например так:openssl s_client -servername example.com -connect example.com:443
Просто запустите команду ниже, и она предоставит дату истечения срока действия:
Вы можете использовать эту команду в командном файле, чтобы собрать эту информацию для более удаленных серверов.
источник
-servername
аргумент, например так:openssl s_client -servername google.com.br -connect google.com.br:443
Ниже мой сценарий, который в качестве проверки в рамках nagios. Он подключается к определенному хосту и проверяет, что сертификат действителен в пределах порога, установленного параметрами -c / -w. Он может проверить, что CN сертификата соответствует имени, которое вы ожидаете.
Вам нужна библиотека Python OpenSSL, и я сделал все тестирование с Python 2.7.
Было бы тривиально, чтобы скрипт оболочки вызывал это несколько раз. Скрипт возвращает стандартные значения выхода nagios для критического состояния / предупреждения / нормального состояния.
Простая проверка сертификата Google может быть выполнена следующим образом.
check_ssl_certificate
источник
get_pem
Подключитесь к хосту: порт, распакуйте сертификат с помощью sed и запишите его в /tmp/host.port.pem.
get_expiration_date
Прочитайте данный файл pem и оцените ключ notAfter как переменную bash. Затем напечатайте имя файла и дату, когда он истекает в данной локали.
get_pem_expiration_dates
Выполните итерацию некоторого входного файла и запустите вышеуказанные функции.
check.pems.sh
образец вывода
И чтобы ответить на ваш вопрос:
источник
-servername
аргумент, например так:openssl s_client -servername example.com -connect example.com:443
Вот однострочная версия принятого ответа, которая просто выводит оставшееся количество дней:
( export DOMAIN=example.com; echo $(( ( $(date +%s -d "$( echo | openssl s_client -servername $DOMAIN -connect $DOMAIN:443 2>/dev/null | openssl x509 -noout -enddate | sed 's/.*notAfter=\(.*\)$/\1/g' )" ) - $(date +%s) ) / 86400 )) )
Пример с www.github.com:
источник
( ... )
синтаксис subshell может быть специфичным для Bash; Я полагаю, вы используете другую оболочку?Дайте список имен хостов с портом 443 в формате имя хоста: порт в файле и укажите его как имя файла.
! / Bin / Баш
имя файла = / корень / КНС / сертификаты
date1 = $ (date | cut -d "" -f2,3,6)
currentDate = $ (date -d "$ date1" + "% Y% m% d")
пока читаешь -r строку делай
dcert = $ (echo | openssl s_client -servername $ line -connect $ line 2> / dev / null | openssl x509 -noout -dates | grep notAfter | cut -d = -f2)
echo Имя хоста: $ line endDate = $ (date -d "$ dcert" + "% Y% m% d")
d1 = $ (дата -d "$ endDate" +% s) d2 = $ (дата -d "$ currentDate" +% s) echo Имя хоста: $ line - оставшиеся дни $ (((d1 - d2) / 86400))
echo $ dcert done <"$ filename"
источник