danvaida.letsencrypt

Estado de Construcción Galaxy

Rol de Ansible Let's Encrypt

Obtiene certificados TLS a través de ACME de Let's Encrypt.

Una vez que completes el(los) desafío(s) y obtengas el(los) Certificado(s), eres responsable de configurarlo(s) en tu(s) servidor(es) web de tu elección.

Requisitos

  • openssl
  • Python >= 2.7.9

Variables del Rol

  • letsencrypt_certs_dir: Ruta al directorio de trabajo, donde se guardarán todos los CSRs, Claves y Certificados.

  • letsencrypt_account_key_name: Nombre de la clave RSA de la cuenta de Let's Encrypt.

  • letsencrypt_account_key_size: Tamaño de la clave RSA de la cuenta de Let's Encrypt.

  • letsencrypt_certs_to_generate: Lista de certificados a generar.

    • account_email: Dirección de correo electrónico que se intercambiará con el servidor ACME. Recibirás advertencias sobre la expiración del certificado.

    • account_key: Ruta al archivo de clave RSA.

    • acme_directory: Endpoint de la API de ACME. Usa el entorno de pruebas de Let's Encrypt por defecto.

    • agreement: URI del documento de Términos de Servicio con el que estás de acuerdo.

    • challenge: El tipo de desafío aceptado.

    • csr: Ruta al archivo CSR.

    • dest: Ruta al archivo del Certificado resultante (donde lo deseas guardar).

    • remaining_days: Número de días para que el certificado sea válido.

Dependencias

N/A

Ejemplo de Playbook

En este ejemplo, estamos solicitando un certificado de Let's Encrypt, aunque en teoría, este módulo de Ansible debería ser compatible con cualquier servidor ACME.

Tenemos tres tareas:

  1. crear CSR, Clave y emitir una solicitud para la liberación del certificado
  2. completar el desafío (registro DNS en Route53 en este caso)
  3. pedir validación del desafío y otorgar el certificado.
    - name: Paso ACME 1
      hosts: localhost
      connection: local
      roles:
        - role: letsencrypt
          letsencrypt_certs_dir:         './files/production/certs'
          letsencrypt_account_key_name:  'letsencrypt_account'
          letsencrypt_account_key_size:  2048
          letsencrypt_certs_to_generate:
            - domain: 'tu-dominio.com'
              key_size: 2048
              account_email: '[email protected]'
              account_key: "{{ letsencrypt_certs_dir }}/{{ letsencrypt_account_key_name }}.key"
              challenge: 'dns-01'
              agreement: 'https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf'
              csr: "{{ letsencrypt_certs_dir }}/tu-dominio.com/tu.csr"
              dest: "{{ letsencrypt_certs_dir }}/tu-dominio.com/dominio.crt"
              acme_directory: 'https://acme-v01.api.letsencrypt.org/directory'
          tags: letsencrypt

      tasks:
        - name: Lista de registros de Route53 que deben ser creados deben ser establecidos como hecho
          set_fact:
            route53_records_to_add: "{{
              route53_records_to_add | default([]) +
              [{'zone': item.1.domain,
              'record': item.0.challenge_data[item.1.domain]['dns-01']['resource'] + '.' + item.1.domain + '.',
              'ttl': 300,
              'type': 'TXT',
              'value': '\"' + item.0.challenge_data[item.1.domain]['dns-01']['resource_value'] + '\"' }]
              }}"
          with_together:
            - "{{ letsencrypt_acme_step_one }}"
            - "{{ letsencrypt_certs_to_obtain | default([]) }}"
          when: item.1.domain == item.0.item.domain
          tags: route53

    - name: Resolución del desafío ACME (registro DNS en Route53)
      hosts: localhost
      connection: local
      roles:
        - role: route53
          tags: route53

    - name: Paso ACME 2
      hosts: localhost
      connection: local
      pre_tasks:
        - name: Debemos esperar a que los cambios de DNS se propaguen
          pause: minutes=1

      roles:
        - role: letsencrypt
          letsencrypt_acme_step: two
          tags: letsencrypt

Completar otros tipos de desafíos debería ser lo mismo y transparente para este rol.

Pruebas

Las pruebas dependen del tipo de desafío DNS y se resuelven a través de AWS Route53.

Si deseas ejecutar las pruebas en el entorno de docker proporcionado, ejecuta los siguientes comandos:

$ cd /ruta/a/ansible-roles/letsencrypt
$ ansible-galaxy install \
    --force \
    --role-file=./tests/requirements.yml \
    --roles-path=./tests/dependencies
$ docker build \
    --no-cache \
    --pull \
    --tag ansible-roles-test \
    tests/support
$ docker run \
    --rm \
    --interactive \
    --tty \
    --volume $PWD:/etc/ansible/roles/letsencrypt \
    --volume $PWD/tests/dependencies:/etc/ansible/roles/letsencrypt/tests/roles:ro \
    --env AWS_ACCESS_KEY=$AWS_ACCESS_KEY \
    --env AWS_SECRET_KEY=$AWS_SECRET_KEY \
    --workdir /etc/ansible/roles/letsencrypt/tests \
    ansible-roles-test

Tareas pendientes

  • Soporte para otros tipos de desafíos
  • Soporte para otras APIs de servicios DNS (es decir, Cloud DNS)
  • Integración con algunos roles de servidores web (es decir, NGINX, Apache)
  • Soporte para renovación
  • Soporte para múltiples versiones de Ansible y distribuciones
  • Actualizar Ansible en la imagen Docker de las pruebas para poder no especificar el acuerdo para el desafío DNS.

Licencia

Este proyecto está licenciado bajo los términos de la licencia GNU GPL v3.0.

Información del Autor

Rol creado por Dan Vaida.

Contribuciones

Consulta la lista de Tareas Pendientes. Las contribuciones son bienvenidas.

Acerca del proyecto

Obtains TLS certificates through ACME from Let's Encrypt.

Instalar
ansible-galaxy install danvaida.letsencrypt
Licencia
lgpl-3.0
Descargas
225
Propietario
sysadmin & solutions architect