Ich hatte die gleiche Ausgabe und schrieb diese ... Es ist schnell und schmutzig, sollte aber funktionieren. Alle Zertifikate, die noch nicht gültig sind oder in den nächsten 90 Tagen verfallen, werden protokolliert (und beim Debuggen auf dem Bildschirm gedruckt). Könnte einige Bugs enthalten, kann aber jederzeit aufgeräumt werden.
#!/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
Bei Verwendung unter OS X wird der date
Befehl möglicherweise nicht ordnungsgemäß ausgeführt. Dies liegt an den Unterschieden in der Unix- und Linux-Version dieses Dienstprogramms. Der verknüpfte Beitrag verfügt über Optionen, mit denen diese Funktion ausgeführt werden kann.
-servername
Argument, wie folgt aus :openssl s_client -servername example.com -connect example.com:443
Führen Sie einfach den folgenden Befehl aus, und das Ablaufdatum wird angezeigt:
Mit diesem Befehl können Sie eine Batchdatei erstellen, um diese Informationen für mehrere Remoteserver zu erfassen.
quelle
-servername
Argument verwenden:openssl s_client -servername google.com.br -connect google.com.br:443
Unten ist mein Skript, das zur Kontrolle in Nagios. Es stellt eine Verbindung zu einem bestimmten Host her und überprüft, ob das Zertifikat innerhalb eines mit den Optionen -c / -w festgelegten Schwellenwerts gültig ist. Es kann überprüfen, ob der CN des Zertifikats mit dem von Ihnen erwarteten Namen übereinstimmt.
Sie benötigen die Python-OpenSSL-Bibliothek, und ich habe alle Tests mit Python 2.7 durchgeführt.
Es wäre trivial, wenn ein Shell-Skript dies mehrmals aufruft. Das Skript gibt die Standard-Nagios-Exit-Werte für den Status Kritisch / Warnung / OK zurück.
So kann eine einfache Überprüfung des Google-Zertifikats durchgeführt werden.
check_ssl_certificate
quelle
get_pem
Stellen Sie eine Verbindung zu host: port her, extrahieren Sie das Zertifikat mit sed und schreiben Sie es in /tmp/host.port.pem.
get_expiration_date
Lesen Sie die angegebene pem-Datei und werten Sie den notAfter-Schlüssel als Bash-Variable aus. Drucken Sie dann den Dateinamen und das Datum, an dem er in einem bestimmten Gebietsschema abläuft.
get_pem_expiration_dates
Iterieren Sie eine Eingabedatei und führen Sie die obigen Funktionen aus.
check.pems.sh
Beispielausgabe
Und um Ihre Frage zu beantworten:
quelle
-servername
Argumentopenssl s_client -servername example.com -connect example.com:443
Hier ist eine einzeilige Version der akzeptierten Antwort, die nur die verbleibende Anzahl von Tagen ausgibt:
( 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 )) )
Beispiel mit www.github.com:
quelle
( ... )
Syntax der Subshell ist möglicherweise spezifisch für Bash. Ich vermute, Sie verwenden eine andere Shell?Geben Sie eine Liste der Hostnamen mit Port 443 im Format Hostname: Port in der Datei an und geben Sie sie als Dateinamen an.
! / bin / bash
Dateiname = / root / kns / certs
date1 = $ (date | cut -d "" -f2,3,6)
currentDate = $ (Datum -d "$ date1" + "% Y% m% d")
während read -r line do
dcert = $ (echo | openssl s_client -servername $ line -connect $ line 2> / dev / null | openssl x509 -noout -dates | grep notAfter | cut -d = -f2)
Echo-Hostname: $ line endDate = $ (Datum -d "$ dcert" + "% Y% m% d")
d1 = $ (Datum -d "$ endDate" +% s) d2 = $ (Datum -d "$ currentDate" +% s) Echo Hostname: $ line - verbleibende Tage $ (((d1 - d2) / 86400))
echo $ dcert done <"$ filename"
quelle