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 URLhttp://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.