Certificado SSL en NGINX

 

En post anteriores hemos visto cómo instalar NGINX en nuestro servidor, pero por ahora solo proporciona contenido HTTP, osea contenido sin certificado.

Instalar un certificado SSL es muy sencillo, de la mano de Let’s Encrypt.

Para ejecutar esta guía, únicamente debemos tener acceso a nuestro servidor a través de SSH un usuario superusuario o sudo y nuestro servidor web montado. 

1 - Habilitar el repositorio EPEL 

recordamos de posts anteriores que necesitamos tener habilitado el repositorio EPEL, si no lo tenemos activado, debemos ejecutar este comando

$ sudo yum install epel-release

 

2 - Instalar Certbot

Primero decir que certbot es una solución gratuita y open source para la administración automática de certificados lo cual nos permite utilizar HTTPS, utilziando Let’s Encript.

Para instalarlo ejecutamos el siguiente comando:

$ sudo yum install certbot python2-certbot-nginx

 

3 - Creación de los certificados

Como tenemos un servidor nginx, además de nuestras URL en la configuración, podemos correr el siguiente comando

$ sudo certbot --nginx

Y automáticamente nos creará los certificados necesarios y la configuración para escuchar por HTTPS en vez de HTTP

3.1 - Creación manual de certificados

en nuestro caso, vamos a crear los certificados para un sitio en concreto, con certbot, deberás crear los certificados tanto para el dominio, como para los subdominios. 

$ sudo certbot --nginx -d webEjemplo.com -d www.webEjemplo.com

Certbot nos pedirá que introduzcamos una serie de información para crear el certificado, lo hacemos sin ningún problema. 

Una vez hemos finalizado, no tenemos que configurar nginx ya que certbot lo hará automáticamente. para comprobarlo vamos al fichero de configuración en /etc/nginx/conf.d/ en nuestro caso webEjemplo.conf y podemos observar los cambios.

server {
    listen 80;
    server_name www.webEjemplo.es;
    location / {
        proxy_pass         http://localhost:5000;
       }
       listen 443 ssl; # managed by Certbot

    # RSA certificate
    ssl_certificate /etc/letsencrypt/live/www.webEjemplo.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/www.webEjemplo.com/privkey.pem; # managed by Certbot

    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot

    # Redirect non-https traffic to https
    if ($scheme != "https") {
        return 301 https://$host$request_uri;
    } # managed by Certbot
}

server {
    listen 80;
    server_name webEjemplo.com;
    return 301 https://www.webEjemplo.com$request_uri;

    listen 443 ssl; # managed by Certbot

    # RSA certificate
    ssl_certificate /etc/letsencrypt/live/webEjemplo.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/webEjemplo.com/privkey.pem; # managed by Certbot

    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot

    # Redirect non-https traffic to https
    if ($scheme != "https") {
        return 301 https://$host$request_uri;
    } # managed by Certbot
}

Los cambios que certbot ha introducido, están indicados con # managed by Certbot

Como podemos observar son los siguientes:

  • Escuchar por el puerto 443 de ssl;
  • incluir los certificados
  • redireccionar a HTTPS cuando la llamada es HTTP

 

4  - Renovación automática de los certificados

Los certificados generados con Let’s Enctrypt y certbot caducan cada 90 días, por lo que tendremos que renovarlos. 

En caso de haber creado los certificados a mano, nos habrá preguntado el email, cuando estamos cerca del dia de caducidad, Let’s encrypt nos mandará un mensaje indicando que el certificado va a caducar.

Pese a ello podemos crear una tarea cron en el sistema para que renueve los certificados.

abrimos crontab con el siguiente comando:

$ crontab -e

Y añadimos la siguiente línea

0 12 * * * /usr/bin/certbot renew --quiet

utilizamos --quiet para indicar al sistema que no queremos saber la salida por la terminal.

nota: los certificados sólo pueden renovarse si están a 30 días de caducar. 

 

Conclusión

En este post hemos instalado Certbot para generar certificados SSL para un dominio específico.

Posteriormente hemos configurado NGINX para utilizar estos certificados y así disponer de una web segura en cuestión de minutos. 

Comparte