Respuestas:
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 expirado o no, o si lo hará dentro de un cierto período de tiempo, sin tener que analizar la fecha anterior.
Si solo desea saber si el certificado ha expirado (o lo hará dentro de los próximos N segundos), la -checkend <seconds>
opción 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 usted mismo.
openssl
devolverá un código de salida de 0
(cero) si el certificado no ha expirado y no lo hará durante los siguientes 86400 segundos, en el ejemplo anterior. Si el certificado habrá expirado 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, supone que la hora / fecha está configurada correctamente)
-noout
opción de ver un mensaje útil utilizando un solo comando sin lógica adicional. Por ejemplo, openssl x509 -checkend 0 -in file.pem
dará el resultado "El certificado caducará" o "El certificado no caducará", indicando si el certificado caducará en cero segundos.
Aquí está mi línea de comando bash para enumerar varios certificados en orden de vencimiento, el último que expiró 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
0 7 * * 1 /path/to/cert.sh | mail -s "certbot" my@email.com
Aquí hay una función bash que verifica todos sus servidores, suponiendo que esté usando DNS round-robin. Tenga en cuenta que esto requiere una fecha 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 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 deberá tener el nombre de la zona horaria eliminado del final. Agregue un adicional cut
al final de la tubería para hacer esto:| cut -d ' ' -f 1-4
Una línea verificando verdadero / falso si el certificado de dominio expirará en algún momento más tarde (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
Para MAC OSX (El Capitan) 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 gustaban las banderas --date=
o --iso-8601
en mi sistema.
.cer
tuvieras certificados que acabas de hacer y descargar del sitio Apple Dev?
Igual que la respuesta aceptada, pero tenga en cuenta que funciona incluso con el .crt
archivo y no solo con el .pem
archivo, por si acaso no puede encontrar .pem
la ubicación del archivo.
openssl x509 -enddate -noout -in e71c8ea7fa97ad6c.crt
Resultado:
notAfter=Mar 29 06:15:00 2020 GMT
-startdate
y-enddate
incorporadas en lax509
utilidad. Te salvarán elgrep
.