danvaida.letsencrypt
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:
- tworzenie CSR, klucza i żądanie wydania certyfikatu
- wypełnienie wyzwania (rekordu DNS w Route53 w tym przypadku)
- 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.
Obtains TLS certificates through ACME from Let's Encrypt.
ansible-galaxy install danvaida.letsencrypt