danvaida.letsencrypt

Status budowy Galaxy

Rola Ansible Let's Encrypt

Uzyskuje certyfikaty TLS poprzez ACME z Let's Encrypt.

Po zakończeniu wyzwań i uzyskaniu certyfikatu, jesteś odpowiedzialny za jego konfigurację na swoim serwerze www.

Wymagania

  • openssl
  • Python >= 2.7.9

Zmienne roli

  • letsencrypt_certs_dir: Ścieżka do katalogu roboczego, w którym będą przechowywane wszystkie CSRy, klucze i certyfikaty.

  • letsencrypt_account_key_name: Nazwa klucza RSA konta Let's Encrypt.

  • letsencrypt_account_key_size: Rozmiar klucza RSA konta Let's Encrypt.

  • letsencrypt_certs_to_generate: Lista certyfikatów do wygenerowania.

    • account_email: Adres e-mail, który będzie wymieniany z serwerem ACME. Otrzymasz powiadomienia o wygaśnięciu certyfikatu.

    • account_key: Ścieżka do pliku klucza RSA.

    • acme_directory: Punkt końcowy API ACME. Domyślnie używa środowiska testowego Let's Encrypt.

    • agreement: URI do dokumentu z warunkami używania, z którymi się zgadzasz.

    • challenge: Akceptowany typ wyzwania.

    • csr: Ścieżka do pliku CSR.

    • dest: Ścieżka do wynikowego pliku certyfikatu (gdzie chcesz go przechować).

    • remaining_days: Liczba dni, przez które certyfikat będzie ważny.

Zależności

Brak

Przykład Playbooka

W tym przykładzie żądamy certyfikatu od Let's Encrypt, choć w teorii ten moduł Ansible powinien być kompatybilny z każdym serwerem ACME.

Mamy trzy odgry:

  1. tworzenie CSR, klucza i żądanie wydania certyfikatu
  2. wypełnienie wyzwania (rekordu DNS w Route53 w tym przypadku)
  3. poproszenie o zweryfikowanie wyzwania i przyznanie certyfikatu.
    - name: ACME Krok 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: 'twoja-domena.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 }}/twoja-domena.com/your.csr"
              dest: "{{ letsencrypt_certs_dir }}/twoja-domena.com/domain.crt"
              acme_directory: 'https://acme-v01.api.letsencrypt.org/directory'
          tags: letsencrypt

      tasks:
        - name: Lista rekordów Route53 do utworzenia powinna być ustawiona jako fakt
          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: Rozwiązywanie wyzwania ACME (rekord DNS w Route53)
      hosts: localhost
      connection: local
      roles:
        - role: route53
          tags: route53

    - name: ACME Krok 2
      hosts: localhost
      connection: local
      pre_tasks:
        - name: Powinniśmy poczekać na propagację zmian DNS
          pause: minutes=1

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

Wszystkie inne typy wyzwań powinny działać tak samo i być przezroczyste dla tej roli.

Testowanie

Testy opierają się na typie wyzwania DNS i rozwiązują je za pomocą AWS Route53.

Jeśli chcesz uruchomić testy w dostarczonym środowisku dockerowym, uruchom następujące polecenia:

$ cd /ścieżka/do/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

Do zrobienia

  • Wsparcie dla innych typów wyzwań
  • Wsparcie dla API innych usług DNS (np. Cloud DNS)
  • Integracja z niektórymi rolami serwerów www (np. NGINX, Apache)
  • Wsparcie dla odnawiania
  • Wsparcie dla wielu wersji Ansible i dystrybucji
  • Aktualizacja Ansible w obrazie Docker testowym, aby nie wymagał podawania zgody na wyzwanie DNS.

Licencja

Ten projekt jest licencjonowany na zasadach licencji GNU GPL v3.0.

Informacje o autorze

Rola stworzona przez Dan Vaida.

Wkłady

Zobacz listę Do zrobienia. Wkłady są mile widziane.

O projekcie

Obtains TLS certificates through ACME from Let's Encrypt.

Zainstaluj
ansible-galaxy install danvaida.letsencrypt
Licencja
lgpl-3.0
Pobrania
225
Właściciel
sysadmin & solutions architect