Autonomía digital y tecnológica

Código e ideas para una internet distribuida

Certificado TSL para conexión segura HTTPS con Let’s Encrypt y certbot

Imago voragine.net
[actualizado el ]

Los certificados TSL permiten conectarse de manera segura a un sitio web usando el protocolo HTTPS (secure HTTP). Son conexiones seguras porque los datos que viajan desde el ordenandor del visitante hasta el servidor donde está alojado el sitio web, y viceversa, están encriptados y nadie puede inspeccionarlos.

El protocolo HTTPS encripta los datos utilizando criptografía asimétrica, que utiliza un par de claves: una pública para cifrar la información y otra privada para descifrarla. El servidor HTTPS difunde su clave pública a cualquier ordenador cliente que quiera conectarse a él, y guarda en secreto su clave privada.

El problema con la criptografía asimétrica es estar seguros de que la clave pública corresponde efectivamente al servidor al que se quiere conectar. De lo contrario existe el peligro de conectarse a un servidor que suplante al original.

Para asegurar la autenticidad de la clave pública de un servidor lo más eficaz es conocer una de las personas que gestionan el servidor, encontrarla presencialmente y que nos dé la clave. En un sistema global como internet en el se visitan servidores que están en otros continentes hubo que buscar otra manera. Es en este punto donde entran en juego las entidades de certificación: organizaciones de confianza que certifican la autenticidad de una clave pública.

Let’s Encrypt es la primera entidad de certificación que emite certificados gratuitos y de manera automática. El proceso para obtener un certificado se puede hacer íntegramente desde la línea de comandos usando certbot.

Obtener un certificado Let’s Encrypt e instalarlo usando certbot

Las siguientes instrucciones son para un servidor Debian con Apache2.

Lo primero que hay que hacer es instalar certbot. Este paquete no está en los repositorios de la versión estable Debian Jessie, hay que instalarlo usando los backports:

sudo apt-get -t jessie-backports install certbot

cerbot permite instalar certificados de varias maneras en función del grado de automatización de la instalación y del servidor web que se use.

Para instalaciones de Apache más o menos sencillas se puede recurrir al plugin de cerbot para Apache (existe también uno para Nginx), que se pueden instalar también de los repositorios de debian:

sudo apt-get -t jessie-backports install python-certbot-apache

Todo el proceso de petició del certificado a Let’s Encrypt, su instalación en el servidor y la modificación de los archivos de configuración del servidor web se hacen con un único comando. La única información que le tenemos que pasar a cerbot es el dominio, usando el parámetro -d:

sudo certbot --apache -d voragine.net

Se puede solicitar el certificado para el dominio y varios subdominios a la vez:

sudo certbot --apache -d voragine.net -d wiki.voragine.net -d foro.voragine.net -d www.voragine.net

Para instalaciones más personalizadas de Apache (Apache funcionando con FPM, por ejemplo) esta manera puede no funcionar. Si es así se puede recurrir a webroot, la manera semiautomática de certbot. webroot hace la petición y la instalación del certificado, pero la configuración habrá que modificarla manualmente. Para que cerbot funcione hay que pasarle como argumento (-w) la ruta absoluta del sitio web, y los dominios (-d):

certbot certonly --webroot -w /var/www/voragine/voragine.net/ -d voragine.net -d www.voragine.net

certbot crea una carpeta en el raíz del sitio web llamada .well-know para certificar que el dominio está en el servidor desde el que se está haciendo la petición. El script crea un archivo temporal que Let’s Encrypt comprueba vía HTTP. Es importante que el archivo se cree con los permisos adecuados para que sea visible vía HTTP, de lo contrario el proceso de instalación del certificado fallará.

Si el proceso es exitoso veremos un mensaje como el siguiente:

sudo certbot certonly --webroot -w /var/www/voragine/voragine.net/ -d voragine.net -d www.voragine.net
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/voragine.net/fullchain.pem. Your cert will
   expire on 2016-09-12. To obtain a new or tweaked version of this
   certificate in the future, simply run certbot again. To
   non-interactively renew *all* of your certificates, run "certbot
   renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Se puede comprobar que Let’s Encrypt ha accedido con éxito al archivo mirando los logs de Apache:

tail -1000 /var/logs/access.log |grep .well-know
66.133.109.36 - - [14/Jun/2016:17:56:17 +0200] "GET /.well-known/acme-challenge/PB8fbeHe9z0BEFVRG_NtgbbIfZviv7B9GQKTl3sfEDE HTTP/1.1" 200 460 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)"
66.133.109.36 - - [14/Jun/2016:17:56:17 +0200] "GET /.well-known/acme-challenge/EHGFoEP2_WAlPN9880e1xh8y_i53uMwnpczwghKceHs HTTP/1.1" 200 460 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)"

Modificar Apache para que sirva la web usando HTTPS

Después de instalar el certificado hay que hacer algunos cambios en Apache. Primero hay que poner a Apache a escuchar el puerto de las conexiones seguras; para ello añadimos al archivo /etc/apache2/ports.conf:

<IfModule ssl_module>
  Listen *:443
</IfModule>
<IfModule mod_gnutls.c>
  Listen *:443                                                                                              
</IfModule>

Luego modificamos la configuración del virtual host, redirigiendo las peticiones que lleguen al puerto 80, HTTP, al 443, HTTPS:

&lt;VirtualHost *:80&gt;
    ServerName voragine.net
    Redirect 301 / https://voragine.net/
&lt;/VirtualHost&gt;

Por último ponemos a la escucha el puerto 443 para el dominio y vinculamos el certificado con el virtual host:

<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerName voragine.net
    ServerAlias www.voragine.net

    # Resto de configuración del virtual host
      
    SSLCertificateFile /etc/letsencrypt/live/voragine.net/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/voragine.net/privkey.pem
    Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

Renovar certificados

Los certificados de Let’s Encrypt tienen una validez de 6 meses. Se pueden renovar también usando la línea de comandos.

La opción renew de cerbot renueva todos los certificados que vayan a caducarse en los próximos 30 días:

sudo certbot renew

La renovación de puede automatizar por ejemplo con cron.

Actualización 30/03/2018. Parece ser que la versión 0.21 de certbot incorpora una tarea cron para renovar los certificados automáticamente. Se puede comprobar la renovación automática con el siguiente comando:

sudo certbot renew --dry-run

Eliminar certificados

Para eliminar un certificado:

sudo certbot revoke --cert-path /etc/letsencrypt/live/voragine.net/cert.pem -d voragine.net -d www.voragine.net

Para saber el estado de un certificado podemos recurrir a las siguientes herramientas en línea:

3 comentarios

Dejar un comentario

*
*

 

3 trackbacks