Creación y auto-renovación de certificados Let's Encrypt » History » Version 1

Santiago Martinez, 10/15/2019 08:30 PM
Documentación del procedimiento

1 1 Santiago Martinez
h1. Creación y auto-renovación de certificados Let's Encrypt
2 1 Santiago Martinez
3 1 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. 
4 1 Santiago Martinez
5 1 Santiago Martinez
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_).
6 1 Santiago Martinez
7 1 Santiago Martinez
> 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.)
8 1 Santiago Martinez
9 1 Santiago Martinez
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).
10 1 Santiago Martinez
11 1 Santiago Martinez
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:
12 1 Santiago Martinez
<pre>
13 1 Santiago Martinez
certbot_auto_renew: true
14 1 Santiago Martinez
certbot_auto_renew_user: "root"
15 1 Santiago Martinez
certbot_auto_renew_hour: 4
16 1 Santiago Martinez
certbot_auto_renew_minute: 24
17 1 Santiago Martinez
certbot_auto_renew_options: '--quiet --no-self-upgrade --pre-hook "service nginx stop" --post-hook "service nginx start"'
18 1 Santiago Martinez
19 1 Santiago Martinez
certbot_create_if_missing: true
20 1 Santiago Martinez
certbot_admin_email: adminsys@cci.edu.uy
21 1 Santiago Martinez
certbot_certs:
22 1 Santiago Martinez
  - domains:
23 1 Santiago Martinez
      - nuevo-host.interior.edu.uy
24 1 Santiago Martinez
      - alias-nuevo-host.interior.edu.uy
25 1 Santiago Martinez
26 1 Santiago Martinez
certbot_create_standalone_stop_services:
27 1 Santiago Martinez
  - nginx
28 1 Santiago Martinez
</pre>
29 1 Santiago Martinez
30 1 Santiago Martinez
Los nombres de las variables son bastante descriptivos, y nos permiten establecer respectivamente:
31 1 Santiago Martinez
* si se programará la autorenovación de los certificados
32 1 Santiago Martinez
* usuario, hora y minuto de cada día en que se ejecuta la tarea de renovación 
33 1 Santiago Martinez
* 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_)
34 1 Santiago Martinez
* si se creará el certificado en caso de no existir
35 1 Santiago Martinez
* qué nombres de dominio se incluirán en el certificado (Puede ser mas de uno)
36 1 Santiago Martinez
* 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: []_*
37 1 Santiago Martinez
38 1 Santiago Martinez
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:
39 1 Santiago Martinez
<pre>
40 1 Santiago Martinez
ansible-playbook --limit <fqdn-host-a-certificar> --tags certbot site.yml
41 1 Santiago Martinez
</pre>