Los certificados SSL tienen un periodo de validez de sólo un año. Si no renuevas tu certificado antes de la fecha límite, tu sitio web quedará inaccesible para los visitantes porque los navegadores lo marcarán como potencialmente vulnerable a amenazas de seguridad.
Los certificados .crt son archivos de seguridad que permiten a los sitios web establecer conexiones seguras con los navegadores. Esto protege la información de los usuarios, como las transacciones con tarjetas de pago, los inicios de sesión y las transferencias de datos.
Los certificados .crt contienen información cifrada, como la clave pública del servidor y la firma digital de la entidad certificadora
El siguiente código que expongo sirve como PLUGIN para NAGIOS, pero se puede adaptar a cualquier situación que se requiera. Por ejemplo, ejecutarlo mediante CRONTAB y enviar un correo de alerta, cuando este por vencer, etc….
Lo he probado en servidores UNIX, LINUX, SOLARIS, AIX… Y funciona como es esperado. Tratare de documentar lo más claro posible. Trate de no utilizar comandos avanzados, ya que estos solo funcionan en algunas plataformas y la idea es que este código funcione en cualquiera. Con esta misma lógica es posible llevarlo para que se ejecute en WINDOWS :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
#!/bin/bash # El script solicita el ingreso de 4 parametros..... OPENSSL_CMD=$1 CERT_PATH=$2 CRITICAL_DAYS=$3 WARNING_DAYS=$4 #Capturo la fecha ACTUAL día mes año..... year=$(expr $(date +%Y)) month=$(expr $(date +%m)) day=$(expr $(date +%d)) # Calculo los días transcurridos desde el ano 2020 al año consultado (años completos) func_diaT(){ anoact=$1 anos_completos=$((anoact - 2020)) dias_anos=$((anos_completos * 365)) for ((a=2020; a<anoact; a++)); do if ((a % 4 == 0)); then if ((a % 100 != 0 || a % 400 == 0)); then ((bisiestos++)) fi fi done dias=$((dias_anos + bisiestos)) echo "$dias" } # Calcula los días transcurridos del año consultado (Los días que lleva en el año)... func_diaV(){ dd_d=$1 mm_m=$2 aa_a=$3 days_in_month=(0 31 28 31 30 31 30 31 31 30 31 30 31) if [ $((aa_a % 4)) -eq 0 ] && { [ $((aa_a % 100)) -ne 0 ] || [ $((aa_a % 400)) -eq 0 ]; }; then days_in_month[2]=29 fi days_passed=0 for ((i=1; i<mm_m; i++)); do days_passed=$((days_passed + days_in_month[i])) done days_passed=$((days_passed + dd_d)) echo "$days_passed" } # Ejecuto las funciones para obtener el total de días desde el año 2020 a la fecha ACTUAL... total_dia="$(func_diaT year)" total_act="$(func_diaV day month year)" # Total de dias trascurridos desde ano 2020 hasta la fecha actual dias_actual=$((total_dia + total_act)) # Obtener la fecha de vencimiento del certificado en el servidor..... fecha=`$OPENSSL_CMD x509 -enddate -noout -in $CERT_PATH | cut -d= -f2` # La fecha la descompongo en dia mes año. El mes viene alfanumérico. dia=$(echo "$fecha" | awk '{print $2}') mes_nombre=$(echo "$fecha" | awk '{print $1}') anio=$(echo "$fecha" | awk '{print $4}') # Convertir el nombre del mes a número...... meses=("Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec") mes=0 for i in "${!meses[@]}"; do if [[ "${meses[i]}" == "$mes_nombre" ]]; then mes=$((i + 1)) break fi done # Ejecuto las funciones para obtener el total de días desde el año 2020 a la fecha VENCIMIENTO... tot_dia_cd="$(func_diaT anio)" days_tra="$(func_diaV dia mes anio)" # Total de días trascurridos desde ano 2020 hasta la fecha VENCIMIENTO dias_venci=$((days_tra + tot_dia_cd)) # Realizo calculo de los días VENCIMIENTO menos Días ACTUAL...... DAYS_LEFT=$((dias_venci - dias_actual)) # Genero las alertas correspondientes para la consola NAGIOS.... if [ $DAYS_LEFT -le 0 ]; then echo "CRITICAL: Certificado EXPIRADO por $DAYS_LEFT dias." exit 2 elif [ $DAYS_LEFT -le $CRITICAL_DAYS ]; then echo "CRITICAL: El certificado expira en $DAYS_LEFT dias." exit 2 elif [ $DAYS_LEFT -le $WARNING_DAYS ]; then echo "WARNING: El certificado expira en $DAYS_LEFT dias." exit 1 else echo "OK: El certificado es válido por $DAYS_LEFT dias." exit 0 fi |
Al ejecutar el SCRIPTS, me solicitara 4 para metros :
1.- Ruta completa del ejecutable «openssl».
2.- Ruta completa del certificado, para este caso archivo .crt.
3.- Días de alerta CRITICAL (para alertar a consola NAGIOS).
4.- Días de alerta WARNING (para alertar a consola NAGIOS).
Su ejecución directa en el servidor, sería mas o menos así (dar permisos de ejecución al SCRIPT) :
1 2 |
$ ./checkcert.sh "/u23/apache/openssl" "/u23/apache/Cert/olimpo.ser.crt" 5 10 OK: El certificado es válido por 53 días. |
El siguiente código funciona en LINUX. Como pueden ver hace lo mismo, pero el código se reduce bastante….
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#!/bin/bash OPENSSL_CMD=$1 CERT_PATH=$2 CRITICAL_DAYS=$3 WARNING_DAYS=$4 fecha1=`date +%Y-%m-%d` vencimiento=`$OPENSSL_CMD x509 -enddate -noout -in $CERT_PATH | cut -d= -f2` fecha2=`date -d "$vencimiento" +"%Y-%m-%d"` DAYS_LEFT=$(( ( $(date -d "$fecha2" +%s) - $(date -d "$fecha1" +%s) ) / 86400 )) if [ $DAYS_LEFT -le 0 ]; then echo "CRITICAL: El certificado VENCIDO por $DAYS_LEFT dias." exit 2 elif [ $DAYS_LEFT -le $CRITICAL_DAYS ]; then echo "CRITICAL: El certificado expira en $DAYS_LEFT dias." exit 2 elif [ $DAYS_LEFT -le $WARNING_DAYS ]; then echo "WARNING: El certificado expira en $DAYS_LEFT dias." exit 1 else echo "OK: El certificado es vádo por $DAYS_LEFT dias." exit 0 fi |