Finalmente Let's Encrypt ha entrado en su fase Beta de acceso público, por lo que ya no se necesita una invitación para obtener un certificado SSL de forma gratuita. Para aquellos desprevenidos, Let's Encrypt es una nueva autoridad certificante libre, abierta, automática y (lo mejor de todo) gratuita. Esperemos que este proyecto tenga éxito (seguramente lo tendrá pues está patrocinado por la Linux Foundation), y así se termine con el curro de los certificados. No puede ser que grandes empresas se hayan hecho millonarias simplemente emitiendo certificados SSL de confianza, cuando éstos deberían ser un recurso básico de acceso universal. HTTPS tiene que ser el estándar por defecto, y la seguridad tiene que ser un derecho de acceso público y gratuito para todos los sitios de Internet. De otra forma, al tener que pagar para acceder a la seguridad (como sucede actualmente), nunca llegaremos a una Internet segura y confiable.

En este artículo voy a explicar cómo obtener e instalar un certificado gratuito de Let's Encrypt, sobre un servidor Debian con Nginx.



ACTUALIZACIÓN (14/3/2017): letsencrypt-auto es ahora certbot-auto. Por favor remitirse al artículo Cómo generar un certificado SSL/TLS gratis con certbot.

Para obtener un certificado SSL desde Let's Encrypt, es necesario utilizar el cliente oficial. Descargar una copia fresca del mismo en un directorio de nuestra preferencia:

# cd ~/scripts/
# git clone https://github.com/letsencrypt/letsencrypt
# cd letsencrypt/

El cliente Let's Encrypt posee un número de plugins que permiten obtener e instalar un certificado de diferentes formas. En este artículo se explica el método manual (como era de je). Esto significa que la validación del dominio debe hacerla uno mismo, en lugar de hacerla el cliente de forma automática.

Para solicitar el certificado utilizando el método manual, ejecutar el siguiente comando:

# ./letsencrypt-auto certonly -a manual -d www.linuxito.com --server https://acme-v01.api.letsencrypt.org/directory --agree-dev-preview

Este comando sólo generará un certificado para el dominio "www.linuxito.com". Si se desea validar más de un nombre de host, por ejemplo para el dominio con y sin "www." ("linuxito.com" y "www.linuxito.com"), se debe repetir el parámetro -d:

# ./letsencrypt-auto certonly -a manual -d linuxito.com -d www.linuxito.com --server https://acme-v01.api.letsencrypt.org/directory --agree-dev-preview

Puede que el cliente instale algunas dependencias necesarias para su funcionamiento, por lo que lamentablemente es necesario ejecutarlo como superusuario. Este es el punto donde el administrador de sistemas paranoico de la seguridad informática piensa: "ok, me dan un certificado gratis a cambio de instalar un backdoor de la NSA en mi servidor". Es el riesgo a correr, claro está. Por este motivo, se debe evitar utilizar Let's Encrypt en entornos corporativos, o sino hacerlo desde un servidor "descartable" (máquina virtual clonada de la original en producción, que luego será borrada para siempre de nuestro inventario).

Por otro lado ¿cuándo una aplicación se pone a instalar paquetes a nombre del usuario? En general, cuando uno quiere instalar una herramienta (por fuera del gestor de paquetes), antes tiene que instalar sus dependencias. Lamentablemente esta es la nueva línea de pensamiento que siguen la Linux Foundation, Red Hat, freedesktop.org y otros grupos de desarrollo. A causa de ésto hoy tenemos engendros como systemd corriendo en nuestros sistemas (no en los míos). Aquella nefasta idea de idiotizar al Administrador de Sistemas con fines siniestros, que el Sysadmin no se interiorice por el funcionamiento de los componentes, que sea lo menos instruido posible, y que montones de piezas de software que rozan lo propietario hagan el trabajo por él. Esta escuela llevará a que en un futuro cercano el Sysadmin sea "el tipo que sabe el password de root", y nada más.

Dejando de lado estas cuestiones, el cliente instalará (probablemente) algunas dependencias necesarias, uno o dos troyanos de la NSA, y se encargará de generar la solicitud de certificado contra el servidor https://acme-v01.api.letsencrypt.org/directory.

root@linuxito:~/scripts/letsencrypt# ./letsencrypt-auto certonly -a manual -d www.linuxito.com --server https://acme-v01.api.letsencrypt.org/directory --agree-dev-preview
Updating letsencrypt and virtual environment dependencies.......
Running with virtualenv: /root/.local/share/letsencrypt/bin/letsencrypt certonly -a manual -d www.linuxito.com --server https://acme-v01.api.letsencrypt.org/directory --agree-dev-preview
Use of --agree-dev-preview is deprecated.

Durante el proceso se debe aceptar el hecho de que la dirección IP del servidor sea registrada:

El método de validación manual verifica la propiedad del dominio en cuestión generando una URL aleatoria que sirve (como texto plano) una clave de validación (ambas censuradas con asteriscos, por seguridad).

En este punto el cliente se detiene para que podamos validar el dominio. Para no abrir una nueva sesión en el servidor, es posible mandar el proceso a segundo plano presionando Ctrl+Z.

Make sure your web server displays the following content at
http://www.linuxito.com/.well-known/acme-challenge/aOXdzr**********puqZ4 before continuing:

aOXdzr**********puqZ4.KALc***************xYIQ

If you don't have HTTP server configured, you can run the following
command on the target server (as root):

mkdir -p /tmp/letsencrypt/public_html/.well-known/acme-challenge
cd /tmp/letsencrypt/public_html
printf "%s" aOXdzr**********puqZ4.KALc***************xYIQ > .well-known/acme-challenge/aOXdzr**********puqZ4
# run only once per server:
$(command -v python2 || command -v python2.7 || command -v python2.6) -c \
"import BaseHTTPServer, SimpleHTTPServer; \
s = BaseHTTPServer.HTTPServer(('', 80), SimpleHTTPServer.SimpleHTTPRequestHandler); \
s.serve_forever()" 
Press ENTER to continue^Z
[1]+  Stopped                 ./letsencrypt-auto certonly -a manual -d www.linuxito.com --server https://acme-v01.api.letsencrypt.org/directory --agree-dev-preview

Prestar especial atención a la sección que comienza con el texto "Make sure your web server displays the following content":

Make sure your web server displays the following content at
http://www.linuxito.com/.well-known/acme-challenge/aOXdzr**********puqZ4 before continuing:

aOXdzr**********puqZ4.KALc***************xYIQ

Pues allí el cliente especifica la URL y clave para autenticar la validez del dominio.

Crear la URL para validar el dominio:

# cd /var/www/linuxito.com/
# mkdir -p .well-known/acme-challenge/
# cd .well-known/acme-challenge/
# nano aOXdzr**********puqZ4

Dentro de este archivo copiar la clave indicada por el cliente.

root@linuxito:/var/www/linuxito.com/.well-known/acme-challenge# cat aOXdzr**********puqZ4
aOXdzr**********puqZ4.KALc***************xYIQ

A continuación, configurar el servidor Nginx para que sirva dicho archivo como tipo MIME "text/plain":

# nano /usr/local/nginx/nginx.conf

Agregar una nueva ubicación /.well-known/acme-challenge dentro de la raíz:


        location / {

        [...]

            location '/.well-known/acme-challenge' {
                default_type "text/plain";
                root /var/www/linuxito.com;
            }

Finalmente, reiniciar Nginx:

# service nginx restart

Verificar, desde un navegador, que la URL "/.well-known/acme-challenge# cat aOXdzr**********puqZ4" sea servida como texto. El header "Content-Type" debe ser "text/plain".

Para el caso de servidores Apache, es necesario agregar la siguiente configuración en el VirtualHost en cuestión:

<Directory /var/www/linuxito.com/.well-known/acme-challenge>
    DefaultType text/plain
</Directory>

Y recargar la configuración de Apache ejecutando: service apache2 reload

Luego es posible traer a primer plano el proceso del cliente, y presionar la tecla enter para validar el dominio:

root@linuxito:/var/www/linuxito.com# jobs
[1]+  Stopped                 ./letsencrypt-auto certonly -a manual -d www.linuxito.com --server https://acme-v01.api.letsencrypt.org/directory --agree-dev-preview  (wd: ~/scripts/letsencrypt)
root@linuxito:/var/www/linuxito.com# fg 1
./letsencrypt-auto certonly -a manual -d www.linuxito.com --server https://acme-v01.api.letsencrypt.org/directory --agree-dev-preview      (wd: ~/scripts/letsencrypt)


IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/www.linuxito.com/fullchain.pem. Your cert
   will expire on 2016-03-13. To obtain a new version of the
   certificate in the future, simply run Let's Encrypt again.
 - If like Let's Encrypt, 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 valida el dominio y se crea el certificado de forma exitosa.

Tener en cuenta que si se han especificado varios dominios para un mismo certificado (utilizando más de un parámetro -d), se deberá repetir este procedimiento de validación para cada uno de ellos.

Cabe destacar que la validez del certificado es de sólo tres meses.

Tanto el certificado como su clave privada quedan almacenados dentro del directorio /etc/letsencrypt/live/. A continuación se debe configurar HTTPS en Nginx y verificar el acceso desde un navegador (anteponiendo https:// en la URL.

Acceder a los siguientes enlaces si se necesita configurar HTTPS en Apache sobre sistemas CentOS o configurar HTTPS en Apache sobre sistemas Debian/Devuan.

El procedimiento para obtener e instalar un certificado es totalmente automático y demora apenas unos pocos minutos. Es más eficiente y mucho menos burocrático que StartSSL.

Espero que les haya gustado.


Tal vez pueda interesarte


Compartí este artículo