Skip to content

Instantly share code, notes, and snippets.

@jaimerodas
Last active July 18, 2016 17:47
Show Gist options
  • Save jaimerodas/1fa36c2d6926915f4f25f30cdfa071b5 to your computer and use it in GitHub Desktop.
Save jaimerodas/1fa36c2d6926915f4f25f30cdfa071b5 to your computer and use it in GitHub Desktop.
Cómo encriptar Nginx con Let's Encrypt

Encriptar gratis con Let's Encrypt

Necesitamos un servidor con Ubuntu 14.04 con un usuario con privilegios de sudo. Ya debemos tener registrado el dominio que queremos proteger, si no, puedo recomendar ampliamente usar a estos cuates.

Let's Encrypt valida los dominios a través de A Records así que ya debes tener los registros creados para los dominios que quieres certificar.

sudo apt-get update
sudo apt-get -y install git bc nginx
cd ~/apps
wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto

Hay que editar la configuración de Nginx y me gusta vim así que:

sudo vim /etc/nginx/sites-enabled/default

y tenemos que terminar con algo así, pero cambiando example.com por nuestro dominio.

server {
  listen  80;
  listen  [::]:80;
  server_name example.com www.example.com;
  location '/.well-known/acme-challenge' {
  default_type "text/plain";
    root        /tmp/letsencrypt-auto;
  }

  location / {
    return              301 https://$server_name$request_uri;
  }
}

Guardamos, y ahora hay que reiniciar nginx

sudo service nginx reload

Generar Certificado

Para que Let's Encrypt nos suelte un certificado, sólo hay que correr el comando siguiente, sustituyendo los dominios y el correo por el nuestro.

cd ~/apps
export DIR=/tmp/letsencrypt-auto
mkdir -p $DIR
./certbot-auto certonly --webroot -w $DIR -d winbacknow.com -d www.winbacknow.com
sudo service nginx reload

SUCCESS! Bueno, ya casi. Ahora vamos a hacer esto rete harto seguro. Para eso, hay que sacar un grupo DH super chido.

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Que va a tardar un rato, pero nos deja con un grupo fregón en /etc/ssl/certs/dhparam.pem

Terminar de configurar Nginx

Volvemos a editar el sites de nginx:

sudo vim /etc/nginx/sites-available/default

Y hay que hacer un server nuevo ahora para las conexiones seguras:

server {
  listen 443 ssl;
  server_name example.com www.example.com;

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

  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_prefer_server_ciphers on;
  ssl_dhparam /etc/ssl/certs/dhparam.pem;
  ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
  ssl_session_timeout 1d;
  ssl_session_cache shared:SSL:50m;
  ssl_stapling on;
  ssl_stapling_verify on;
  add_header Strict-Transport-Security max-age=15768000;

  # el resto de la config de tu server...

}

Guardamos y, oootra vez, reiniciamos nginx

sudo service nginx reload

Qué onda con el renewal?

Let's encrypt da certificados válidos por 90 días, así que hay que estarlos renovando. Para esto, vamos a hacer un pequeño cron que corra cada semana y guarde logs al respecto. No hay que poner muchos parámetros porque con el simple comando de renew, Certbot se encarga de intentar renovar todos los certificados disponibles 👏. Cualquier bronca, podemos revisar el registro que se guarda en ~/apps/renewssl.log.Para agregar tareas a crontab:

sudo crontab -e

y agregamos la línea

@weekly /home/user/apps/certbot-auto renew --post-hook "service nginx reload" > /var/log/renewssl.log

Terminamos!

Yo saqué todo esto de:

y algo de mi propia cosecha

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment