Let 's Encrypt DNS challenge validation을 사용하는 방법은 무엇입니까?


160

Encrypt가 다음과 같이 발표했습니다 .

ACME DNS 챌린지 지원

./letsencrypt-autoDNS 챌린지 도메인 유효성 검사를 사용하여 새 인증서를 생성하려면 어떻게합니까 ?

편집
의미 : http/https대상 도메인의 DNS 영역에 특정 TXT 레코드를 추가하여 도메인 소유권을 증명할 수있는 새로 발표 된 기능 (2015-01-20)을 사용하여 포트 바인딩을 피하려면 어떻게해야 합니까?


3
참고 : Certbot (이는 letencrypt 클라이언트의 새로운 이름 임)은 이제 기본적으로 웹 루트 기반 인증을 허용합니다.
Pierre Prinetti

답변:


203

현재 수동 모드에서 certbot LetsEncrypt 클라이언트로 도 DNS 유효성 검사를 수행 할 수 있습니다. 자동화도 가능합니다 (아래 참조).

수동 플러그인

수동 플러그인으로 수동 확인을 수행 할 수 있습니다.

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

그러면 Certbot은 유효성 검사를 진행하기 위해 도메인에 대한 TXT 레코드를 수동으로 업데이트하는 지침을 제공합니다.

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

DNS 레코드를 업데이트 한 후 Enter 키를 누르면 certbot이 계속되고 LetsEncrypt CA가 인증 확인을하면 인증서가 정상적으로 발급됩니다.

대화 형 작업을 최소화하고 certbot 질문에 대답하기 위해 더 많은 옵션이있는 명령을 사용할 수도 있습니다. 수동 플러그인은 아직 비 대화식 모드를 지원하지 않습니다.

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

비 대화식 모드에서 실행되므로 수동 플러그인에서는 갱신이 작동하지 않습니다. 공식 Certbot 문서에 대한 추가 정보 .

업데이트 : 수동 후크

새로운 Certbot 버전에서는 사용할 수있는 후크 등을, --manual-auth-hook, --manual-cleanup-hook. 후크는 작업을 수행하기 위해 Certbot에 의해 실행되는 외부 스크립트입니다.

정보는 검증 할 도메인, 챌린지 토큰과 같은 환경 변수로 전달됩니다. 바르 : 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

고유 한 핸들러를 작성하거나 이미 존재하는 것을 사용할 수 있습니다 (예 : Cloudflare DNS).

공식 Certbot 후크 설명서 에 대한 추가 정보

자동화, 갱신, 스크립팅

DNS 인증 확인을 자동화하려는 경우 현재 vanila certbot으로는 불가능합니다. 업데이트 : Certbot 훅으로 일부 자동화가 가능합니다.

따라서 DNS 자동화를 통한 스크립팅을 지원하는 간단한 플러그인을 만들었습니다. certbot-external-auth 로 사용할 수 있습니다 .

pip install certbot-external-auth

DNS, HTTP, TLS-SNI 검증 방법을 지원합니다. 핸들러 모드 또는 JSON 출력 모드에서 사용할 수 있습니다.

핸들러 모드

핸들러 모드에서 certbot + 플러그인은 외부 후크 (프로그램, 쉘 스크립트, python 등)를 호출하여 유효성 검사 및 설치를 수행합니다. 실제로 입력 인수 (도메인, 토큰)를 가져오고 DNS를 변경하는 간단한 핸들러 / 쉘 스크립트를 작성합니다. 핸들러가 완료되면 certbot은 평소와 같이 유효성 검사를 진행합니다.

이것은 당신에게 추가 유연성을 제공, 갱신도 가능합니다.

처리기 모드는 탈수 된 DNS 후크 (이전 letsencrypt.sh) 와도 호환됩니다 . 공통 공급자 (예 : CloudFlare, GoDaddy, AWS)에 대한 많은 DNS 후크가 이미 있습니다. 저장소에는 광범위한 예제 및 예제 핸들러가있는 README가 있습니다.

탈수 된 DNS 후크의 예 :

certbot \
    --text --agree-tos --email you@example.com \
    --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 

JSON 모드

다른 플러그인 모드는 JSON 모드입니다. 한 줄에 하나의 JSON 객체를 생성합니다. 이를 통해 Ansible 또는 일부 배치 관리자가 certbot을 호출하는 등보다 복잡한 통합이 가능합니다. 통신은 STDOUT 및 STDIN을 통해 수행됩니다. Cerbot은 유효성 검사를 수행하기 위해 데이터가 포함 된 JSON 객체를 생성합니다.

certbot \
    --text --agree-tos --email you@example.com \
    --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"}

DNS가 업데이트되면 호출자는 줄 바꿈 문자를 certbot의 STDIN에 전송하여 유효성 검사를 계속할 수 있음을 알립니다.

이를 통해 중앙 관리 서버에서 자동화 및 인증서 관리가 가능합니다. 설치를 위해 SSH를 통해 인증서를 배포 할 수 있습니다.

자세한 내용은 certbot-external-auth GitHub 의 readme 및 예제를 참조하십시오 .

편집 : DNS 유효성 검사 문제와 플러그인 사용법을 설명 하는 새로운 블로그 게시물 도 있습니다.

편집 : 우리는 현재 Ansible 2 단계 유효성 검사를 수행하고 있으며 곧 종료됩니다.


웹 사이트를 다른 서버로 마이그레이션 할 때 A 레코드를 전환하기 전에 새 인증서를 원할 수 있습니다. certbot certonly --preferred-challenges dns -d example.com초기 요청에 수동 방법 ( )을 사용할 수 있습니다 . A 레코드를 테스트하고 전환 한 후 이전과 certbot certonly webroot -d example.com -w /path/to/webroot정확히 동일한 도메인 이름을 사용하여 일반적인 웹 루트 방법 ( )을 사용하십시오. 올바르게 수행하면 certbot은 기존 인증서 / 구성을 인식하고 갱신 설정을 업데이트하므로 나중에 인증서가 자동으로 갱신됩니다.
marcovtwout

작동합니다. EC2 수준의 AWS 방화벽에주의
jruzafa

나는 -manual-public-ip-logging-ok의 의미를 알고 싶습니다 .... 문서는 그것에 대해 비밀스럽고 그것을 사용하는 모든 예제는 설명하지 않습니다 ...이 문서를 포함하여.
Rondo

갱신 프로세스마다 매번 새로운 TXT 레코드가 필요합니까?
Old Geezer

1
@Rondo 수동 모드를 사용하여 대화식으로 인증서를 요청하면이 프롬프트가 "참고 :이 컴퓨터의 IP는이 인증서를 요청한 것으로 공개적으로 기록됩니다. 수동 모드에서 certbot을 실행하지 않는 컴퓨터에서 서버에 문제가 없는지 확인하십시오. " 이 옵션은 해당 프롬프트에 예라고 표시합니다.
muru

39

dehydrated클라이언트를 사용하여 DNS 유효성 검사를 사용하여 인증서를 얻을 수있었습니다 .

https://github.com/lukas2511/dehydrated

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

도메인에 올바른 DNS 유효성 검사 후크를 사용해야하지만 다음과 같은 몇 가지 옵션이 있습니다.

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


이것은 저에게 정말 효과적이었습니다. 내가 추가 할 유일한 경고는 route53.rb후크 스크립트에 정의 된 몇 가지 gem 의존성을 설치해야한다는 것입니다 .
jmreicha

10

현재 공식 클라이언트는 아직 DNS-01 챌린지 유형을 지원하지 않습니다.

https://community.letsencrypt.org/t/status-of-official-letsencrypt-clients-dns-01-challenge-support/9427을 참조 하십시오.

나는 이것을 보지 않아서 정말로 모른다. 저의 높은 수준의 이해는 "DNS 도전에 대한 Python 클라이언트의 지원은 아직 없습니다".

이 PR 에서 진행 상황을 확인할 수 있습니다 . 또는 이미이를 지원하는 일부 클라이언트 가 있습니다.




3

이전 답변에서 언급했듯이 다음을 사용하여 DNS로 도메인을 쉽게 확인할 수 있습니다.

  1. 필요한 응용 프로그램 설치 (우분투에서) : 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. www.example.com에 대한 수동 DNS 챌린지 확인으로 인증서 생성 (도메인 대체) : ./dehydrated/dehydrated -c -t dns-01 -d www.example.com -k ./dehydrated/hooks /manual/manual_hook.rb

3

다른 조합을 시도한 후에 이것은 탈수 되고 수작업으로 된 git 저장소를 사용하여 나에게 도움이되었습니다 . 아래 단계가 도움이된다면 이 저장소 를 별표로 표시하는 것을 잊지 마십시오

참고 : 이것은 panticz.de 및 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...

위의 명령을 실행 한 후 해시를 얻고 DNS에 TXT 레코드를 만듭니다 . 아래 명령이나 GSuite Toolbox를 실행하여 작동하는지 확인하십시오

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

이제를 눌러 입력 프롬프트에서. TXT 레코드가 업데이트되었지만이 기능이 작동하지 않았습니다. Ctrl + C를 누르고 명령을 다시 실행해야했습니다.

~$ ./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!
~$

이제 공공 및 개인 인증서가 여기에 있습니다.

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

갱신하려면 (최소 대기 시간은 30 일) 동일한 명령을 다시 입력하십시오.

~$ ./dehydrated --cron --challenge dns-01 --domain your.domain.com --hook ./hooks/manual/manual_hook.rb

1

휴고 랜도 이동 (에 ACME 클라이언트를 작성 https://github.com/hlandau/acme (BIND의은 nsupdate 프로토콜) DNS 문제를 지원합니다). 그것은 적어도 18 개월 동안 완벽하게 작동했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.