Miałem ten sam problem i napisałem to ... Jest szybki i brudny, ale powinien działać. Loguje (i drukuje na ekranie z włączonym debugowaniem) wszelkie certyfikaty, które nie są jeszcze ważne lub wygasają w ciągu następnych 90 dni. Może zawierać pewne błędy, ale możesz je uporządkować.
#!/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
W przypadku korzystania z systemu OS X może się okazać, że date
polecenie nie działa poprawnie. Wynika to z różnic w wersji tego narzędzia dla systemów Unix i Linux. Połączony post ma opcje wykonania tej czynności.
-servername
argument w następujący sposób:openssl s_client -servername example.com -connect example.com:443
Wystarczy uruchomić poniższe polecenie, aby podać datę wygaśnięcia:
Możesz użyć tego polecenia do pliku wsadowego, aby zebrać te informacje dla większej liczby zdalnych serwerów.
źródło
-servername
argumentu w następujący sposób:openssl s_client -servername google.com.br -connect google.com.br:443
Poniżej znajduje się mój skrypt, który jako czek w nagios. Łączy się z określonym hostem, sprawdza, czy certyfikat jest ważny w ramach progu określonego przez opcje -c / -w. Może sprawdzić, czy CN certyfikatu jest zgodny z oczekiwaną nazwą.
Potrzebujesz biblioteki Python openssl, a ja przeprowadziłem wszystkie testy z python 2.7.
Wielokrotne wywołanie skryptu powłoki byłoby trywialne. Skrypt zwraca standardowe wartości wyjścia nagios dla stanu krytycznego / ostrzegawczego / ok.
Prostą kontrolę certyfikatu Google można wykonać w ten sposób.
check_ssl_certificate
źródło
get_pem
Połącz z hostem: port, wyodrębnij certyfikat za pomocą sed i napisz go na /tmp/host.port.pem.
get_expiration_date
Przeczytaj podany plik pem i oceń klucz notAfter jako zmienną bash. Następnie wydrukuj nazwę pliku i datę jego wygaśnięcia w danym języku.
get_pem_expiration_dates
Iteruj jakiś plik wejściowy i uruchom powyższe funkcje.
check.pems.sh
próbka wyjściowa
I aby odpowiedzieć na twoje pytanie:
źródło
-servername
argument w następujący sposób:openssl s_client -servername example.com -connect example.com:443
Oto jednoliniowa wersja zaakceptowanej odpowiedzi, która wyświetla tylko pozostałą liczbę dni:
( 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 )) )
Przykład z www.github.com:
źródło
( ... )
składnia podpowłoki może być specyficzna dla Bash; Chyba używasz innej powłoki?Podaj listę nazw hostów z portem 443 w formacie nazwa_hosta: port w pliku i podaj jako nazwę pliku.
! / bin / bash
nazwa_pliku = / root / kns / certs
date1 = $ (data | cut -d "" -f2,3,6)
currentDate = $ (data -d "$ date1" + "% Y% m% d")
podczas gdy czytaj -r wiersz do
dcert = $ (echo | openssl s_client -servername $ line -connect $ linia 2> / dev / null | openssl x509 -noout -data | grep notAfter | cut -d = -f2)
echo Nazwa hosta: $ line endDate = $ (data -d "$ dcert" + "% Y% m% d")
d1 = $ (data -d "$ endDate" +% s) d2 = $ (data -d "$ currentDate" +% s) echo Nazwa hosta: $ linia - Pozostałe dni $ (((d1 - d2) / 86400))
echo $ dcert zrobione <"$ nazwa pliku"
źródło