Creación y auto-renovación de certificados Let's Encrypt

Para proveer a un host de certificados Let's Encrypt y programar su autorenovación utilizamos el role de la galaxia geerlingguy.certbot.

Este role implementa la instalación de Certbot y mediante él la creación y renovación de certificados (la renovación es programada con una tarea cron).

Ya que el proceso de cración/renovación requiere validar los dominios solicitados mediante un challenge, es necesario que el servidor cuente el el puerto 80/tcp accesible desde internet. Esto implica que el forwarding esté habilitado en todos los firewalls que se interpongan entre internet y el host (físico, Proxmox, interno, etc.)

Como primer paso, debemos agregar el host que nos interesa certificar al grupo seciu_certbot del inventario del proyecto config (hosts_stage o hosts_prod segun corresponda).

Posteriormente definimos las host_vars para el mismo en un nuevo archivo. Todas las variables disponibles puedes consultarlas aquí, pero las fundamentales son las siguientes:

certbot_auto_renew: true
certbot_auto_renew_user: "root" 
certbot_auto_renew_hour: 4
certbot_auto_renew_minute: 24
certbot_auto_renew_options: '--quiet --no-self-upgrade --pre-hook "service nginx stop" --post-hook "service nginx start"'

certbot_create_if_missing: true
certbot_admin_email: adminsys@cci.edu.uy
certbot_certs:
  - domains:
      - nuevo-host.interior.edu.uy
      - alias-nuevo-host.interior.edu.uy

certbot_create_standalone_stop_services:
  - nginx

Los nombres de las variables son bastante descriptivos, y nos permiten establecer respectivamente:
  • si se programará la autorenovación de los certificados
  • usuario, hora y minuto de cada día en que se ejecuta la tarea de renovación
  • parámetros adicionales en la renovación (Este es de fundamental importancia ya que en el podremos (y deberemos) detener los servicios que ocupen el puerto 80/tcp mientras se ejecuta el challenge. En el ejemplo es nginx)
  • si se creará el certificado en caso de no existir
  • qué nombres de dominio se incluirán en el certificado (Puede ser mas de uno)
  • servicios a detener (para liberar el puerto 80/tcp) cuando se va a crear el certificado por primera vez. Tener en cuenta que de no existir el servicio, el role fallará. Si no debe detenerse ninguno, declarar la lista vacía certbot_create_standalone_stop_services: []

Una vez establecidas todas las variables (y habilitado el tráfico en el puerto 80/tcp), solo resta ejecutar los playbooks con el tag correspondiente:

ansible-playbook --limit <fqdn-host-a-certificar> --tags certbot site.yml