Certificado SSL gratuito con Let’s Encrypt y nginx

Llevo tiempo siguiendo la pista a Let’s Encrypt. Se trata de un proyecto para generar certificados SSL de forma gratuita y segura para dominios de Internet. Desde hace unos meses ya es posible generar certificados con su herramienta y utilizarlos en nuestras aplicaciones web o servidores de correo. Yo ya tengo el mío funcionando en rubenhernandez.es, os explico paso a paso cómo instalarlo en Debian con nginx en un Olinuxino A10.

Prerrequisitos

Necesitaremos tener git instalado. Lo instalamos si no lo tenemos ya:

Clonamos la herramienta de letsencrypt en un directorio accesible y conocido, por ejemplo /opt/letsencrypt:

Iniciamos por primera vez la aplicación para que termine de instalar dependencias (algunos paquetes de python, tardará un rato):

Letsencrypt necesitará acceder a nuestro servidor web para leer el token generado por la herramienta, la URL a la que intentará acceder es dominio.com/.well-known/acme-challenge/, crearemos la entrada en nginx para que permita el acceso. Teniendo en cuenta que nuestro servidor web tiene el directorio root en /var/www:

Editaremos después la configuración de nginx: sudo nano /etc/nginx/sites-enabled/default (o la que corresponda a nuestro servidor). Añadiremos el location allí donde corresponda a nuestra configuración:

con ello, reiniciamos nginx para aplicar cambios:

Generando el certificado

Una vez tenemos todo preparado, basta con que creemos un archivo de configuración. Podemos organizarlo como queramos, yo por ejemplo lo he creado en /etc/letsencrypt/configs/www.dominio.com.conf, habrá que crear el directorio configs primero:

Copiamos y pegamos el texto que tenemos a continuación y modificamos conforme a nuestro requerimiento las líneas resaltadas:

Guardamos el .conf y ya estamos listos para generar nuestro certificado (tardará un poco):

Los certificados quedarán almacenados en /etc/letsencrypt/live/(www.)dominio.com/, se creará un directorio por cada subdominio. Dentro del directorio encontraremos, entre otros, los archivos fullchain.pem y privkey.pem, nos quedamos con la copla de dónde están ubicados.

Indicando a nginx que utilice los certificados y redirigiendo el tráfico a https

Ahora editaremos el fichero de configuración de nginx: sudo nano /etc/nginx/sites-enabled/default para que utilice los certificados generados. Creamos, si no lo tenemos ya, un server que escuche en el 443 y que tenga el ssl activado. Copiaremos y pegaremos el contenido del server que escucha en el 80 para que nuestra configuración funcione igual que antes en el sitio de los (…):

Si queremos que funcione para todo el tráfico, ya sea www o no www deberemos crear otro apartado “server” con la configuración sin www. Recuerda que los certificados serán diferentes y estarán ubicados en otro directorio.

Una buena idea es que nginx redireccione directamente el tráfico http hacia https, para ello modificaremos el “server” que escucha en el 80:

Hará una redirección 301 (permanente) a todo el tráfico http para que se dirija al https. Reiniciamos nginx y ya tenemos nuestro servidor web con http seguro funcionando:

certificado

Renovando el certificado

Uno de los detalles que podemos observar es que letsencrypt genera el certificado para 3 meses. Para no tener que estar pendiente con la renovación, podemos hacer un pequeño script para correr en cron cada mes, por ejemplo.

Hacemos el script ejecutable y editamos el crontab:

La línea a añadir en el cron es:

Con ello, todos los días 10 de cada mes a las 2:25, cron renovará los certificados.