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/