Certificados HTTPS gratuitos con Let’s Encrypt

Para poder habilitar correctamente el protocolo HTTPS en un servidor web (sin que los navegadoras bloqueen el acceso al site por razones de seguridad) se debe contar con un certificado emitido por una autoridad (certificate authority) reconocida.

Let’s Encrypt provee certificados de autenticación de dominios gratuitos con un plazo de validez de 90 días que pueden ser renovados indefinidamente (cuando se está cerca del período de expiración) de forma también gratuita. Este post describe el método que estoy utilizando para gestionar los certificados de mis sitios web públicos.

Condiciones iniciales

Se cuenta con un conjunto de servicios web que se prestan desde un servidor con las siguientes condiciones:

  • Los servicios se prestan desde un equipo con una distribución de Linux.
  • El servidor web utilizado es nginx.
  • Existe un dominio principal example.com del cual se definen subdominios site1.example.com y site2.example.com que corresponden a diferentes servicios.

Instalación de certbot

Let’s Encrypt utiliza el protocolo ACME para la gestión de los certificados. Esta gestión puede realizarse a través del cliente certbot.
Las instrucciones varían para cada distribución de Linux y pueden consultarse en este enlace pero, para una distribución Debian Stretch pueden directamente cargarse de los repositorios del sistema con:

$ sudo apt-get install certbot

Para que el mecanismo de certificación funcione correctamente certbot debe poder realizar modificaciones sobre un directorio .well‑known local que, al mismo tiempo, deberá ser publicado dentro del dominio principal como http://example.com/.well‑known.
Como estamos utilizando nginx, dentro de la sección server correspondiente al dominio principal example.com con el protocolo HTTP (no al servicio sobre SSL/TLS sino al acceso HTTP sin cifrado) insertamos la sección:

# Let's Encrypt certificates validation
location /.well-known {
    root    /var/local;
}
NOTA
El acceso desde la web a este directorio será siempre de lectura ya que el único proceso que escribirá en .well‑known será el propio cliente de certbot cuando es invocado.

Creación de los certificados

Un vez instalado certbot y con el entorno correctamente configurado se crean los certificados con:

$ sudo certbot certonly --webroot -w /var/local/ -d example.com -d site1.example.com -d site2.example.com
NOTA
Utilizamos el parámetro -w /var/local/ ya que en la configuración realizada en el paso anterior hemos asociado /var/local/.well‑known a la URL http://example.com/.well‑known.

Uso de los certificados

Como resultado de la ejecución exitosa del comando certbot certonly se generarán los directorios /etc/letsencrypt/example.com /etc/letsencrypt/site1.example.com y /etc/letsencrypt/site2.example.com y dentro de cada uno de estos directorios se encuentran los ficheros fullchain.pem y privkey.pem con el certificado y la clave de cifrado respectivamente.
Para incorporar el certificado a cada servicio, accedemos a la sección server correspondiente a la configuración HTTPS de ese servicio e incorporamos las el certificado y la clave de cifrado junto con el resto de parámetros de SSL.
Por ejemplo, para el caso del site1.example.com incorporamos las siguientes líneas en la sección server correspondiente:

    ssl                  on;
    ssl_certificate /etc/letsencrypt/live/site1.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/site1.example.com/privkey.pem;
    ssl_session_timeout 5m;
    ssl_protocols        TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA
256: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-S
HA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
    ssl_prefer_server_ciphers on;

Renovación de los certificados

Para simplemente actualizar los certificados el comando a ejecutar es:

$ sudo certbot renew

Alternativamente y de forma interactiva, puede volver a ejecutarse el comando original:

$ sudo certbot certonly --webroot -w /var/local/ -d example.com -d site1.example.com -d site2.example.com

Este comando preguntará si simplemente se desea renovar los certificados y permite jugar agregando o quitando dominios con la opción -d para agregar o quitar certificados.

José Administrator
Apasionado por el software, la electrónica y la fotografía.
follow me

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *