Respostas:
Com openssl
:
openssl x509 -enddate -noout -in file.pem
A saída está no formulário:
notAfter=Nov 3 22:23:50 2014 GMT
Consulte também a resposta do MikeW para saber como verificar facilmente se o certificado expirou ou não, ou se dentro de um determinado período de tempo, sem precisar analisar a data acima.
Se você quiser apenas saber se o certificado expirou (ou o fará nos próximos N segundos), a -checkend <seconds>
opção para openssl x509
informar:
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
Isso economiza a necessidade de fazer comparações de data / hora.
openssl
retornará um código de saída de 0
(zero) se o certificado não tiver expirado e não o fará pelos próximos 86400 segundos, no exemplo acima. Se o certificado expirou ou já o fez - ou algum outro erro como um arquivo inválido / inexistente - o código de retorno é 1
.
(Obviamente, assume que a hora / data está definida corretamente)
-noout
opção de ver uma mensagem útil usando um único comando sem lógica extra. Por exemplo, openssl x509 -checkend 0 -in file.pem
fornecerá a saída "O certificado expirará" ou "O certificado não expirará" indicando se o certificado expirará em zero segundos.
Aqui está minha linha de comando do bash para listar vários certificados em ordem de vencimento, vencendo mais recentemente 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 de 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
0 7 * * 1 /path/to/cert.sh | mail -s "certbot" my@email.com
Aqui está uma função bash que verifica todos os seus servidores, supondo que você esteja usando o round-robin do DNS. Observe que isso requer data GNU e não 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
expiry_date
valor precisará ter o nome do fuso horário removido do final dele. Adicione um adicional cut
ao final do pipe para fazer isso:| cut -d ' ' -f 1-4
Uma linha verificando verdadeiro / falso se o certificado do domínio expirará algum tempo depois (ex. 15 dias):
if openssl x509 -checkend $(( 24*3600*15 )) -noout -in <(openssl s_client -showcerts -connect may.domain.com:443 </dev/null 2>/dev/null | openssl x509 -outform PEM)
then
echo 'good'
else
echo 'bad'
fi
Para MAC OSX (El Capitan) Essa 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 de amostra:
2014-12-19: /path/to/certs/MDM_Certificate.pem
2015-11-13: /path/to/certs/MDM_AirWatch_Certificate.pem
O macOS não gostou das bandeiras --date=
ou --iso-8601
no meu sistema.
.cer
alguns documentos que acabou de criar e fazer download no site Apple Dev?
O mesmo que a resposta aceita, mas observe que ele funciona mesmo com o .crt
arquivo e não apenas com o .pem
arquivo, caso você não consiga encontrar .pem
o local do arquivo.
openssl x509 -enddate -noout -in e71c8ea7fa97ad6c.crt
Resultado:
notAfter=Mar 29 06:15:00 2020 GMT
-startdate
e-enddate
incorporadas aox509
utilitário. Eles vão te salvargrep
.