En el artículo de hoy vamos a convertir nuestro sitio en un sitio seguro mediante la instalación de un certificado SSL de Letsencrypt. Hasta hace pocos años solo teníamos dos opciones: o instalábamos un certificado auto-firmado, lo cual hacía que la página inicial mostrara una incómoda advertencia, o teníamos que pagar por un certificado verificado por una entidad de certificación (CA). Ahora tenemos esta opción gratuita que es la que vamos a utilizar. Aquí tenemos información general de Let’s Encrypt y nosotros vamos a instalar el cliente Certbot que nos va a permitir instalar el certificado:
Certbot – https://certbot.eff.org/
Instrucciones para NGINX + Ubuntu 16.04 – https://certbot.eff.org/lets-encrypt/ubuntuxenial-nginx
Antes de instalar debemos decidir sobre un par de cuestiones:
• Cada certificado es válido para un dominio o subdominio, y dado que www. es un subdominio en si mismo, debemos decidir para que dominios vamos a obtener nuestro certificado: para dominio.com, para www.dominio.com o para ambos. Yo haré el ejemplo solo para dominio.com, ya que en general el prefijo www la gente no lo utiliza con el consiguiente trastorno de generar dos certificados.
• Podemos instalar los certificados y luego modificar la configuración manualmente o que Certbot instale los certificados junto con la configuración para NGINX. Lo haremos manualmente ya que no es muy dificil y así sabemos que archivos se modifican.
Primero instalamos Certbox
$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install python-certbot-nginx
Mediante el siguiente comando generamos los certificados:
$ sudo certbot certonly –webroot -w /var/www/html/sitename/public_html -d www.sitename.com -d sitename.com
Primero nos pedirá una dirección de e-mail:
Enter email address (used for urgent renewal and security notices) (Enter ‘c’ to
cancel):
Pulsamos A para aceptar las condiciones:
Please read the Terms of Service at
…
(A)gree/(C)ancel: A
Pulsamos N para no recibir e-mails:
Would you be willing to share your email address with the Electronic Frontier
…
(Y)es/(N)o: N
Por ultimo veremos un mensaje indicandonos que se han generado los certificados y su ubicación, que es /etc/letsencrypt/live/dominio:
$ cd /etc/letsencrypt/live/dominio
sudo ls -la
drwxr-xr-x 2 root root 4096 Apr 25 15:42 .
drwx—— 3 root root 4096 Apr 25 15:42 ..
lrwxrwxrwx 1 root root 34 Apr 25 15:42 cert.pem -> ../../archive/dominio/cert1.pem
lrwxrwxrwx 1 root root 35 Apr 25 15:42 chain.pem -> ../../archive/dominio/chain1.pem
lrwxrwxrwx 1 root root 39 Apr 25 15:42 fullchain.pem -> ../../archive/dominio/fullchain1.pem
lrwxrwxrwx 1 root root 37 Apr 25 15:42 privkey.pem -> ../../archive/dominio/privkey1.pem
A continuación debemos modificar la configuración de NGINX para instalar los certificados, pero antes debemos descargar un archivo con opciones y generar otro:
sudo wget https://raw.githubusercontent.com/certbot/certbot/master/certbot-nginx/certbot_nginx/options-ssl-nginx.conf
Este archivo son algunas opciones necesarias para nuestra configuración SSL del servidor Nginx.
En el archivo que acabamos de descargar podemos añadir la siguiente linea solo si vamos a utilizar HTTPS y no HTTP. Esto nos dará una puntuación mayor en el test que haremos al final.
add_header Strict-Transport-Security «max-age=31536000» always;
El siguiente comando genera otra característica de seguridad, los parámetros Ephemeral Diffie-Hellman (DHE).
sudo openssl dhparam 2048 -out ssl-dhparams.pem
Para entender un poco todas estas opciones aquí tenemos más información:
Strong SSL Security on nginx – https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html
Ahora deberemos modificar la configuracion de nuestro site ubicada en /etc/nginx/sites-available/sitename.conf y realizamos las siguientes modificaciones:
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/world4.net/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/world4.net/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
Para finalizar la configuración, añadimos el siguiente contexto server al final del archivo, con esto haremos que nuestras peticiones a http://dominio.com vayan dirigidas a https://dominio.com
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
return 301 https://$host$request_uri;
}
Test Certificado – SSL https://www.ssllabs.com/ssltest/index.html
Renovación automática del certificado
Los certificados firmados de pago normalmente tienen una validez de 1 año, tras el cual luego hay que renovarlos. En nuestro caso, letsencrypt establece una validez de 90 días. Para renovarlo podemos ejecutar un comando unos dias antes de que caduque, o podemos agregarlo a una tarea programada para que se verifique periódicamente y se renueve poco antes de que caduque. Para ello, simplemente añadimos una nueva linea en nuestro archivo crontab
$ sudo crontab –e
00 2 * * * certbot renew