Certificado SSL gratis con Let’s Encrypt en nginx

Vamoh a calmarno’ y dejaré de lado todas las flores a la fundación Linux que siempre se merece junto con todo lo que un  lo que el código abierto y GNU/Linux ha aportado en nuestras vidas geeks y me centraré en un tutorial paso a paso, que espero me sirva como ayuda memoria, de cómo generar un certificado SSL gratis, ponerlo en un proxy reverso con nginx y dejarlo tiqui taca para que pase las más exigentes pruebas de blancura para obtener un A en la prueba de Qualys SSL Labs.  

instantánea96

Requisitos, y cosas que no enseñaré cómo hacer porque hay un montón de tutoriales en internet

  • Servidor Linux, en mi caso CentOS 6 (Sí, aun no me pego el salto a RHEL 7)
  • Dominio o subdominio
  • nginx configurado como proxy
  • Acceso a internet desde el servidor para generar el certificado
  • Un poco de paciencia

Tampoco puedo saltarme todo, así que… ¿Qué es Let’s Encrypt? Básicamente es una autoridad certificadora libre, abierta, automática y gratuita, como debe ser, patrocinada por la Linux Foundation. En otras palabras se cagó a todas las empresas que cobraban lo que querían por hacer algo tan básico y simple como generar un certificado de seguridad para hacer Internet un lugar más seguro para todos los que día a día interactuamos y enviamos información sensible por la red (como las fotos de mis vacaciones, cof cof).

Para obtener el certificado  se debe usar el cliente certbot que nos ayudará a instalar todas las dependencias necesarias en nuestro servidor y generar el certificado en un par de pasos.

OJO: Todo esto se debe realizar solamente en el servidor de nginx, no en el servidor donde realmente esta nuestro sitio, que como es un proxy reverso no necesariamente es el mismo donde corre nuestra web, esto debido a que nginx es nuestro extremo expuesto a internet y será el quién se encargará de la seguridad de la comunicación que finalmente llega al usuario.

En este caso a modo de ejemplo, nginx no lo configuraré como proxy reverso apuntando a otro servidor, simplemente servirá el index por defecto que viene cuando se instala.

Instalar el certbot

Antes de todo, se deben instalar los repositorio epel

yum install epel-release

Ahora se obtiene una copia de certbot y se le dan los permisos necesarios,

wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto

¿certbot-auto? Es lo mismo que certbot pero instala todas las dependencias necesarias para hacer todo más fácil.

Ahora vamos a ejecutarlo y generar el certificado. Pero antes de eso, para facilitar la verificación de nuestra propiedad del sitio web en cuestión, vamos detener nginx o apache (o lo que tengamos corriendo en puerto 80) para que certbot-auto levante temporalmente un servicio corriendo en ese puerto.

./certbot-auto certonly -d seguro.fpipe87.com

instantánea99

instantánea100

Ahora se debe configurar nuestro sitio web en nginx, en este caso yo lo haré en /etc/nginx/conf.d/ssl.conf para que sea un poco más ordenado.

La configuración debe ser tal cual como está abajo, solamente se debe cambiar el dominio en cuestión y lo que va dentro de location / { } porque es qué se mostrará cuando se acceda.

server {
listen       443 ssl;
server_name  seguro.fpipe87.com;

ssl_certificate      /etc/letsencrypt/live/seguro.fpipe87.com/cert.pem;
ssl_certificate_key  /etc/letsencrypt/live/seguro.fpipe87.com/privkey.pem;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers “EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA38
4:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-A
ES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES1
28-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4”;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
add_header Strict-Transport-Security max-age=600000;

location / {
root   html;
index  index.html index.htm;
}
}
instantánea104

Con esa configuración ya estamos casi listos y tenemos lo más dificil listo. El test marcará B y para dejarlo A basta solo un paso más.

instantánea103

Ahora se ejecuta un comando para generar un nuevo grupo Diffie-Hellman. Google Chrome, Mozilla Firefox, and Microsoft Internet Explorer aumentaron el mínimo de bits necesarios en la encriptación a 1024. En este caso vamos a generar uno de 4096 bits para evitar futuros problemas con OpenSSL

openssl dhparam -out /etc/letsencrypt/live/seguro.fpipe87.com/cert.dhparam.pem
4096

instantánea106

Esto se puede demorar un par de minutos dependiendo obviamente de la potencia de nuestro servidor.

Luego basta con agregar esto a la configuración de nginx

ssl_dhparam          /etc/letsencrypt/live/seguro.fpipe87.com/cert.dhparam.pem;

instantánea111

Reiniciamos nginx y probamos nuevamente (OJO, para re scannear hay que presionar donde dice “Clear Cache”)

instantánea107

Ok, con esto sacamos el error de Diffie-Hellman pero sigue siendo marcando B porque nos falta agregar algo más. Si bajamos y vemos los detalles solo falla esto:

instantánea108

Esto es porque nos falta agregar la información de Let’s Encrypt en el certificado generado. Basta con abrir el archivo y agregar lo siguiente al final del certificado.

https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem.txt

vim /etc/letsencrypt/live/seguro.fpipe87.com/cert.pem

Para que quede así más o menos así:

instantánea109

Ahora sí está todo listo, reiniciamos por última vez nginx para que tome los cambios y vamos a probar nuevamente en la página. Tal como se muestra en la imagen a continuación marcará A y estará en verde.

instantánea110

Bueno, eso es todo y pese a que parece largo en realidad no lo es tanto y tenemos nuestro certificado gratis y seguro.

Cualquier duda o sugerencia lo pueden dejar en los comentarios y con gusto los ayudaré.

One thought on “Certificado SSL gratis con Let’s Encrypt en nginx”

Agregar un comentario

Su dirección de correo no se hará público. Los campos requeridos están marcados *