Como determinar a data de validade do certificado SSL a partir de um certificado codificado PEM?

Se tenho o ficheiro actual e uma linha de comandos Bash no Mac ou no Linux, como é que posso consultar o ficheiro cert para saber quando é que vai expirar? Não é um web site, mas na verdade o arquivo de certificado em si, assumindo que eu tenho os arquivos csr, chave, pem e cadeia.

Author: jww, 2014-01-23

6 answers

Com openssl:

openssl x509 -enddate -noout -in file.pem

A saída está no Formulário:

notAfter=Nov  3 22:23:50 2014 GMT

Ver também a resposta de MikeW {[10] } para saber como verificar facilmente se o certificado caducou ou não, ou se expirará dentro de um determinado período de tempo, sem ter de analisar a data acima.

 422
Author: that other guy, 2017-05-23 12:10:06

Se só quiser saber se o certificado expirou (ou irá fazê-lo nos próximos N segundos), a opção -checkend <seconds> para openssl x509 dir-lhe-á:

if openssl x509 -checkend 86400 -noout -in file.pem
then
  echo "Certificate is good for another day!"
else
  echo "Certificate has expired or will do so within 24 hours!"
  echo "(or is invalid/not found)"
fi

Isto poupa ter de fazer comparações de data/hora.

openssl devolverá um código de saída de 0 (zero) se o certificado não tiver expirado e não o fizer nos próximos 86400 segundos. Se o certificado tiver expirado ou já o tiver feito-ou algum outro erro como um ficheiro inválido/inexistente - o retorno o código é 1.

(claro que assume que a hora / data está correcta) {[[8]}

 111
Author: MikeW, 2016-10-06 17:17:31

Aqui está a minha linha de comandos bash para listar vários certificados por ordem de expiração, a mais recente expirar primeiro.

for pem in /etc/ssl/certs/*.pem; do 
   printf '%s: %s\n' \
      "$(date --date="$(openssl x509 -enddate -noout -in "$pem"|cut -d= -f 2)" --iso-8601)" \
      "$pem"
done | sort

Saída da amostra:

2015-12-16: /etc/ssl/certs/Staat_der_Nederlanden_Root_CA.pem
2016-03-22: /etc/ssl/certs/CA_Disig.pem
2016-08-14: /etc/ssl/certs/EBG_Elektronik_Sertifika_Hizmet_S.pem
 9
Author: Nicholas Sushkin, 2017-02-07 23:57:14
Aqui está uma função bash que verifica todos os servidores, assumindo que está a usar o DNS round-robin. Note que isto requer a data GNU e não vai funcionar no Mac OS
function check_certs () {
  if [ -z "$1" ]
  then
    echo "domain name missing"
    exit 1
  fi
  name="$1"
  shift

  now_epoch=$( date +%s )

  dig +noall +answer $name | while read _ _ _ _ ip;
  do
    echo -n "$ip:"
    expiry_date=$( echo | openssl s_client -showcerts -servername $name -connect $ip:443 2>/dev/null | openssl x509 -inform pem -noout -enddate | cut -d "=" -f 2 )
    echo -n " $expiry_date";
    expiry_epoch=$( date -d "$expiry_date" +%s )
    expiry_days="$(( ($expiry_epoch - $now_epoch) / (3600 * 24) ))"
    echo "    $expiry_days days"
  done
}

Exemplo de saída:

$ check_certs stackoverflow.com
151.101.1.69: Aug 14 12:00:00 2019 GMT    603 days
151.101.65.69: Aug 14 12:00:00 2019 GMT    603 days
151.101.129.69: Aug 14 12:00:00 2019 GMT    603 days
151.101.193.69: Aug 14 12:00:00 2019 GMT    603 days
 4
Author: Andrew, 2017-12-19 00:44:42

Para MAC OSX (El Capitan) esta modificação do exemplo de Nicholas funcionou para mim.

for pem in /path/to/certs/*.pem; do
    printf '%s: %s\n' \
        "$(date -jf "%b %e %H:%M:%S %Y %Z" "$(openssl x509 -enddate -noout -in "$pem"|cut -d= -f 2)" +"%Y-%m-%d")" \
    "$pem";
done | sort

Saída Da Amostra:

2014-12-19: /path/to/certs/MDM_Certificate.pem
2015-11-13: /path/to/certs/MDM_AirWatch_Certificate.pem
O MacOS não gostava das bandeiras do meu sistema.
 2
Author: Donald.M, 2017-04-14 01:50:19

Se (por alguma razão) quiser usar uma aplicação GUI no Linux, use gcr-viewer (na maioria das distribuições é instalado pelo pacote gcr (caso contrário no Pacote gcr-viewer))

gcr-viewer file.pem
# or
gcr-viewer file.crt
 0
Author: Attila123, 2018-04-19 15:59:55