Hoy me encontré con un problemita interesante. Al intentar ingresar a este sitio, la conexión SSL fallo por estar el certificado de Let's Encrypt expirado. Pero ¿cómo pudo haber expirado si se renueva automáticamente dos veces por día?



Si recuerdan el artículo: Cómo generar un certificado SSL/TLS gratis con certbot, en el final del mismo explicaba cómo agregar un cronjob que corra dos veces al día y se encargue de renovar los certificados, utilizando el subcomando renew.

Esto estaba funcionando correctamente, sin embargo en la primera renovación falló. En realidad no falló la renovación, sino que Nginx siguió trabajando con el certificado original. Sucede que luego de renovar el certificado, es necesario recargar o reiniciar Nginx (Apache o cual sea el servicio que utilice el certificado) para que lea (y comience a utilizar) el nuevo certificado.

Afortunadamente es posible resolver este inconveniente de diferentes formas. La estrategia básica sería recargar Nginx cada vez que corremos certbot-auto renew. Sin embargo, no vamos a querer recargar Nginx dos veces al día si sólo es necesario hacerlo cuando efectivamente se renueva el certificado (es decir, cada tres meses). Afortunadamente certbot-auto cuenta con diferentes disparadores (llamados hooks) para realizar tareas adicionales ante diferentes eventos.

De acuerdo a la documentación de certbot, el subcomando renew incluye hooks para ejecutar comandos o scripts antes (--pre-hook) o después (--post-hook) de intentar renovar los certificados. El problema es que utilizar cualquiera de estos hooks equivale a recargar Nginx cada vez que se corre el cronjob. Para realizar una acción sólo si un certificado ha sido renovado con éxito está disponible el hook --renew-hook.

Recurriendo a este hook, cambiar el comando del cronjob de la siguiente forma:

/root/scripts/certbot-auto renew --quiet --no-self-upgrade --renew-hook "/etc/init.d/nginx reload"

Referencias


Tal vez pueda interesarte


Compartí este artículo y dejá tu comentario