Crear Creación y auto renovación de certificados Let's Encrypt authored by Santiago Martinez's avatar Santiago Martinez
Para proveer a un host de certificados Let's Encrypt y programar su autorenovación utilizamos el role de la galaxia [geerlingguy.certbot](https://github.com/geerlingguy/ansible-role-certbot).
Este role implementa la instalación de [Certbot](https://certbot.eff.org/) 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í](https://github.com/geerlingguy/ansible-role-certbot/blob/master/defaults/main.yml), pero las fundamentales son las siguientes:
```yaml
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
```