Instalación de servidor web con Nginx y Let’s Encrypt en Ubuntu 16.04

Let’s Encrypt es una nueva Autoridad Certificadora (CA) que proporciona de manera sencilla la obtención de certificados TLS/SSL gratuitos permitiendo así HTTPS en servidores web.

Actualmente, todo el proceso de obtención e instalación de un certificado está automatizado sólo en servidores web Apache. Sin embargo, Let’s Encrypt se puede utilizar para obtener un certificado SSL gratuito y luego instalarlo manualmente, independientemente del software del servidor web.

En este tutorial mostraremos como instalar Nginx como servidor web y luego añadiremos un certificado con Let’s Encrypt. Después explicaremos como renovar automáticamente su certificado SSL. Todo este proceso lo realizaremos en un Ubuntu 16.04 bajo root.

Requisitos

Los requisitos para continuar con este tutorial es importante tener primero acceso root en nuestro servidor VPS. También es importante tener un dominio que esté apuntando a los DNS de Clouding. Además, de nuestro dominio tiene que tener un registro tipo A para que el proceso de creación del certificado funcione correctamente.

Si queremos crear un certificado para example.com y www.example.com es necesario tener ambos registros deben estar creados en la configuración del DNS.

Instalación del servidor web Nginx

El primer paso es instalar Nginx:

# apt-get install nginx

Seguidamente lo iniciamos y lo activamos para el arranque:

# systemctl start nginx
# systemctl enable nginx

Configuración Nginx

Ahora configuramos un espacio web, donde tendremos la configuración de nuestra web. Lo primero creamos una copia de la configuración por defecto:

# cd /etc/nginx/sites-available
# cp default example.com

Y editamos el fichero de configuración /etc/nginx/example.com.conf y modificamos el parámetro root:

listen 80;
listen [::]:80;
server_name example.com www.example.com;
root /var/www/html/example.com/www;

Creamos el nuevo directorio:

# mkdir -p /var/www/html/example.com/www

Activamos la web:

# ln -s  /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled

Reiniciamos Nginx para que tenga efecto

# systemctl restart nginx

Instalación de Let’s Encrypt

Lo primero que vamos hacer es instalar el Certbot, que es quien nos va a crear el certificado para luego instalarlo en nuestra página web. Agregamos el repositorio y los actualizamos:

# add-apt-repository ppa:certbot/certbot
# apt-get update

Y luego lo instalamos:

# apt-get install certbot

Una vez instalado, modificamos el fichero de configuración de Nginx para nuestra web, y tenemos que añadir lo siguiente:

location ~ /.well-known {
allow all;
}

Con eso añadido, comprobamos que la configuración del fichero es correcta:

# nginx -t

Y luego reiniciamos:

# systemctl restart nginx

Ahora creamos el certificado con:
# certbot certonly --webroot --webroot-path=/var/www/html/example.com/www -d example.com -d www.example.com

Esta es la salida del comando:

Renewing an existing certificate
Performing the following challenges:
http-01 challenge for example.com
Using the webroot path /var/www/html/example.com/www for all unmatched domains.
Waiting for verification...
Cleaning up challenges
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/example.com/fullchain.pem. Your
cert will expire on 2017-08-28. To obtain a new or tweaked version
of this certificate in the future, simply run certbot again. To
non-interactively renew *all* of your certificates, run "certbot
renew"
- If you like Certbot, please consider supporting our work by:

Configuración de Let’s Encrypt con Nginx

Ahora toca configurar Nginx para que coja el certificado creado por Cerbot y así poder usar los certificados que proporciona Let’s Encrypt. Para ello tenemos que crear varios ficheros de configuración. Crearemos un fichero de configuración en /etc/nginx/snippets con el nombre de nuestro dominio, acabado con .conf y que empiece por ssl, así:

# nano /etc/nginx/snippets/ssl-example.com.conf

Dentro tenemos que poner lo siguiente:

ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

Ahora hay que modificar la configuración del fichero de nuestra web y hay que dejar nuestra configuración de la siguiente manera:

server {
listen 80;
listen [::]:80;
server_name example.com www.example.com
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
listen [::]:443;
#include snippets/snakeoil.conf;
include snippets/ssl-example.com.conf;
...

Una vez hemos modificado el fichero, podemos comprobar la sintaxis:

# nginx -t

Si nos da algún error es importante solucionar el problema antes de seguir con el siguiente paso. Una vez nos aparezca que todo es correcto, reiniciamos el servicio:

# systemctl restart nginx

Y listo, ya podemos acceder a nuestra página web desde HTTPS! 😀

Configurar auto renovación

Los certificados de Let´s Encrypt son válidos por 90 días y se recomienda renovar los certificados cada 60 días para permitir un margen de error. El cliente de Let´s Encrypt tiene un comando de renovación que comprueba automáticamente los certificados instalados e intenta renovarlos si tienen menos de 30 días de la fecha de caducidad. Para no tener que estar atento cada 60 días de la renovación de los certificados este proceso se puede automatizar con cron jobs.

El comando para renovar todos los certificados instalados en el Servidor es el siguiente:

$ sudo letsencrypt renew

Si ejecutas el comando una vez has creado los certificados obtendrás una salida como ésta:

Processing /etc/letsencrypt/renewal/domain.com.conf

The following certs are not due for renewal yet:

/etc/letsencrypt/live/dominio.com/fullchain.pem (skipped)

/etc/letsencrypt/live/domain.com/fullchain.pem (skipped)

No renewals were attempted

Hay que tener en cuenta que si se ha creado un certificado donde se incluyen varios subdominios, sólo se mostrará el nombre del dominio base en la salida, pero la renovación debe ser válida para todos los dominios incluidos en este certificado. Una manera sencilla de garantizar que los certificados no caduquen es crear un trabajo en cron para que periódicamente ejecute el comando de renovación de forma automática.

El comando de renovación comprueba primero la fecha de vencimiento y sólo ejecuta la renovación si el certificado tiene menos de 30 días de expiración. Por lo tanto, es buena idea añadir este comando en cron para que se ejecute cada semana o incluso todos los días.

Para ello lo que haremos será crear un script para que cron lo ejecute:

$ sudo vi /root/letsencrypt-renewal.sh

Dentro de este fichero nuevo tendremos que añadir las siguientes líneas:

#!/bin/bash
# Clouding.io
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
log="/var/log/le-renew.log"
echo "" >> $log
/bin/date >> $log
echo "---------------------------------------------" >> $log
/usr/bin/letsencrypt renew >> $log

Guardamos el fichero y abrimos cron con el siguiente comando:

$ sudo crontab -e

Y añade la siguiente línea al final del documento:

30 2 * * 1 /root/letsencrypt-renewal.sh

Por último, guarda y sal del editor. Con esta línea que has añadido, comprobarás cada lunes a las 2:30 a.m. si los certificados tienen menos de 30 días de expiración. Adicionalmente, se creará un registro en /var/log/le-renew.log.

Para comentar sobre este artículo, rellena el formulario. Los campos marcados con un asterisco (*) son obligatorios.


*