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
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
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
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
Yo saqué todo esto de:
- Digital Ocean - How To Secure Nginx with Let's Encrypt on Ubuntu 14.04
- One-line certificate generation/renews with Letsencrypt and nginx
- Certbot
y algo de mi propia cosecha