Skript, um zu überprüfen, ob das SSL-Zertifikat gültig ist

14

Ich habe mehrere SSL-Zertifikate und möchte benachrichtigt werden, wenn ein Zertifikat abgelaufen ist.

Meine Idee ist es, einen Cronjob zu erstellen, der jeden Tag einen einfachen Befehl ausführt.

Ich weiß, dass der opensslBefehl in Linux verwendet werden kann, um die Zertifikatsinformationen des Remote-Servers anzuzeigen, dh:

openssl s_client -connect www.google.com:443

In dieser Ausgabe wird das Ablaufdatum jedoch nicht angezeigt. Außerdem muss ich diesen Befehl mit CTRL+ beenden c.

Wie kann ich den Ablauf eines Remote-Zertifikats anhand eines Skripts (vorzugsweise mithilfe von openssl) überprüfen und im "Batch-Modus" ausführen, sodass es automatisch ohne Benutzerinteraktion ausgeführt wird?

Martin Vegter
quelle
4
Ich würde auch empfehlen , den Server zu senden mit -servername www.google.comfür SNI - Servern aktiviert , um die Notwendigkeit für die Beendigung Send / dev / null , um es zu vermeiden< /dev/null
SySS
Wenn Sie Red Hat / CentOS / Fedora verwenden, schauen Sie sich Certmonger an . Es ist auch in den Standard-Repositorys verfügbar.
JRFerguson
Ich würde die Zertifikatsüberprüfung in einem Überwachungstool wie Nagios oder Icinga hinzufügen.
Sebix

Antworten:

18

Ihr Befehl würde nun eine http-Anfrage wie GET index.phpzum Beispiel erwarten . Verwenden Sie dies stattdessen:

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: gibt nur keine Eingabe gefolgt von eof, so dass openssl nach dem Verbinden beendet wird.
    • openssl ...: der Befehl aus Ihrer Frage
    • 2>/dev/null: Fehlerausgabe wird ignoriert.
  • openssl x509: Aktiviert die X.509-Zertifikatdatenverwaltung.
    • Dies wird standardmäßig von der Standardeingabe gelesen
    • -noout: Unterdrückt die gesamte Zertifikatausgabe
    • -checkend 0: Überprüfen Sie, ob das Zertifikat in den nächsten 0 Sekunden abgelaufen ist
Chaos
quelle
-checkendso viel einfacher als das Skript, das ich für Datumsberechnung befunden hatte!
Auspex
7

Sie erhalten das Zertifikat, es wird jedoch nicht dekodiert. Da dies erforderlich wäre, wenn Sie das Datum wünschen, wird es nicht angezeigt. Also müssen Sie es in die OpenSSL- x509Anwendung leiten, um das Zertifikat zu dekodieren:

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

Auf diese Weise erhalten Sie das vollständig dekodierte Zertifikat auf stdout, einschließlich der Gültigkeitsdauer.

Wouter Verhelst
quelle
3

Wenn Sie das Ablaufdatum überprüfen müssen, haben Sie dank dieses Blogposts eine Möglichkeit gefunden, diese Informationen mit anderen relevanten Informationen mit einem einzigen Anruf zu finden:

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

Die Ausgabe umfasst den Aussteller, den Betreff (für den das Zertifikat ausgestellt wurde), das Ausstellungsdatum und das endgültige Ablaufdatum :

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
quelle