J'ai eu le même problème et j'ai écrit ceci ... C'est rapide et sale, mais ça devrait marcher. Il enregistrera (et imprimera à l'écran avec le débogage activé) tous les certificats qui ne sont pas encore valides ou expirent dans les 90 prochains jours. Peut contenir des bugs, mais n'hésitez pas à le ranger.
#!/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
Si vous utilisez sous OS X, vous pouvez constater que la date
commande ne fonctionne pas correctement. Cela est dû aux différences entre les versions Unix et Linux de cet utilitaire. Le message lié a des options pour que cela fonctionne.
-servername
argument, comme ceci:openssl s_client -servername example.com -connect example.com:443
Exécutez simplement la commande ci-dessous et elle fournira la date d'expiration:
Vous pouvez utiliser cette commande dans un fichier de commandes pour collecter ces informations pour des serveurs plus distants.
la source
-servername
argument, comme ceci:openssl s_client -servername google.com.br -connect google.com.br:443
Ci-dessous est mon script qui sert de chèque dans les nagios. Il se connecte à un hôte spécifique, il vérifie que le certificat est valide dans un seuil défini par les options -c / -w. Il peut vérifier que le CN du certificat correspond au nom que vous attendez.
Vous avez besoin de la bibliothèque python openssl, et j'ai fait tous les tests avec python 2.7.
Il serait trivial qu'un script shell l'appelle plusieurs fois. Le script renvoie les valeurs de sortie nagios standard pour l'état critique / avertissement / ok.
Une simple vérification du certificat de Google peut être effectuée comme ceci.
check_ssl_certificate
la source
get_pem
Connectez-vous à host: port, extrayez le certificat avec sed et écrivez-le dans /tmp/host.port.pem.
get_expiration_date
Lisez le fichier pem donné et évaluez la clé notAfter en tant que variable bash. Imprimez ensuite le nom du fichier et la date à laquelle il expire dans un environnement local donné.
get_pem_expiration_dates
Itérer un fichier d'entrée et exécuter les fonctions ci-dessus.
check.pems.sh
exemple de sortie
Et pour répondre à votre question:
la source
-servername
argument, comme ceci:openssl s_client -servername example.com -connect example.com:443
Voici une version à une ligne de la réponse acceptée, qui affiche simplement le nombre de jours restant:
( 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 )) )
Exemple avec www.github.com:
la source
( ... )
syntaxe du sous - shell peut être spécifique à Bash; Je suppose que vous utilisez un autre shell?Donnez la liste des noms d'hôtes avec le port 443 au format nom d'hôte: port dans le fichier et donnez-le comme nom de fichier.
! / bin / bash
nom de fichier = / root / kns / certs
date1 = $ (date | cut -d "" -f2,3,6)
currentDate = $ (date -d "$ date1" + "% Y% m% d")
tandis que la ligne de lecture -r fait
dcert = $ (echo | openssl s_client -servername $ line -connect $ line 2> / dev / null | openssl x509 -noout -dates | grep notAfter | cut -d = -f2)
echo Nom d'hôte: $ line endDate = $ (date -d "$ dcert" + "% Y% m% d")
d1 = $ (date -d "$ endDate" +% s) d2 = $ (date -d "$ currentDate" +% s) echo Hostname: $ line - Days Remaining $ ((((d1 - d2) / 86400))
echo $ dcert done <"$ filename"
la source