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.
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.
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]}
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
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
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.
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