Configurar ssl en nginx con let’s encrypt

Hoy os voy a explicar como configurar el servidor web nginx para servír contenido a través del protocolo HTTPS y como obtener un certificado válido para nuestro domino utilizando Let’s encrypt.

Lo primero de todo, necesitamos generar un certificado para nuestro dominio. Para ello vamos a utilizar la utilidad certbot que podemos instalar desde el repositorio de epel. Si no lo tenemos configurado en nuestro servidor lo podemos hacer ejecutando

yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

para posteriorme instalar la utilidad

yum install certbot

A continuación, ya podemos generar un certificado con el siguiente comando

certbot certonly --webroot -w ${DirectoryRoot} -d ${dominio.com} -d www.${dominio.com}

Sustituyendo ${DirectoryRoot} por la ruta de sistema a la raiz de nuestro dominio y ${dominio.com} por el nombre de nuestro dominio.

El comando anterior habrá generado cuatro enlaces simbolicos en la ruta /etc/letsencrypt/live/${dominio.com}/:

  • cert.pem -> ../../archive/${dominio.com}/cert1.pem
  • chain.pem -> ../../archive/${dominio.com}/chain1.pem
  • fullchain.pem -> ../../archive/${dominio.com}/fullchain1.pem
  • privkey.pem -> ../../archive/${dominio.com}/privkey1.pem

Las rutas que vamos a usar en el fichero de configuración de nginx son las de los enlaces simbólicos puesto que los ficheros del directorio archive pueden ir cambiando con las sucesivas renovaciones del certificado.

Una vez que ya tenemos un certificado válido para nuestro dominio nos toca adaptar la configuración de nginx para que haga uso de el.

Para una primera aproximación, vamos a hacer uso del mismo bloque server{} para configurar el acceso a nuestro dominio a través de http y https.  Por el momento nos bastará con abrir la configuración correspondiente y añadir las siguientes lineas:

ssl    on;
listen 443;
ssl_certificate /etc/letsencrypt/live/${dominio.com}/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/${dominio.com}/privkey.pem;

Como podeis observar, como clave pública he utilizando el fichero fullchain.pem en lugar del cert.pem. Lo he hecho de esta manera debido a que fullchain.pem contiene la ruta completa de certificación incluyendo nuestro certificado y todos los certificados intermedios que sean necesarios para validarlo.

Más adelante os explicaré como redirigir todas las peticiones inseguras hacía el protocolo seguro. Para ello necesitaremos dos bloques server{} (uno escuchando en el puerto 80 y otro en el 443).

Solo nos queda reiniciar el servicio nginx

systemctl restart nginx

Y para finalizar un par de advertencias:

La primera es deciros que teneis que tener en cuenta que los certificados generados con let’s encrypt tienen una fecha de expiración de 90 días por lo que tenemos que estar pendientes de renovarlo (o mejor aún programar una tarea en el cron del servidor que lo haga automáticamente).

Y por otro lado, como habeis podido deducir, la configuración SSL que hemos realizando es la más básica posible. Más adelante os hablaré de como conseguir mejorarla para llegar a conseguir una puntuación A+ en el test de ssllabs.com