script per verificare se il certificato SSL è valido


14

Ho diversi certificati SSL e vorrei essere avvisato quando un certificato è scaduto.

La mia idea è quella di creare un cronjob, che esegue un semplice comando ogni giorno.

So che il opensslcomando in Linux può essere utilizzato per visualizzare le informazioni sul certificato del server remoto, ovvero:

openssl s_client -connect www.google.com:443

Ma non vedo la data di scadenza in questo output. Inoltre, devo terminare questo comando con CTRL+ c.

Come posso verificare la scadenza di un certificato remoto da uno script (preferibilmente usando openssl) e farlo in "modalità batch" in modo che venga eseguito automaticamente senza l'interazione dell'utente?


4
Vorrei raccomandare di inviare anche il nomeserver con -servername www.google.comper i server abilitati SNI Per evitare la necessità di terminare inviare / dev / null ad esso< /dev/null
syss

Se usi Red Hat / CentOS / Fedora, dai un'occhiata a Certmonger . È disponibile anche dai repository standard.
JRFerguson,

Aggiungerei il controllo del certificato in uno strumento di monitoraggio come nagios o icinga.
Sebix,

Risposte:


18

Il tuo comando si aspetterebbe ora una richiesta http come GET index.phpad esempio. Usa questo invece:

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: non darà alcun input seguito da eof, in modo che openssl esca dopo la connessione.
    • openssl ...: il comando dalla tua domanda
    • 2>/dev/null: l'output dell'errore verrà ignorato.
  • openssl x509: attiva la gestione dei dati del certificato X.509.
    • Questo verrà letto per impostazione predefinita dall'input standard
    • -noout: Elimina l'intero output del certificato
    • -checkend 0: verifica se il certificato è scaduto nei prossimi 0 secondi

-checkendmolto più facile della sceneggiatura che avevo scoperto che stava facendo l'aritmetica della data!
Auspex,

7

Ti ottiene il certificato, ma non lo decodifica. Dal momento che sarebbe necessario se si desidera la data, non la vedi. Quindi ciò che serve è che lo installi nell'applicazione OpenSSL x509per decodificare il certificato:

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

Questo ti darà il certificato completo decodificato su stdout, comprese le date di validità.


3

Se devi controllare la data di scadenza, grazie a questo post sul blog , hai trovato un modo per trovare queste informazioni con altre informazioni rilevanti con una sola chiamata:

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

L'output include l'emittente, il soggetto (a cui viene rilasciato il certificato), la data di emissione e infine la data di scadenza :

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.