Certificado SSL gratis con Let’s Encrypt en un servidor Nginx

Certificado SSL gratis con Let’s Encrypt en un servidor Nginx

Let’s Encrypt es una autoridad de certificación que ofrece una forma sencilla de obtener e instalar certificados TLS/SSL gratuitos, con los que cifrar las peticiones HTTPS en tus servidores web. El proceso se apoya en un programa llamado Certbot que automatiza casi todos los pasos necesarios. Ten en cuenta que Chrome avisa a sus usuarios de los sitios no seguros, algo que puede afectar a tu posicionamiento.

En este tutorial vas a ver cómo usar Let’s Encrypt para conseguir un certificado SSL gratuito para Nginx en Ubuntu 14.04. También veremos cómo renovarlo automáticamente (un certificado de Let’s Encrypt solo es válido 90 días).

Paso 1: instalar Certbot

¿Qué es Certbot? Certbot activa automáticamente HTTPS en tu sitio web desplegando certificados de Let’s Encrypt. Si no usas Nginx o si no estás en Ubuntu 14.04, echa un vistazo a su web: explican el procedimiento a seguir en cada sistema para generar certificados SSL con Let’s Encrypt.

Empezamos por descargar Certbot en la carpeta /usr/local/sbin:

code
cd /usr/local/sbin
wget https://dl.eff.org/certbot-auto

No olvides darle permisos de ejecución al fichero:

code
chmod a+x /usr/local/sbin/certbot-auto

Paso 2: obtener un certificado

Para que Certbot pueda acceder al directorio, hay que retocar la configuración de Nginx. Por defecto está en /etc/nginx/sites-available/default. Aquí usamos nano para editarlo, pero puedes hacerlo con el editor que prefieras:

code
nano /etc/nginx/sites-available/default

Dentro del bloque server, añade:

code
server {

#votre configuration ...

location ~ /.well-known {
        allow all;
    }

}

Vas a necesitar la carpeta pública de tu sitio. Si usas el fichero de configuración por defecto, será /usr/share/nginx/html, si usas Laravel, /path/to/public/.
Comprueba que no haya errores.

code
nginx -t

Si todo está en orden, reinicia Nginx:

code
service nginx restart

Paso 3: configurar TLS/SSL en el servidor nginx

Ahora que conocemos la ruta pública, podemos usar el plugin Webroot para pedir un certificado SSL. Los nombres de dominio se indican con la opción -d. Si quieres que un certificado cubra varios dominios (por ejemplo, ejemplo.com y www.ejemplo.com), acuérdate de incluirlos todos, empezando por el dominio de nivel superior (ejemplo.com). Sustituye también las partes destacadas por la ruta webroot correcta y por tus nombres de dominio:

code
certbot-auto certonly -a webroot --webroot-path=/votre/chemin/public -d exemple.com -d www.exemple.com

Certbot te pedirá varias cosas, entre ellas una dirección de correo que servirá para avisarte cuando el certificado esté a punto de caducar. Más adelante veremos cómo renovarlo automáticamente.

Los certificados

Una vez obtenido el certificado, tendrás estos ficheros:

  • cert.pem: el certificado de tu dominio
  • chain.pem: el certificado de Let’s Encrypt
  • fullchain.pem: cert.pem y chain.pem combinados
  • privkey.pem: tu clave privada.

Estos ficheros se guardan en un subdirectorio de /etc/letsencrypt/archive. Ahora bien, el cliente de Let’s Encrypt crea enlaces simbólicos hacia los certificados más recientes en el directorio /etc/letsencrypt/live/tu_nombre_de_dominio. Como esos enlaces apuntan siempre a los certificados más recientes, esa es la ruta que debes usar para referenciar tu certificado actual.

Generar una clave Diffie-Hellman

Para reforzar aún más la seguridad, conviene generar también una clave Diffie-Hellman de 2048 bits:

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

Tardará unos minutos, pero al terminar tendrás el fichero DH en /etc/ssl/certs/dhparam.pem.

Ya tienes el certificado SSL: ahora hay que configurar Nginx para que lo use.
Volvemos a editar nuestro bloque server:

code
nano /etc/nginx/sites-available/default

Eliminamos (o comentamos) las líneas siguientes, las que escuchan el puerto 80 para las peticiones HTTP:

code
#listen 80 default_server;
#listen [::]:80 default_server ipv6only=on;

Y pasamos a escuchar el puerto 443 para HTTPS:

code
listen 443 ssl;

Añadimos también en el bloque server el enlace simbólico que apunta a los certificados generados con el comando certbot-auto:

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

Añadimos la configuración SSL por defecto del servidor:

code
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 1d;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_prefer_server_ciphers on;
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_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security max-age=15768000;

Por último, fuera del bloque server principal, añade este otro bloque para redirigir HTTP (puerto 80) hacia HTTPS (puerto 443).

code
server {
    listen 80;
    listen [::]:80;
    server_name exemple.com www.exemple.com;
    return 301 https://$host$request_uri;
}

Comprueba que no haya errores en la configuración:

code
nginx -t

Y reinicia el servidor nginx:

code
service nginx restart

Paso 4: renovación automática del certificado

Como decía al principio, los certificados SSL caducan a los 90 días, así que hay que renovarlos. Si se te olvida, recibirás un correo antes de que el certificado de Let’s Encrypt caduque.

Para renovarlo de forma automática, añadimos el comando certbot-auto renew a las tareas CRON del servidor.

code
30 2 * * 1 /usr/local/sbin/certbot-auto renew >> /var/log/le-renew.log
35 2 * * 1 /etc/init.d/nginx reload

Todos los lunes, a las 2:30, se renueva el certificado y, a las 2:35, se recarga el servidor nginx.

Conclusión

Ya tienes tu servidor web con un certificado SSL emitido por Let’s Encrypt. Es una buena alternativa a los certificados de pago. Muchos alojamientos, como OVH, ofrecen SSL gratuito gracias a Let’s Encrypt. Y resulta interesante sabiendo que Google empuja poco a poco a los sitios hacia HTTPS.

fuente: digitalocean.com & wikipedia.org

···

Damien Flandrin Desarrollador web desde 2010, creador de Gekkode y de Email Impact. Cada artículo se prueba en un proyecto real antes de publicarse. Contacto
Newsletter

Las nuevas pruebas, tutoriales y proyectos, por correo.

Pruebas reproducibles, código versionado, resultados fechados. Nunca spam.