script para verificar se o certificado SSL é válido

14

Eu tenho vários certificados SSL e gostaria de ser notificado quando um certificado expirar.

Minha idéia é criar um cronjob, que executa um comando simples todos os dias.

Eu sei que o opensslcomando no Linux pode ser usado para exibir as informações de certificado do servidor remoto, ou seja:

openssl s_client -connect www.google.com:443

Mas não vejo a data de validade nesta saída. Além disso, eu tenho que terminar este comando com CTRL+ c.

Como posso verificar a expiração de um certificado remoto de um script (de preferência usando openssl) e fazê-lo no "modo de lote" para que seja executado automaticamente sem a interação do usuário?

Martin Vegter
fonte
4
Eu recomendaria para enviar também o nome do servidor com -servername www.google.coma SNI servidores habilitados Para evitar a necessidade de rescisão send / dev / null a ele< /dev/null
syss
Se você estiver executando o Red Hat / CentOS / Fedora, dê uma olhada no certmonger . Também está disponível nos repositórios padrão.
JRFerguson
Eu adicionaria a verificação do certificado em uma ferramenta de monitoramento como nagios ou icinga.
sebix

Respostas:

18

Seu comando agora esperaria uma solicitação http, como GET index.phppor exemplo. Use isso:

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: não fornecerá nenhuma entrada seguida por eof, para que o openssl saia após a conexão.
    • openssl ...: o comando da sua pergunta
    • 2>/dev/null: erro de saída será ignorado.
  • openssl x509: ativa o gerenciamento de dados de certificado X.509.
    • Isso lerá da entrada padrão por padrão
    • -noout: Suprime toda a saída do certificado
    • -checkend 0: verifique se o certificado expirou nos próximos 0 segundos
caos
fonte
-checkendmuito mais fácil do que o script que eu achava que estava fazendo aritmética de datas!
Auspex
7

Ele recebe o certificado, mas não o decodifica. Como isso seria necessário se você quiser a data, não a vê. Então, o que é necessário é que você o introduza no x509aplicativo OpenSSL para decodificar o certificado:

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

Isso fornecerá o certificado decodificado completo no stdout, incluindo suas datas de validade.

Wouter Verhelst
fonte
3

Se você precisar verificar a data de validade, graças a esta postagem no blog , encontrou uma maneira de encontrar essas informações com outras informações relevantes com uma única chamada:

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

A saída inclui emissor, sujeito (para quem o certificado é emitido), data de emissão e finalmente data de vencimento :

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
fonte