17.6 Instalando un certificado SSL gratuito con CertBot

Se recomienda que el acceso a tus servicios sea mediante SSL, el cual es un protocolo de seguridad para proteger la comunicación entre los clientes de tu aplicación (sistema web, aplicación móvil) y tu servidor.

En este ejemplo voy a utilizar certificados gratuitos de Let’s Encrypt y la herramienta Certbot para linux, puedes realizar los pasos que se encuentran en la página de Certbot si deseas agregar SSL a los sitios web de tus servidores apache o nginx. Estos certificados son válidos por 30 días y los puedes renovar en automático con un comando de certbot.

Estos pasos son para Ubuntu, puedes consultar la página de certbot para ver los pasos para las otras distribuciones de Linux.

1. Agregamos el repositorio de certbot.

sudo add-apt-repository ppa:certbot/certbot

2. Actualizamos la lista de paquetes.

sudo apt-get update

3. Instalamos el paquete de Certbot

sudo apt-get install certbot

4. Creamos el certificado para nuestro dominio, el servidor nginx no debe estar corriendo al momento de crear el certificado.

sudo certbot certonly --standalone --preferred-challenges 
      http -d example.com

Nos crea los siguientes archivos

cert.pem  chain.pem  fullchain.pem  privkey.pem  README

Agregamos el siguiente archivo /etc/nginx/proxy.conf

proxy_redirect          off;
proxy_set_header        Host $host;
proxy_set_header        X-Real-IP $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header        X-Forwarded-Proto $scheme;
client_max_body_size    10m;
client_body_buffer_size 128k;
proxy_connect_timeout   90;
proxy_send_timeout      90;
proxy_read_timeout      90;
proxy_buffers           32 4k;

Modificamos el archivo de configuración de nginx /etc/nginx/nginx.conf para indicarle que tome nuestro archivo proxy.conf

http {
    include        /etc/nginx/proxy.conf;
    limit_req_zone $binary_remote_addr zone=one:10m rate=25r/s;
    server_tokens  off;
    sendfile on;
    keepalive_timeout   29; 
    client_body_timeout 10; client_header_timeout 10; send_timeout 10;

En mi caso tengo un archivo de configuración por cada sitio alojado en mi servidor /etc/nginx/sites-available

En server_name agregamos el dominio con el cual creamos el certificado, en ssl_certificate agregamos nuestro archivo fullchain.pem, en ssl_certificate_key agregamos el archivo privkey.pem

server {
        listen     *:80;
        add_header Strict-Transport-Security max-age=15768000;
        return     301 https://$host$request_uri;
    }
server {
    listen                    *:443 ssl;
    server_name               example.com;
    ssl_certificate           /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key       /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_protocols             TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers               "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
    ssl_ecdh_curve            secp384r1;
    ssl_session_cache         shared:SSL:10m;
    ssl_session_tickets       off;
    ssl_stapling              on; #ensure your cert is capable
    ssl_stapling_verify       on; #ensure your cert is capable
    add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;
    #Redirects all traffic
    location / {
            proxy_pass http://localhost:5000;
            limit_req  zone=one burst=10 nodelay;
    }
}

Por último iniciamos el servicio de nginx, ahora todas nuestras peticiones son por SSL

Puedes consultar tu dominio en la siguiente página, para validar el SSL de los ataques mas comunes https://www.digicert.com/help/

Last updated