Instalar y renovar un certificado de Let's Encrypt en Nginx

Publicado por pico.dev el , actualizado el .
blog-stack planeta-codigo seguridad software software-libre
Comentarios

Let’s Encrypt es una entidad que emite certificados TLS/SSL que son reconocidos como de confianza por los navegadores web. Usando esta entidad de certificación es posible obtener y renovar un certificado TLS/SSL de forma automatizada, rápida y sin coste alguno.

Let's Encrypt

Google ha anunciado que su buscador va a considerar el uso del protocolo seguro HTTPS como un criterio de SEO y posicionamiento en la lista de resultados, posicionando mejor aquellas páginas web que usen el protocolo seguro. Además, el navegador Chrome va a advertir al usuario para algunas páginas que usen solo HTTP que esas páginas son inseguras. Por estos motivos y para mayor seguridad y privacidad del usuario es conveniente usar el protocolo seguro HTTPS.

El mayor inconveniente de usar el protocolo seguro HTTPS es que es necesario un certificado firmado por una autoridad de confianza instalada en el navegador del usuario. Hasta ahora había que comprar el certificado que puede llegar a tener un coste de más de 100€, instalarlo en el servidor y renovarlo antes de su fecha de expiración. Tareas quizá manuales por tanto tediosas y propensas a que surjan errores o se nos olvide hacer la renovación del certificado sobre todo si son múltiples los certificados a gestionar.

Para mejorar la seguridad en la web y facilitar la administración de certificados hace un tiempo se creó una entidad Let’s Encrypt asociado a la Linux Foundation con la que es posible automatizar la obtención y renovación de un certificado TLS/SSL firmado por una autoridad de confianza para los navegadores. Además Let’s Encrypt permite obtener un certificado sin ningún coste, de forma gratuita.

Los pasos para usar en un servidor web un certificado de Let’s Encrypt son los siguientes. Primero hay que instalar el paquete certbot según la distribución de GNU/Linux, en Arch Linux:

En el proceso de obtención del certificado demostraremos que somos los propietarios del sitio web a certificar. Usando nginx como servidor web, iniciado y el dominio a certificar con la opción -d se usa el siguiente comando:

El certificado obtenido tiene una fecha de expiración de únicamente tres meses periodo antes del cual hay que renovarlo. Para hacer la renovación hay que usar el comando:

La renovación del certificado se realiza cuando queda poco tiempo para que expire, unos 30 días, el siguiente comando permite comprobar antes si la configuración es correcta para realizar la renovación.

La clave privada y certificado que Let’s Encrypt genera una vez el dominio se ha validado se ubican en el directorio /etc/letsencrypt/live/ con una carpeta por cada dominio. También se puede ver desde la linea de comandos los certificados existentes y sus fechas de expiración.

Dado el relativo poco tiempo de validez de los certificados es recomendable automatizar la renovación empleando una expresión cron. La utilidad certbot solo hace la renovación del certificado cuando queda menos de un més para su expiración aunque se programe su ejecución en este caso cada 6 horas y en un minuto aleatorio que Let’s Encrypt recomienda para que todos los usuarios no programen sus renovaciones al mismo tiempo:

Una vez que se ha renovado el certificado hay que reiniciar el servidor web para que lo utilice y para ello está el parámetro –renew-hook que ejecuta un comando cuando se produce una renovación. En el ejemplo anterior está el comando para reiniciar el servicio de nginx con el sistema gestión de procesos de systemd.

Let’s Encrypt con certbot comprueba si somos el propietario de un sitio web instalando en el servidor web un archivo que posteriormente antes de generar el certificado lo valida. Este archivo para nginx se ubica en el directorio /usr/share/nginx/html/.well-known/acme-challenge/ y ha de estar accesible desde internet con el protocolo HTTP en la dirección /.well-known/acme-challenge/ del servidor web.

La siguiente configuración del servidor web nginx redirige todo el tráfico usando el procotolo HTTPS excepto el contenido del directorio /.well-known/acme-challenge/ que queda accesible por HTTP.

Y este es el resultado al acceder con el navegador al sitio web que tengo instalado en una Raspberry Pi accesible desde internet con un dominio de FreeDNS:

Sitio web con certificado de Let's Encrypt

En la documentación del proyecto de Let’s Encrypt hay explicaciones más detalladas sobre como funciona, límites de uso, como usarlo y varias guías según el servidor web y distribución GNU/Linux.