skrypt sprawdzający, czy certyfikat SSL jest ważny

14

Mam kilka certyfikatów SSL i chciałbym otrzymywać powiadomienia o wygaśnięciu certyfikatu.

Moim pomysłem jest stworzenie cronjobu, który codziennie wykonuje proste polecenie.

Wiem, że opensslpolecenia w systemie Linux można użyć do wyświetlenia informacji o certyfikacie zdalnego serwera, tj .:

openssl s_client -connect www.google.com:443

Ale nie widzę daty ważności w tym wyniku. Ponadto muszę zakończyć to polecenie za pomocą CTRL+ c.

Jak mogę sprawdzić termin ważności zdalnego certyfikatu ze skryptu (najlepiej używając openssl) i zrobić to w „trybie wsadowym”, aby działał automatycznie bez interakcji użytkownika?

Martin Vegter
źródło
4
Polecam również wysłać nazwę -servername www.google.comserwera dla serwerów obsługujących SNI Aby uniknąć konieczności zakończenia, wyślij do niej / dev / null< /dev/null
syss
Jeśli korzystasz z Red Hat / CentOS / Fedora, spójrz na certmonger . Jest również dostępny w standardowych repozytoriach.
JRFerguson
Dodałbym sprawdzenie certyfikatu w narzędziu do monitorowania, takim jak nagios lub icinga.
sebix 10.10.15

Odpowiedzi:

18

Twoje polecenie oczekuje teraz żądania HTTP, takiego jak GET index.phpna przykład. Zamiast tego użyj tego:

if true | openssl s_client -connect www.google.com:443 2>/dev/null | \
  openssl x509 -noout -checkend 0; then
  echo "Certificate is not expired"
else
  echo "Certificate is expired"
fi

  • true: po prostu nie poda żadnych danych wejściowych, po których następuje eof, dzięki czemu openssl kończy działanie po podłączeniu.
    • openssl ...: polecenie z twojego pytania
    • 2>/dev/null: dane wyjściowe błędu zostaną zignorowane.
  • openssl x509: aktywuje zarządzanie danymi certyfikatu X.509.
    • Domyślnie zostanie to odczytane ze standardowego wejścia
    • -noout: Pomija cały wynik certyfikatu
    • -checkend 0: sprawdź, czy certyfikat wygasł w ciągu następnych 0 sekund
chaos
źródło
-checkendo wiele łatwiej niż skrypt, który znalazłem, który wykonuje arytmetykę daty!
Auspex
7

Otrzymuje certyfikat, ale go nie dekoduje. Ponieważ byłoby to potrzebne, jeśli chcesz datę, nie widzisz jej. Potrzebne jest więc podłączenie go do x509aplikacji OpenSSL w celu zdekodowania certyfikatu:

openssl s_client -connect www.example.com:443 \
    -servername www.example.com </dev/null |\
    openssl x509 -in /dev/stdin -noout -text

To da ci w pełni zdekodowany certyfikat na standardowym wyjściu, w tym daty jego ważności.

Wouter Verhelst
źródło
3

Jeśli chcesz sprawdzić datę ważności, dzięki temu wpisowi na blogu znalazłeś sposób na znalezienie tych informacji wraz z innymi istotnymi informacjami za pomocą jednego połączenia:

echo | openssl s_client -servername unix.stackexchange.com -connect unix.stackexchange.com:443 2>/dev/null | openssl x509 -noout -issuer -subject -dates

Dane wyjściowe obejmują wystawcę, podmiot (któremu wydano certyfikat), datę wydania i datę wygaśnięcia :

issuer= /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert SHA2 High Assurance Server CA
subject= /C=US/ST=NY/L=New York/O=Stack Exchange, Inc./CN=*.stackexchange.com
notBefore=May 21 00:00:00 2016 GMT
notAfter=Aug 14 12:00:00 2019 GMT
Robert Lujo
źródło