script para verificar se o certificado SSL é válido

12

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

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

Eu sei que o comando openssl no Linux pode ser usado para exibir as informações de certificado do servidor remoto, por exemplo:

openssl s_client -connect www.google.com:443

Mas não vejo a data de vencimento 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 em "modo de lote" para que ele seja executado automaticamente sem interação do usuário?

    
por Martin Vegter 09.10.2015 / 11:26

3 respostas

12

Seu comando agora esperaria uma solicitação http, como GET index.php , por exemplo. Use isso em vez disso:

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 : apenas não fornecerá entrada seguida de eof, de modo que o openssl saia após a conexão.
    • openssl ... : o comando da sua pergunta
    • 2>/dev/null : a saída do erro será ignorada.
  • openssl x509 : ativa o Gerenciamento de dados de certificado X.509.
    • Isso lerá a entrada padrão padrão
    • -noout : Suprime toda a saída do certificado
    • -checkend 0 : verifique se o certificado expirou nos próximos 0 segundos
por 09.10.2015 / 11:48
7

Você recebe o certificado, mas não o decodifica. Desde que isso seria necessário se você quiser a data, você não a vê. Então, o que você precisa é canalizá-lo para o aplicativo x509 do 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 completo decodificado no stdout, incluindo suas datas de validade.

    
por 09.10.2015 / 11:41
2

Se você precisar conferir a data de validade, graças a essa 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, assunto (para quem o certificado é emitido), data de emissão e, finalmente, data de expiração :

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
    
por 10.02.2018 / 16:50