bash - valid - ¿Cómo determinar la fecha de vencimiento del certificado SSL de un certificado codificado PEM?
openssl check if certificate is valid (7)
Aquí está mi línea de comando de bash para enumerar varios certificados en orden de caducidad, la más reciente caducó primero.
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
Salida de muestra:
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
Si tengo el archivo real y un shell Bash en Mac o Linux, ¿cómo puedo consultar el archivo cert para saber cuándo caducará? No es un sitio web, sino el archivo de certificado en sí mismo, asumiendo que tengo los archivos csr, key, pem y chain.
Aquí hay una función de bash que verifica todos sus servidores, asumiendo que está usando DNS round-robin. Tenga en cuenta que esto requiere la fecha de GNU y no funcionará en 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
}
Ejemplo de salida:
$ check_certs .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 Capitán) Esta modificación del ejemplo de Nicholas me funcionó.
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
Salida de muestra:
2014-12-19: /path/to/certs/MDM_Certificate.pem
2015-11-13: /path/to/certs/MDM_AirWatch_Certificate.pem
A macOS no le --date=
las --date=
o --iso-8601
en mi sistema.
Si (por alguna razón) desea usar una aplicación GUI en Linux, use gcr-viewer
(en la mayoría de las distribuciones está instalado por el paquete gcr
(de lo contrario, en el paquete gcr-viewer
))
gcr-viewer file.pem
# or
gcr-viewer file.crt
Si solo desea saber si el certificado ha caducado (o lo hará en los próximos N segundos), la -checkend <seconds>
a openssl x509
le indicará:
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
Esto ahorra tener que hacer comparaciones de fecha / hora a ti mismo.
openssl
devolverá un código de salida de 0
(cero) si el certificado no ha caducado y no lo hará durante los siguientes 86400 segundos, en el ejemplo anterior. Si el certificado ha caducado o ya lo ha hecho, o algún otro error como un archivo no válido / inexistente, el código de retorno es 1
.
(Por supuesto, asume que la hora / fecha está configurada correctamente)
Una línea marcando verdadero / falso si el certificado expiró algún tiempo después (por ejemplo, 15 días):
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
Con openssl
:
openssl x509 -enddate -noout -in file.pem
La salida está en el formulario:
notAfter=Nov 3 22:23:50 2014 GMT
También vea la respuesta de MikeW sobre cómo verificar fácilmente si el certificado ha caducado o no, o si lo hará dentro de un cierto período de tiempo, sin tener que analizar la fecha anterior.