Obtención de certificados con Let’s Encrypt

5
9472

¿Necesitas tener tráfico seguro en tu servidor pero no tienes un certificado válido para ello? Pues con Let’s Encrypt se te han acabado las excusas. Vamos a ver cómo poder obtener certificados (y cómo renovarlos) de una forma sencilla y totalmente gratuita 🙂 Lo único que necesitas es, cómo no, tener control sobre el dominio que quieres certificar. ¿Todo listo? Pues vamos a ver de qué va esto \o/.

Índice de contenidos

1. Let’s Encrypt

Let’s Encrypt es una autoridad de certificación (CA) automatizada, libre y gratuita que nace de un esfuerzo conjunto para el beneficio de la comunidad y no para el control de cualquier organización. Es un servicio proporcionado y promovido por el Internet Security Research Group en su empeño por hacer que todo el tráfico en la web sea seguro, grupo que está patrocinado por un gran número de empresas tanto pequeñas como grandes, entre las que se encuentran Mozilla, Cisco, Akamai y Facebook por nombrar algunas.

1.1. Autoridad de certificación y protocolo ACME

Let’s Encrypt utiliza el llamado protocolo ACME (del inglés Automatic Certificate Management Environment). Este protocolo tiene dos partes: la validación del dominio y la petición (o revocación según el caso) del certificado.

Para validar que se tiene control sobre el dominio se utiliza un par de claves pública-privada más una serie de retos (challenges) que el servidor ha de realizar. La primera vez que nuestro cliente de Let’s Encrypt se conecta con la CA se genera el par de claves. El proceso entre el cliente de Let’s Encrypt y la CA (detallado en la página oficial) podría resumirse así:

  1. Let’s Encrypt CA le pide a nuestro cliente que aloje un fichero en una dirección concreta del dominio, y le pasa además un token para que lo firme.

  2. El cliente procede a guardar el archivo bajo el dominio correspondiente y firma el token con la clave privada; notifica a la CA de que está listo.

  3. La CA verifica la firma del token con la clave pública de nuestro servidor e intenta descargar el fichero desde la dirección acordada.

  4. Si todo es correcto, entonces el servidor correspondiente a esa clave pública queda autorizado para realizar peticiones de certificados.

Una vez tenemos el par de claves autorizado, para la petición o revocación de certificados el cliente sólo ha de mandar el mensaje de gestión de certificados cifrado con la clave privada del servidor. La CA descifrará el mensaje con la clave pública y pasará a realizar las tareas de gestión pertinentes.

1.2. Instalación del cliente

Lo primero que necesitamos es instalar un cliente de Let’s Encrypt que se encargue de generar e instalar los certificados. De entre los distintos clientes y librerías que existen nos vamos a centrar en el cliente certbot que es el recomendado en la web de Let’s Encrypt. Hasta mayo de 2016 este cliente se llamaba letsencrypt así que es posible que aún encontréis documentación con esa referencia. Simplemente hay que sustituir letsencrypt y letsnecrypt-auto por certbot y certbot-auto ya su funcionamiento y opciones no han cambiado.

En algunos sistemas operativos se puede obtener directamente desde el sistema estándar de paquetes (como apt-get o yum), pero no está en todos (Ubuntu no lo tiene por ejemplo). En la web certbot.eff.org podemos encontrar instrucciones detalladas para nuestro SO y configuración particular. En cualquier caso siempre podemos obtener el cliente directamente de git:

Esto nos deja el cliente listo para usar en /opt/certbot. A partir de aquí, tenemos la posibilidad de crear únicamente el certificado o de realizar también la instalación mediante los diferentes plugins según el sistema. ¡Sigan leyendo!

Disclaimer: el resto del tutorial está basado en esta instalación y por lo tanto se usa el wrapper certbot-auto, pero si se instala a través del sistema de paquetes basta con reemplazar los certbot-auto por certbot.

1.3. Restricciones en la creación de Certificados

Actualmente Let’s Encrypt cuenta con una serie de restricciones a la hora de obtener los certificados. La más relevante es quizás el límite de 20 certificados para un mismo dominio por semana (esto incluye certificados del mismo dominio pero distinto subdominio). Si sobrepasamos el límite lo único que debemos hacer es esperar 7 días hasta volver a solicitar uno nuevo. Las primeras veces que queramos obtener un certificado es fácil que tengamos que hacer varias peticiones hasta dar con la combinación que buscamos (si tenemos varios dominios, o si tenemos necesidades particulares de seguridad, etc), así que hay que tener cuidado con los intentos.

Otra restricción a tener en cuenta es la validez de los certificados, que es únicamente de 3 meses. Sin embargo en la práctica esta restricción tiene menor impacto ya que Let’s Encrypt ofrece en su cliente un modo de renovación que veremos cómo automatizar para olvidarnos de tener que hacer esta acción por completo.

Por último tenemos el tema de los dominios que podemos incluir en un certificado. Actualmente podemos añadir al certificado hasta 100 dominios que estén vinculados a la máquina (consultar las restricciones para obtener datos actualizados), y hemos de especificar esos dominios uno a uno. Es decir, no podemos pedir un certificado para cualquier subdominio del dominio (wildcard certificates), por ejemplo.

2. Creación de certificados

Ha llegado el momento de entrar en harina. Como hemos dicho, el cliente certbot nos permite crear certificados de Let’s Encrypt y nos permite hacer esto de varias formas según las necesidades que tengamos. Incluso cuenta con varios plugins para hacer la instalación de certificados de forma automática, como veremos después.

¡Importante! El cliente certbot necesita permisos de root tanto para crear el certificado (por ejemplo para poder guardarlo en /etc/letsencrypt) como para hacer la instalación con alguno de los plugins (para leer y modificar la configuración del webserver o hacer el bind del puerto 80 al 443).

Tanto si sólo queremos crear el certificado como si no existe la opción de instalación automática para nuestra plataforma, podemos usar el comando certonly.

Lo siguiente es ejecutar el propio comando. Hemos de indicar con -d cada dominio para el cual queremos el certificado (han de ser dominios asociados a la máquina en la que estamos) y un email de contacto en caso de necesidad. También podemos indicar otras propiedades como el tamaño de la clave RSA, pero eso es ya opcional. La primera vez que ejecutemos el cliente nos pedirá el email (si no lo hemos introducido en la llamada) y que aceptemos el acuerdo de Let’s Encrypt. Esto último también se puede automatizar mediante la opción –agree-tos.

Se nos abrirá una interfaz en el propio terminal donde nos preguntará qué vía queremos usar para hacer la autenticación con la entidad certificadora. Las opciones son: mediante el plugin de apache (que además de autorizarnos para obtener el certificado lo instala, como veremos más adelante), mediante un servidor local indicando el directorio webroot correspondiente o utilizando un servidor web temporal (standalone).

Obtención de certificado con certbot

2.1. Webroot

También podemos acceder directamente a la opción de autenticación que queramos por línea de comandos sin necesidad de pasar por la interfaz de selección. En el caso de la opción webroot sería:

Donde indicamos con la opción -w la dirección del directorio webroot correspondiente a los dominios que se indiquen justo después, cada uno acompañado de la opción -d. Y como se muestra en el ejemplo, se puede indicar más de un directorio webroot para dominios diferentes.

¡OJO! El plugin webroot crea un fichero temporal para cada uno de los dominios solicitados en ${webroot-path}/.well-known/acme-challenge . Esto quiere decir que el servidor ha de estar configurado para servir ficheros desde directorios ocultos, como es el caso de .well-known, o el servidor de validación de Let’s Encrypt no podrá comprobar que controlamos el dominio.

2.2. Standalone

Si no contamos con un servidor web local (o no queremos utilizarlo), podemos realizar la autenticación mediante un servidor temporal con el plugin standalone de certbot. La llamada sería:

El plugin necesita enlazar con el puerto 80 o el 443 para poder validar el dominio así que puede ser necesario parar un servidor existente antes de lanzar el cliente.

También se puede fijar el puerto a utilizar por el cliente mediante las opciones –standalone-supported-challenges http-01 para el 80 y –standalone-supported-challenges tls-sni-01 para el 443.

2.3. Manual

Y si nada de lo anterior te vale o simplemente eres todo un fanático del do it yourself siempre te queda la opción –manual (especificando certonly como en las anteriores) con la que te toca a ti realizar los pasos de la validación uno a uno. Nunca he utilizado esta opción pero según la documentación requiere copiar y pegar comandos en una sesión distinta del terminal que hasta puede estar en una máquina diferente.

2.4. Plugins y extensiones para la instalación automática

Hasta ahora hemos visto distintas formas de obtener el certificado y sólo quedaría instalarlo en función del servidor que tengamos. Aunque esto lo podemos hacer a mano, el cliente certbot cuenta con otros plugins que no sólo realizan la autenticación y nos proveen de un certificado sino que también se encargan de su instalación.

2.4.1. Apache

Si estamos ejecutando Apache 2.4 en un entorno basado en Debian (y con una versión 1.0+ del paquete libaugeas0), tenemos la opción de utilizar el plugin de Apache de Let’s Encrypt. Este nos permite automatizar no sólo la creación del certificado sino también su instalación, y todo esto sólo con añadir la opción –apache al comando anterior:

Esto lanza una interfaz en la propia línea de comandos donde se nos pide que aceptemos las condiciones legales y nos pregunta si queremos forzar que todo el tráfico sea por HTTPS, redirigiendo las peticiones del puerto 80 al 443. En función de nuestras respuestas, el cliente modifica el fichero de configuración de apache de nuestros dominios (por ejemplo /etc/apache2/sites-enabled/sub.domain.com.conf) y apuntará a los certificados creados.

En particular, se generará un certificado, un fichero de clave privada y uno de cadena de autenticación en el directorio: /etc/letsencrypt/archive/<nombre del dominio>. En nuestro ejemplo sería: /etc/letsencrypt/archive/sub.domain.com . Además, genera enlaces simbólicos a estos ficheros en el directorio: /etc/letsencrypt/live/<nombre del dominio>, que en nuestro ejemplo sería: /etc/letsencrypt/live/sub.domain.com

Aviso y consejo práctico: Let’s Encrypt es un poco especialito y no se lleva bien con los ficheros de configuración que contienen más de un virtualhost, como por ejemplo el del puerto 80 y el del 443 (da un error al no poder asociar un sólo virtualhost al dominio especificado). Si este es nuestro caso, antes de lanzar el cliente es mejor hacer un backup del .conf que ya tenemos en /etc/apache2/site-available y modificar el original para borrar el virtualhost del 443, dejando únicamente el del puerto 80. Luego, una vez hayamos instalado el certificado y haya creado el nuevo fichero para el 443 podemos completar este con las cosas que nos falten del backup.

El cliente crea un nuevo fichero de configuración de apache (/etc/apache2/sites-available/sub.domain.com-le-ssl.conf) donde se incluye la ruta a los enlaces anteriores. Sólo queda copiar del backup de nuestro fichero de configuración todo aquello que falte y añadírselo al fichero creado por Let’s Encrypt.

Podemos comprobar que el certificado se ha instalado correctamente utilizando el servicio de SSLLabs e indicando el nombre del dominio como parámetro del URL, que en nuestro ejemplo quedaría: https://www.ssllabs.com/ssltest/analyze.html?d=www.tea.ms

Ejemplo de resultado satisfactorio en SSL Labs

2.4.2. Plesk

Para el caso de Plesk la creación e instalación de certificados no viene integrada en el propio cliente sino que lo encontramos como un plugin de terceros. Lo podemos encontrar dentro de la propia herramienta de Plesk dentro del catálogo de extensiones. Sólo hemos de seleccionar la extensión de Let’s Encrypt e instalarla en nuestro Plesk.

Hecho esto la extensión aparecerá en nuestro listado de extensiones:

Listado de extensiones en Plesk

Para crear e instalar un nuevo certificado, seleccionamos la extensión de nuestra lista. Al entrar nos mostrará la lista de dominios correspondientes a la máquina. Seleccionamos el dominio sobre el que queremos crear el certificado y esto nos lleva a una nueva página donde hemos de indicar el email que queremos asociar y darle a Instalar. ¡Y listos!

La extensión no sólo crea e instala el certificado, sino que también añade la planificación para renovar el certificado cada 30 días (con lo que no haría falta seguir los pasos del siguiente punto). Vamos, que sólo le falta ponernos un lazo en el certificado 😛

2.4.3. Nginx

Aunque existe un plugin para la obtención e instalación de certificados en nginx está aún en fase experimental y no viene instalado junto con certbot-auto, aunque anuncian que una vez esté instalado podrá invocarse con la opción –nginx. Hasta entonces se puede obtener el certificado con alguno de los métodos comentados al principio de esta sección e instalarlo manualmente en el servidor.

3. Renovación de certificados

Como hemos comentado antes, el cliente de Let’s Encrypt cuenta con un modo de renovación de certificados. Este modo comprueba la validez de los certificados de la máquina y, si alguno está a menos de 30 días del fin de su validez, procede a su renovación con los mismos parámetros con los que se creó y que se guardaron en un fichero de configuración. El comando para ejecutar este modo es el siguiente:

Si queremos automatizar la renovación de los certificados de Let’s Encrypt podemos crear un cron en la propia máquina del dominio. Un cron es un proceso que se ejecuta periódicamente de acuerdo con un patrón determinado. Como hemos dicho los certificados caducan a los tres meses, así que podemos hacer una comprobación semanal o mensual de la necesidad de renovación. Estas comprobaciones no cuentan para el límite de certificados semanales a no ser que realmente haya que hacer una renovación. Así que no hay problema en crear el cron con mayor o menor periodicidad.

Para acceder a los crons de la máquina ejecutamos lo siguiente en el terminal:

Esto nos abre para su edición el fichero donde están definidos todos los crons instalados en la máquina. Para la renovación de los certificados basta con añadir la siguiente línea al final del fichero:

Esto lanzará el proceso de renovación todos los lunes (1) a las 11, y guardará el resultado del proceso al final del log indicado (respetando el contenido que huniera anteriormente o creando el fichero si no existiera).

4. Probando, probando…​

Como hemos comentado Let’s Encrypt nos pone un límite de certificados a la semana. Este límite puede ser insuficiente si es la primera vez que pedimos el certificado para la máquina y no tenemos claros los parámetros o si estamos probando si va a funcionar o no la renovación.

Por suerte los de Let’s Encrypt han pensado en todo y nos ofrecen la opción –dry-run. Al lanzar el cliente con esta opción con certonly o con renew nos dará un certificado de test (no válido) y que no guardará en disco. De esta forma podemos probar todo el proceso sin consumir nuestro límite de certificados y sin alterar nuestro sistema. Para ejecutarlo basta con hacer:

5. Conclusiones

El tráfico seguro en Internet es algo que nos beneficia a todos y ahora gracias a esta genial iniciativa de Let’s Encrypt cualquiera puede proteger el acceso a sus servidores. Además ha arrancado con un gran apoyo que ha conseguido una buena comunidad en poco tiempo. Prueba de ello es la gran cantidad de clientes y opciones que ya existen para generar nuestros certificados. Y aunque de momento existen ciertas limitaciones no debería representar un problema para usuarios medios.

6. Referencias

Por último, os dejo los enlaces en los que se puede encontrar más información (en inglés) sobre Let’s Encrypt y el cliente certbot:

5 Comentarios

  1. Gracias por la info respecto a certificados, en tal sentido, que metodo me recomienda si necesito los certificados para un servidor QA de una intranet, tras un proxy?.

    Salu2.

  2. Disculpa la molestia, no sabes si en let´s encrypt se puede utilizar * como para validar multisitios, digamos que *.midominio.com y que cualquier cosa que venga delante de .midominio.com me tome el msimo certificado?

  3. La web en español no tiene desperdicio, con frases como “Apoya un Web más seguro y respetador de la privacidad” te entran como ganas de soltar cosas como “que wea es aki?, me van a robal mis key bro?”

Dejar respuesta

Please enter your comment!
Please enter your name here