Tuve el mismo problema y escribí esto ... Es rápido y sucio, pero debería funcionar. Registrará (e imprimirá en la pantalla con depuración) cualquier certificado que aún no sea válido o que caduque en los próximos 90 días. Puede contener algunos errores, pero no dude en arreglarlo.
#!/bin/sh
DEBUG=false
warning_days=90 # Number of days to warn about soon-to-expire certs
certs_to_check='serverA.test.co.uk:443
serverB.test.co.uk:8140
serverC.test.co.uk:443'
for CERT in $certs_to_check
do
$DEBUG && echo "Checking cert: [$CERT]"
output=$(echo | openssl s_client -connect ${CERT} 2>/dev/null |\
sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' |\
openssl x509 -noout -subject -dates 2>/dev/null)
if [ "$?" -ne 0 ]; then
$DEBUG && echo "Error connecting to host for cert [$CERT]"
logger -p local6.warn "Error connecting to host for cert [$CERT]"
continue
fi
start_date=$(echo $output | sed 's/.*notBefore=\(.*\).*not.*/\1/g')
end_date=$(echo $output | sed 's/.*notAfter=\(.*\)$/\1/g')
start_epoch=$(date +%s -d "$start_date")
end_epoch=$(date +%s -d "$end_date")
epoch_now=$(date +%s)
if [ "$start_epoch" -gt "$epoch_now" ]; then
$DEBUG && echo "Certificate for [$CERT] is not yet valid"
logger -p local6.warn "Certificate for $CERT is not yet valid"
fi
seconds_to_expire=$(($end_epoch - $epoch_now))
days_to_expire=$(($seconds_to_expire / 86400))
$DEBUG && echo "Days to expiry: ($days_to_expire)"
warning_seconds=$((86400 * $warning_days))
if [ "$seconds_to_expire" -lt "$warning_seconds" ]; then
$DEBUG && echo "Cert [$CERT] is soon to expire ($seconds_to_expire seconds)"
logger -p local6.warn "cert [$CERT] is soon to expire ($seconds_to_expire seconds)"
fi
done
Si se usa en OS X, es posible que el date
comando no funcione correctamente. Esto se debe a las diferencias en la versión Unix y Linux de esta utilidad. La publicación vinculada tiene opciones para hacer que esto funcione.
-servername
argumento, de esta manera:openssl s_client -servername example.com -connect example.com:443
Simplemente ejecute el comando a continuación y proporcionará la fecha de vencimiento:
Puede usar este comando en un archivo por lotes para recopilar esta información para más servidores remotos.
fuente
-servername
argumento, de esta manera:openssl s_client -servername google.com.br -connect google.com.br:443
A continuación se muestra mi script que como un cheque dentro de nagios. Se conecta a un host específico, verifica que el certificado sea válido dentro de un umbral establecido por las opciones -c / -w. Puede verificar que el CN del certificado coincida con el nombre que espera.
Necesita la biblioteca python openssl, e hice todas las pruebas con python 2.7.
Sería trivial que un script de shell llame a esto varias veces. El script devuelve los valores de salida de nagios estándar para el estado crítico / advertencia / ok.
Una simple verificación del certificado de Google se puede realizar de esta manera.
check_ssl_certificate
fuente
get_pem
Conéctese al host: puerto, extraiga el certificado con sed y escríbalo en /tmp/host.port.pem.
get_expiration_date
Lea el archivo pem dado y evalúe la clave notAfter como una variable bash. Luego imprima el nombre del archivo y la fecha en que caduca en un lugar determinado.
get_pem_expiration_dates
Itere algún archivo de entrada y ejecute las funciones anteriores.
check.pems.sh
salida de muestra
Y para responder a tu pregunta:
fuente
-servername
argumento, de esta manera:openssl s_client -servername example.com -connect example.com:443
Aquí hay una versión de una sola línea de la respuesta aceptada, que solo muestra el número restante de días:
( export DOMAIN=example.com; echo $(( ( $(date +%s -d "$( echo | openssl s_client -servername $DOMAIN -connect $DOMAIN:443 2>/dev/null | openssl x509 -noout -enddate | sed 's/.*notAfter=\(.*\)$/\1/g' )" ) - $(date +%s) ) / 86400 )) )
Ejemplo con www.github.com:
fuente
Proporcione la lista de nombres de host con el puerto 443 en el formato nombre de host: puerto en el archivo y asígnelo como nombre de archivo.
! / bin / bash
filename = / root / kns / certs
fecha1 = $ (fecha | corte -d "" -f2,3,6)
currentDate = $ (fecha -d "$ fecha1" + "% Y% m% d")
mientras lee -r line do
dcert = $ (echo | openssl s_client -servername $ line -connect $ line 2> / dev / null | openssl x509 -noout -dates | grep notAfter | cut -d = -f2)
echo Nombre de host: $ line endDate = $ (fecha -d "$ dcert" + "% Y% m% d")
d1 = $ (fecha -d "$ endDate" +% s) d2 = $ (fecha -d "$ currentDate" +% s) echo Nombre de host: $ línea - Días restantes $ (((d1 - d2) / 86400))
echo $ dcert hecho <"$ nombre de archivo"
fuente