Jak korzystać ze sprawdzania poprawności wyzwania Let's Encrypt DNS?

160

Let's Encrypt ogłosił, że mają:

Włączono obsługę wyzwania DNS ACME

Jak ./letsencrypt-autowygenerować nowy certyfikat przy użyciu sprawdzania poprawności domeny DNS?

EDYCJA
Mam na myśli: Jak uniknąć http/httpswiązania portów, używając nowo ogłoszonej funkcji (2015-01-20), która pozwala udowodnić własność domeny poprzez dodanie określonego rekordu TXT w strefie DNS domeny docelowej?

Pierre Prinetti
źródło
3
Uwaga dodatkowa: Certbot (jest to nowa nazwa klienta letsencrypt) teraz domyślnie zezwala na uwierzytelnianie oparte na webroocie.
Pierre Prinetti

Odpowiedzi:

203

Obecnie możliwe jest sprawdzenie poprawności DNS również za pomocą klienta certbot LetsEncrypt w trybie ręcznym. Możliwa jest również automatyzacja (patrz poniżej).

Wtyczka ręczna

Możesz albo dokonać ręcznej weryfikacji - za pomocą ręcznej wtyczki.

certbot -d bristol3.pki.enigmabridge.com --manual --preferred-challenges dns certonly

Certbot dostarczy następnie instrukcje dotyczące ręcznej aktualizacji rekordu TXT dla domeny w celu kontynuacji sprawdzania poprawności.

Please deploy a DNS TXT record under the name
_acme-challenge.bristol3.pki.enigmabridge.com with the following value:

667drNmQL3vX6bu8YZlgy0wKNBlCny8yrjF1lSaUndc

Once this is deployed,
Press ENTER to continue

Po zaktualizowaniu rekordu DNS naciśnij klawisz Enter, certbot będzie kontynuował, a jeśli LetsEncrypt CA zweryfikuje wyzwanie, certyfikat zostanie wydany jak zwykle.

Możesz także użyć polecenia z większą liczbą opcji, aby zminimalizować interaktywność i odpowiadać na pytania certyfikatów. Pamiętaj, że ręczna wtyczka nie obsługuje jeszcze trybu nieinteraktywnego.

certbot --text --agree-tos --email [email protected] -d bristol3.pki.enigmabridge.com --manual --preferred-challenges dns --expand --renew-by-default  --manual-public-ip-logging-ok certonly

Odnowienie nie działa z ręczną wtyczką, ponieważ działa w trybie nieinteraktywnym. Więcej informacji w oficjalnej dokumentacji Certbot .

Aktualizacja: ręczne zaczepy

W nowej wersji Certbot można używać haków , na przykład --manual-auth-hook, --manual-cleanup-hook. Haki to zewnętrzne skrypty wykonywane przez Certbot w celu wykonania zadania.

Informacje są przekazywane w zmiennych środowiskowych - np. Domena do weryfikacji, token wyzwania. Vars: CERTBOT_DOMAIN, CERTBOT_VALIDATION, CERTBOT_TOKEN.

certbot certonly --manual --preferred-challenges=dns --manual-auth-hook /path/to/dns/authenticator.sh --manual-cleanup-hook /path/to/dns/cleanup.sh -d secure.example.com

Możesz napisać własny moduł obsługi lub użyć już istniejącego, istnieje wiele dostępnych, np. Dla Cloudflare DNS.

Więcej informacji na temat oficjalnej dokumentacji haków Certbot

Automatyzacja, odnawianie, tworzenie skryptów

Jeśli chcesz zautomatyzować weryfikację wyzwań DNS, obecnie nie jest to możliwe dzięki vanila certbot. Aktualizacja: pewna automatyzacja jest możliwa dzięki hakom Certbot.

W ten sposób stworzyliśmy prostą wtyczkę, która obsługuje skrypty z automatyzacją DNS. Jest dostępny jako certbot-external-auth .

pip install certbot-external-auth

Obsługuje metody sprawdzania poprawności DNS, HTTP, TLS-SNI. Można go użyć w trybie modułu obsługi lub w trybie wyjściowym JSON.

Tryb obsługi

W trybie obsługi wtyczka certbot + wywołuje zewnętrzne zaczepienia (program, skrypt powłoki, python, ...) w celu przeprowadzenia weryfikacji i instalacji. W praktyce piszesz prosty skrypt obsługi / powłoki, który pobiera argumenty wejściowe - domena, token i dokonuje zmiany w DNS. Po zakończeniu procedury obsługi certbot kontynuuje walidację jak zwykle.

Daje to dodatkową elastyczność, możliwa jest także odnowa.

Tryb obsługi jest również kompatybilny z hakami odwodnionego DNS (wcześniej letsencrypt.sh). Istnieje już wiele haków DNS dla popularnych dostawców (np. CloudFlare, GoDaddy, AWS). W repozytorium znajduje się plik README z obszernymi przykładami i procedurami obsługi przykładów.

Przykład z hakiem odwodnionego DNS:

certbot \
    --text --agree-tos --email [email protected] \
    --expand --renew-by-default \
    --configurator certbot-external-auth:out \
    --certbot-external-auth:out-public-ip-logging-ok \
    -d "bristol3.pki.enigmabridge.com" \
    --preferred-challenges dns \
    --certbot-external-auth:out-handler ./dehydrated-example.sh \
    --certbot-external-auth:out-dehydrated-dns \
    run 

Tryb JSON

Kolejnym trybem wtyczki jest tryb JSON. Tworzy jeden obiekt JSON w wierszu. Umożliwia to bardziej skomplikowaną integrację - np. Ansible lub jakiś menedżer wdrażania dzwoni do certbota. Komunikacja odbywa się za pośrednictwem STDOUT i STDIN. Cerbot produkuje obiekt JSON z danymi w celu przeprowadzenia weryfikacji, np.

certbot \
    --text --agree-tos --email [email protected] \
    --expand --renew-by-default \
    --configurator certbot-external-auth:out \
    --certbot-external-auth:out-public-ip-logging-ok \
    -d "bristol3.pki.enigmabridge.com" \
    --preferred-challenges dns \
    certonly 2>/dev/null

{"cmd": "perform_challenge", "type": "dns-01", "domain": "bs3.pki.enigmabridge.com", "token": "3gJ87yANDpmuuKVL2ktfQ0_qURQ3mN0IfqgbTU_AGS4", "validation": "ejEDZXYEeYHUxqBAiX4csh8GKkeVX7utK6BBOBshZ1Y", "txt_domain": "_acme-challenge.bs3.pki.enigmabridge.com", "key_auth": "3gJ87yANDpmuuKVL2ktfQ0_qURQ3mN0IfqgbTU_AGS4.tRQM98JsABZRm5-NiotcgD212RAUPPbyeDP30Ob_7-0"}

Po aktualizacji DNS wywołujący wysyła znak nowej linii do STDIN certbota, aby go zasygnalizować, może kontynuować sprawdzanie poprawności.

Umożliwia to automatyzację i zarządzanie certyfikatami z centralnego serwera zarządzania. Do instalacji możesz wdrożyć certyfikaty przez SSH.

Aby uzyskać więcej informacji, zapoznaj się z plikiem Readme i przykładami na GitHub certbot-external-auth .

EDYCJA: Jest też nowy post na blogu opisujący problem z weryfikacją DNS i użyciem wtyczki.

EDYCJA: obecnie pracujemy nad 2-etapową weryfikacją Ansible, wkrótce będzie dostępna.

ph4r05
źródło
Podczas migracji witryny na inny serwer możesz chcieć nowego certyfikatu przed przełączeniem rekordu A. Możesz użyć metody ręcznej ( certbot certonly --preferred-challenges dns -d example.com) dla pierwszego żądania. Po przetestowaniu i przełączeniu rekordu A użyj wspólnej metody webroot ( certbot certonly webroot -d example.com -w /path/to/webroot), używając dokładnie takich samych nazw domen jak poprzednio. Jeśli zostanie to wykonane poprawnie, certbot rozpozna istniejący certyfikat / konfigurację i zaktualizuje ustawienia odnawiania, więc certyfikat zostanie automatycznie odnowiony w przyszłości.
marcovtwout
Działa,
strzeż się
Z pewnością chcę wiedzieć, co oznacza --manual-public-ip-logowanie-ok ... dokumentacja jest na ten temat tajemnicza, a wszystkie przykłady, które go używają, nie wyjaśniają ... w tym ten.
Rondo
Czy proces odnowienia wymaga każdorazowo nowego rekordu TXT?
Old Geezer
1
@Rondo Gdy poprosisz o certyfikat przy użyciu interaktywnego trybu ręcznego, pojawi się następujący monit: UWAGA: Adres IP tego komputera zostanie publicznie zalogowany jako żądający tego certyfikatu. Jeśli uruchamiasz certbota w trybie ręcznym na komputerze, który nie jest Twój serwer, upewnij się, że wszystko jest w porządku ”. Ta opcja mówi tak dla tego monitu.
muru
39

Byłem w stanie użyć dehydratedklienta do uzyskania certyfikatu przy użyciu sprawdzania poprawności DNS.

https://github.com/lukas2511/dehydrated

./dehydrated --cron --domain my.domain.example.com --hook ./hook.route53.rb --challenge dns-01

Musisz użyć poprawnego haka sprawdzania poprawności DNS dla swojej domeny, ale istnieje kilka opcji dostępnych jako przykłady:

https://github.com/lukas2511/dehydrated/wiki/Examples-for-DNS-01-hooks

alexcline
źródło
To działało dla mnie naprawdę dobrze. Jedyne zastrzeżenie, które chciałbym dodać, to to, że musiałem zainstalować kilka zależności klejnotów zdefiniowanych w route53.rbskrypcie przechwytującym .
jmreicha
10

Na dzień dzisiejszy oficjalny klient nie obsługuje (jeszcze) typu wyzwania DNS-01.

Zobacz https://community.letsencrypt.org/t/status-of-official-letsencrypt-clients-dns-01-challenge-support/9427

Nie spojrzałem na to, więc tak naprawdę nie wiem. Moje zrozumienie na wysokim poziomie było po prostu „brakiem wsparcia dla naszego klienta Python dla wyzwania DNS”.

Możesz śledzić postępy w tym PR . Alternatywnie, niektórzy klienci już to obsługują.

Simone Carletti
źródło
3

Jak wspomniano w poprzednich odpowiedziach, możesz łatwo zweryfikować domenę przez DNS za pomocą:

  1. zainstaluj wymagane aplikacje (w systemie Ubuntu): apt-get install -y git ruby letsencrypt git clone https://github.com/lukas2511/dehydrated.git git clone https://github.com/jbjonesjr/letsencrypt-manual-hook.git dehydrated/hooks/manual
  2. wygeneruj certyfikat z ręcznym potwierdzeniem wyzwania DNS dla www.example.com (zamień na swoją domenę): ./dehydrated/dehydrated -c -t dns-01 -d www.example.com -k ./dehydrated/hooks /manual/manual_hook.rb
panticz.de
źródło
3

Po wypróbowaniu różnych kombinacji, to działało dla mnie przy użyciu odwodnionych i letsencrypt-manual-hook- repozytoria git. Jeśli poniższe kroki działają dla Ciebie, nie zapomnij oznaczyć gwiazdką tych repozytoriów

UWAGA: Jest to dodatek do odpowiedzi panticz.de i alexcline

~$ git clone https://github.com/lukas2511/dehydrated.git
~$ git clone https://github.com/jbjonesjr/letsencrypt-manual-hook.git dehydrated/hooks/manual
~$ cd dehydrated
~$ ./dehydrated --register --accept-terms
~$ ./dehydrated --cron --challenge dns-01 --domain your.domain.com --hook ./hooks/manual/manual_hook.rb
#
# !! WARNING !! No main config file found, using default config!
#
Processing your.domain.com
 + Signing domains...
 + Creating new directory /Users/vikas/dehydrated/certs/your.domain.com ...
 + Creating chain cache directory /Users/vikas/dehydrated/chains
 + Generating private key...
 + Generating signing request...
 + Requesting authorization for your.domain.com...
 + 1 pending challenge(s)
 + Deploying challenge tokens...
Checking for pre-existing TXT record for the domain: '_acme-challenge.your.domain.com'.
Create TXT record for the domain: '_acme-challenge.your.domain.com'. TXT record:
'gkIxxxxxxxIcAESmjF8pjZGQrrZxxxxxxxxxxx'
Press enter when DNS has been updated...

Otrzymasz skrót (po uruchomieniu powyższego polecenia), utwórz rekord TXT w swoim DNS. Upewnij się, że działa, uruchamiając poniższe polecenie lub GSuite Toolbox

~$ dig TXT _acme-challenge.your.domain.com. +short @8.8.8.8
"gkIxxxxxxxIcAESmjF8pjZGQrrZxxxxxxxxxxx"
~$

Teraz naciśnij klawisz Enter po znaku zachęty. Nie działało to dla mnie, chociaż rekord TXT został zaktualizowany. Musiałem nacisnąć Ctrl + C i ponownie uruchomić polecenie.

~$ ./dehydrated --cron --challenge dns-01 --domain your.domain.com --hook ./hooks/manual/manual_hook.rb
#
# !! WARNING !! No main config file found, using default config!
#
Processing your.domain.com
 + Signing domains...
 + Generating private key...
 + Generating signing request...
 + Requesting authorization for your.domain.com...
 + 1 pending challenge(s)
 + Deploying challenge tokens...
Checking for pre-existing TXT record for the domain: '_acme-challenge.your.domain.com'.
Found gkIxxxxxxxIcAESmjF8pjZGQrrZxxxxxxxxxxx. match.
 + Responding to challenge for your.domain.com authorization...
Challenge complete. Leave TXT record in place to allow easier future refreshes.
 + Challenge is valid!
 + Requesting certificate...
 + Checking certificate...
 + Done!
 + Creating fullchain.pem...
 + Walking chain...
 + Done!
~$

Teraz Twoje publiczne i prywatne certyfikaty są tutaj obecne.

$ ls certs/your.domain.com/privkey.pem certs/your.domain.com/fullchain-1517576424.pem

Aby odnowić (minimalny czas oczekiwania wynosi 30 dni), ponownie wykonaj to samo polecenie.

~$ ./dehydrated --cron --challenge dns-01 --domain your.domain.com --hook ./hooks/manual/manual_hook.rb
vikas027
źródło
1

Hugo Landau napisał w Go klienta ACME ( https://github.com/hlandau/acme ), który obsługuje wyzwania DNS (z protokołem nsupdate BIND). Działa dla mnie bezbłędnie przez co najmniej 18 miesięcy.

Harald
źródło