script pour vérifier si le certificat SSL est valide

14

J'ai plusieurs certificats SSL et je voudrais être averti lorsqu'un certificat a expiré.

Mon idée est de créer un cronjob, qui exécute une commande simple tous les jours.

Je sais que la opensslcommande sous Linux peut être utilisée pour afficher les informations de certificat du serveur distant, c'est-à-dire:

openssl s_client -connect www.google.com:443

Mais je ne vois pas la date d'expiration dans cette sortie. De plus, je dois terminer cette commande avec CTRL+ c.

Comment puis-je vérifier l'expiration d'un certificat distant à partir d'un script (en utilisant de préférence openssl) et le faire en "mode batch" afin qu'il s'exécute automatiquement sans interaction avec l'utilisateur?

Martin Vegter
la source
4
Je recommanderais également d'envoyer le nom -servername www.google.comdu serveur avec pour les serveurs compatibles SNI Pour éviter la nécessité d'une terminaison, envoyez / dev / null à lui< /dev/null
syss
Si vous utilisez Red Hat / CentOS / Fedora, jetez un œil à certmonger . Il est également disponible dans les référentiels standard.
JRFerguson
J'ajouterais la vérification du certificat dans un outil de surveillance comme nagios ou icinga.
sebix

Réponses:

18

Votre commande attendrait maintenant une requête http comme GET index.phppar exemple. Utilisez-le à la place:

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: ne donnera juste aucune entrée suivie de eof, de sorte que openssl se ferme après la connexion.
    • openssl ...: la commande de votre question
    • 2>/dev/null: la sortie d'erreur sera ignorée.
  • openssl x509: active la gestion des données de certificats X.509.
    • Cela lira par défaut l'entrée standard
    • -noout: Supprime toute la sortie du certificat
    • -checkend 0: vérifier si le certificat a expiré dans les 0 secondes suivantes
le chaos
la source
-checkendtellement plus facile que le script que j'avais trouvé qui faisait de l'arithmétique des dates!
Auspex
7

Il vous obtient le certificat, mais il ne le décode pas. Puisque cela serait nécessaire si vous voulez la date, vous ne la voyez pas. Donc, ce qu'il faut, c'est que vous le canalisiez dans l' x509application d' OpenSSL pour décoder le certificat:

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

Cela vous donnera le certificat décodé complet sur stdout, y compris ses dates de validité.

Wouter Verhelst
la source
3

Si vous devez vérifier la date d'expiration, grâce à cet article de blog , vous avez trouvé un moyen de trouver ces informations avec d'autres informations pertinentes en un seul appel:

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

La sortie comprend l'émetteur, le sujet (à qui le certificat est délivré), la date d'émission et enfin la date d'expiration :

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
la source