El artículo Cómo crear tu propia autoridad certificante (CA) explica cómo crear tu propia autoridad certificante para generar y firmar certificados para utilizar con SSL. Aquí presento un script para verificar periodicamente la validez de los certificados x509. La función del script es notificar por correo electrónico cuando un certificado está próximo a expirar, para poder renovarlo con tiempo y no sufrir problemas o interrupciones de los servicios que utilizan SSL (evitar dolores de cabeza).
Las variables que se deben configurar dentro del script son las siguientes:
- REMITENTE: dirección de correo electrónico donde se notificará cuando un certificado esté próximo a expirar
- CERTIFICADOS: nombres de archivo de los certificados. Por ejemplo, si los certificados se encuentran en el directorio
/CA/certs
, se debe especificar/CA/certs/*.crt
- DIAS: cantidad de días de anticipación. Por ejemplo, si se utiliza el valor
30
, el script enviará un mail 30 días antes de que expire un certificado (puede ser menor cantidad de días que el valor ingresado, dependiendo de si el script se ejecuta una vez por día o una vez por semana)
verificar_certificados.sh
:
#!/bin/bash REMITENTE="admin@pepe.com" CERTIFICADOS="/CA/certs/*.crt" DIAS=30 SERVIDOR=$(hostname) ASUNTO="Advertencia: Certificados por expirar en el servidor $SERVIDOR" MAIL="" # verificar todos los certificados for FILE in $CERTIFICADOS do # obtener la fecha de expiración del certificado EXP=$(openssl x509 -enddate -noout -in $FILE) EXP=${EXP:9} EXP=$(date --date="$EXP" +%Y%m%d) # buscar en los próximos $DIAS for (( i=0; i<=$DIAS; i++ )) do # obtener la fecha actual más $i días DATE=$(date --date="+$i days" +%Y%m%d) if [ "$EXP" = "$DATE" ]; then # si la fecha del certificado está dentro de los próximos $DIAS, significa que está próximo a expirar if [ "$i" = "0" ]; then MAIL=$(echo -e "El certificado $FILE expira hoy!\n$MAIL") else MAIL=$(echo -e "El certificado $FILE expira en $i dia(s)\n$MAIL") fi fi done done if [ "${#MAIL}" -gt 0 ]; then # si hay certificados por expirar, enviar notificación por mail MAIL=$(echo -e "Estado de los certificados SSL:\n$MAIL\n") echo -e "$MAIL" | /usr/bin/mail -s "$ASUNTO" $REMITENTE echo "[$(date)]" echo -e "$MAIL" else echo "[$(date)]" echo "Estado de los certificados SSL: Ok" fi
Finalmente es necesario agregar una tarea cron para ejecutar automáticamente el script. Se puede realizar de diferentes formas, por ejemplo editar el crontab
del usuario o el archivo /etc/crontab
, agregar un link simbólico al script dentro del directorio /etc/cron.daily/
o agregar un nuevo archivo de configuración en el directorio /etc/cron.d/
. La forma más sencilla es agregar un link simbólico en el directorio /etc/cron.daily/
(suponiendo que la ruta al script es /home/pepe/scripts/verificar_certificados.sh
):
ln -s /home/pepe/scripts/verificar_certificados.sh /etc/cron.daily/verificar_certificados
De esta forma se ejecutará automáticamente una vez por día a la hora especificada en el archivo /etc/crontab
. No olvidar otorgarle permisos de ejecución al script:
chmod +x verificar_certificados.sh