Odpowiedzi:
Z openssl
:
openssl x509 -enddate -noout -in file.pem
Dane wyjściowe mają postać:
notAfter=Nov 3 22:23:50 2014 GMT
Zobacz także odpowiedź MikeW, aby dowiedzieć się, jak łatwo sprawdzić, czy certyfikat wygasł, czy też nie, lub czy upłynie określony czas, bez konieczności analizowania powyższej daty.
Jeśli chcesz tylko wiedzieć, czy certyfikat wygasł (lub zrobi to w ciągu najbliższych N sekund), -checkend <seconds>
opcja 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
Oszczędza to konieczności samodzielnego porównywania daty i godziny.
openssl
zwróci kod zakończenia 0
(zero), jeśli certyfikat nie wygasł i nie zrobi tego przez następne 86400 sekund, w powyższym przykładzie. Jeśli certyfikat wygasł lub już to zrobił - lub inny błąd, taki jak niepoprawny / nieistniejący plik - kod powrotu to 1
.
(Oczywiście zakłada się, że czas / data są ustawione poprawnie)
-noout
opcję wyświetlania pomocnego komunikatu za pomocą jednego polecenia bez dodatkowej logiki. Np. openssl x509 -checkend 0 -in file.pem
Da wynik „Certyfikat wygaśnie” lub „Certyfikat nie wygaśnie” wskazując, czy certyfikat wygaśnie za zero sekund.
Oto mój wiersz poleceń bash, aby wyświetlić listę wielu certyfikatów w kolejności ich wygaśnięcia, ostatnio wygasającą jako pierwszą.
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
Przykładowe dane wyjściowe:
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
Oto funkcja bash, która sprawdza wszystkie twoje serwery, przy założeniu, że używasz round-robin DNS. Pamiętaj, że wymaga to daty GNU i nie będzie działać w systemie 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
}
Przykład wyjściowy:
$ 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
wartość będzie musiała usunąć nazwę strefy czasowej z jej końca. Dodaj dodatkowy cut
koniec rury, aby to zrobić:| cut -d ' ' -f 1-4
Sprawdzanie jednej linii wartości true / false, jeśli certyfikat domeny wygasnie później (np. 15 dni):
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
Dla MAC OSX (El Capitan) Ta modyfikacja przykładu Mikołaja działała dla mnie.
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
Przykładowe dane wyjściowe:
2014-12-19: /path/to/certs/MDM_Certificate.pem
2015-11-13: /path/to/certs/MDM_AirWatch_Certificate.pem
macOS nie lubił flag --date=
lub --iso-8601
w moim systemie.
.cer
certyfikaty, które właśnie utworzyłeś i pobrałeś ze strony Apple Dev?
Taka sama jak zaakceptowana odpowiedź, ale pamiętaj, że działa nawet z .crt
plikiem, a nie tylko z .pem
plikiem, na wypadek, gdybyś nie był w stanie znaleźć .pem
lokalizacji pliku.
openssl x509 -enddate -noout -in e71c8ea7fa97ad6c.crt
Wynik:
notAfter=Mar 29 06:15:00 2020 GMT
-startdate
i-enddate
wbudowane wx509
narzędzie. Uratują cigrep
.