danvaida.letsencrypt

Buildstatus Galaxy

Ansible Let's Encrypt Rolle

Erhält TLS-Zertifikate über ACME von Let's Encrypt.

Sobald Sie die Herausforderung(en) abgeschlossen und das/die Zertifikat(e) erhalten haben, sind Sie dafür verantwortlich, es/sie in Ihren gewünschten Webserver(n) einzurichten.

Anforderungen

  • openssl
  • Python >= 2.7.9

Rollenvariablen

  • letsencrypt_certs_dir: Pfad zum Arbeitsverzeichnis, in dem alle CSRs, Schlüssel und Zertifikate gespeichert werden.

  • letsencrypt_account_key_name: Name des RSA-Schlüssels des Let's Encrypt-Kontos.

  • letsencrypt_account_key_size: Größe des RSA-Schlüssels des Let's Encrypt-Kontos.

  • letsencrypt_certs_to_generate: Liste der zu erzeugenden Zertifikate.

    • account_email: E-Mail-Adresse, die mit dem ACME-Server ausgetauscht wird. Sie erhalten Warnungen zur Zertifikatsablauf.

    • account_key: Pfad zur RSA-Schlüsseldatei.

    • acme_directory: ACME API-Endpunkt. Verwendet standardmäßig die Staging-Umgebung von Let's Encrypt.

    • agreement: URI zu den Nutzungsbedingungen, denen Sie zustimmen.

    • challenge: Der akzeptierte Herausforderungstyp.

    • csr: Pfad zur CSR-Datei.

    • dest: Pfad zur resultierenden Zertifikatsdatei (wo Sie es speichern möchten).

    • remaining_days: Anzahl der Tage, für die das Zertifikat gültig sein soll.

Abhängigkeiten

Nicht zutreffend

Beispiel Playbook

In diesem Beispiel fragen wir ein Zertifikat von Let's Encrypt an, obwohl dieses Ansible-Modul theoretisch mit jedem ACME-Server kompatibel sein sollte.

Wir haben drei Plays:

  1. CSR, Schlüssel erstellen und Anfrage zur Zertifikatsausstellung stellen.
  2. Die Herausforderung abschließen (DNS-Eintrag in Route53 in diesem Fall).
  3. Um Bestätigung der Herausforderung bitten und das Zertifikat anfordern.
    - name: ACME Schritt 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: 'your-domain.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 }}/your-domain.com/your.csr"
              dest: "{{ letsencrypt_certs_dir }}/your-domain.com/domain.crt"
              acme_directory: 'https://acme-v01.api.letsencrypt.org/directory'
          tags: letsencrypt

      tasks:
        - name: Die Liste der zu erstellenden Route53-Einträge sollte als Fakt festgelegt werden
          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: ACME Herausforderung lösen (DNS-Eintrag in Route53)
      hosts: localhost
      connection: local
      roles:
        - role: route53
          tags: route53

    - name: ACME Schritt 2
      hosts: localhost
      connection: local
      pre_tasks:
        - name: Wir sollten warten, bis sich die DNS-Änderungen ausbreiten
          pause: minutes=1

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

Die Lösung anderer Herausforderungstypen sollte für diese Rolle gleich und transparent sein.

Testen

Die Tests basieren auf dem DNS-Herausforderungstyp und lösen ihn über AWS Route53.

Wenn Sie die Tests in der bereitgestellten Docker-Umgebung ausführen möchten, führen Sie die folgenden Befehle aus:

$ cd /path/to/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

To-Do

  • Unterstützung anderer Herausforderungstypen
  • Unterstützung anderer DNS-Dienste APIs (z.B. Cloud DNS)
  • Integration mit einigen Webserver-Rollen (z.B. NGINX, Apache)
  • Unterstützung der Verlängerung
  • Unterstützung mehrerer Ansible-Versionen und Distributionen
  • Aktualisierung von Ansible im Test-Docker-Image, um die Vereinbarung für die DNS-Herausforderung nicht angeben zu müssen.

Lizenz

Dieses Projekt ist unter den Bedingungen der GNU GPL v3.0 Lizenz lizenziert.

Autoreninformation

Rolle erstellt von Dan Vaida.

Beiträge

Siehe die To-Do Liste. Beiträge sind willkommen.

Über das Projekt

Obtains TLS certificates through ACME from Let's Encrypt.

Installieren
ansible-galaxy install danvaida.letsencrypt
GitHub Repository
Lizenz
lgpl-3.0
Downloads
225
Besitzer
sysadmin & solutions architect