Làm cách nào để sử dụng Let Encrypt DNS thách thức xác thực?


160

Let Encrypt đã thông báo họ có:

Đã bật hỗ trợ cho thử thách DNS ACME

Làm cách nào để ./letsencrypt-autotạo chứng chỉ mới bằng xác thực miền thử thách DNS?

EDIT
Ý tôi là: Làm cách nào để tránh http/httpsràng buộc cổng, bằng cách sử dụng tính năng mới được công bố (2015-01-20) cho phép bạn chứng minh quyền sở hữu tên miền bằng cách thêm bản ghi TXT cụ thể trong vùng DNS của miền đích?


3
Lưu ý bên lề: Certbot (đây là tên mới của máy khách letencrypt) hiện cho phép xác thực dựa trên webroot theo mặc định.
Pierre Prinetti

Câu trả lời:


204

Hiện nay người ta có thể thực hiện một xác nhận DNS cũng với certbot LetsEncrypt khách hàng trong chế độ bằng tay. Tự động hóa cũng có thể (xem bên dưới).

Hướng dẫn sử dụng plugin

Bạn có thể thực hiện xác minh thủ công - với plugin thủ công.

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

Sau đó, Certbot sẽ cung cấp cho bạn một hướng dẫn để cập nhật thủ công bản ghi TXT cho tên miền để tiến hành xác thực.

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

Khi bạn đã cập nhật bản ghi DNS, nhấn Enter, certbot sẽ tiếp tục và nếu LetsEncrypt CA xác minh thử thách, chứng chỉ sẽ được cấp như bình thường.

Bạn cũng có thể sử dụng một lệnh với nhiều tùy chọn hơn để giảm thiểu khả năng tương tác và trả lời các câu hỏi của certbot. Lưu ý rằng plugin thủ công chưa hỗ trợ chế độ không tương tác.

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

Việc gia hạn không hoạt động với plugin thủ công vì nó chạy ở chế độ không tương tác. Thêm thông tin tại tài liệu chính thức của Certbot .

Cập nhật: móc thủ công

Trong phiên bản mới Certbot bạn có thể sử dụng lưỡi câu , ví dụ như --manual-auth-hook, --manual-cleanup-hook. Các hook là các tập lệnh bên ngoài được thực hiện bởi Certbot để thực hiện tác vụ.

Thông tin được truyền trong các biến môi trường - ví dụ: tên miền để xác thực, mã thông báo thách thức. 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

Bạn có thể viết trình xử lý của riêng bạn hoặc sử dụng đã có sẵn, có rất nhiều, ví dụ, đối với DNS Cloudflare.

Thông tin thêm về tài liệu móc chính thức của Certbot

Tự động hóa, đổi mới, viết kịch bản

Nếu bạn muốn tự động hóa các thách thức DNS, hiện tại không thể thực hiện được với vanila certbot. Cập nhật: một số tự động hóa là có thể với các móc của Certbot.

Do đó, chúng tôi đã tạo một plugin đơn giản hỗ trợ tập lệnh với tự động hóa DNS. Nó có sẵn dưới dạng certbot-bên ngoài-auth .

pip install certbot-external-auth

Nó hỗ trợ các phương thức xác thực DNS, HTTP, TLS-SNI. Bạn có thể sử dụng nó trong chế độ xử lý hoặc chế độ đầu ra JSON.

Chế độ xử lý

Trong chế độ xử lý, certbot + plugin gọi các hook bên ngoài (chương trình, shell script, python, ...) để thực hiện xác nhận và cài đặt. Trong thực tế, bạn viết một tập lệnh xử lý / shell đơn giản để lấy các đối số đầu vào - tên miền, mã thông báo và thực hiện thay đổi trong DNS. Khi xử lý kết thúc, certbot tiến hành xác nhận như bình thường.

Điều này cung cấp cho bạn một sự linh hoạt thêm, đổi mới cũng có thể.

Chế độ xử lý cũng tương thích với các móc DNS Mất nước (trước đây là letencrypt.sh). Hiện đã có nhiều móc DNS cho các nhà cung cấp phổ biến (ví dụ: CloudFlare, GoDaddy, AWS). Trong kho lưu trữ có README với các ví dụ và trình xử lý ví dụ mở rộng.

Ví dụ với hook DNS mất nước :

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 

Chế độ JSON

Một chế độ plugin khác là chế độ JSON. Nó tạo ra một đối tượng JSON trên mỗi dòng. Điều này cho phép tích hợp phức tạp hơn - ví dụ: Ansible hoặc một số trình quản lý triển khai đang gọi certbot. Giao tiếp được thực hiện thông qua STDOUT và STDIN. Cerbot tạo đối tượng JSON có dữ liệu để thực hiện xác nhận, ví dụ:

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"}

Khi DNS được cập nhật, người gọi sẽ gửi ký tự dòng mới đến STDIN của certbot để báo hiệu nó có thể tiếp tục xác nhận.

Điều này cho phép tự động hóa và quản lý chứng chỉ từ máy chủ quản lý trung tâm. Để cài đặt, bạn có thể triển khai chứng chỉ qua SSH.

Để biết thêm thông tin, vui lòng tham khảo readme và các ví dụ về certbot-bên ngoài-auth GitHub.

EDIT: Ngoài ra còn có một bài đăng blog mới mô tả vấn đề xác thực DNS và việc sử dụng plugin.

EDIT: chúng tôi hiện đang làm việc trên xác thực 2 bước Ansible, sẽ sớm ra mắt.


Khi di chuyển một trang web sang một máy chủ khác, bạn có thể muốn có chứng chỉ mới trước khi chuyển bản ghi A. Bạn có thể sử dụng phương thức thủ công ( certbot certonly --preferred-challenges dns -d example.com) cho yêu cầu ban đầu. Sau khi kiểm tra và chuyển đổi bản ghi A, sử dụng phương thức webroot phổ biến ( certbot certonly webroot -d example.com -w /path/to/webroot) bằng cách sử dụng chính xác cùng tên miền như trước. Nếu được thực hiện chính xác, certbot sẽ nhận ra chứng chỉ / cấu hình hiện có và sẽ cập nhật cài đặt gia hạn, vì vậy chứng chỉ sẽ được tự động gia hạn trong tương lai.
marcovtwout

Nó hoạt động, Cảnh giác với Tường lửa AWS ở cấp EC2
jruzafa

Tôi chắc chắn muốn biết - manual-public-ip-log-ok nghĩa là gì .... tài liệu này rất khó hiểu về nó và tất cả các ví dụ sử dụng nó không giải thích ... bao gồm cả cái này.
Rondo

Quá trình gia hạn có yêu cầu bản ghi TXT mới mỗi lần không?
Geezer cũ

1
@Rondo Khi bạn yêu cầu chứng chỉ sử dụng chế độ thủ công một cách tương tác, lời nhắc này được hiển thị "LƯU Ý: IP của máy này sẽ được ghi nhật ký công khai là đã yêu cầu chứng chỉ này. Nếu bạn đang chạy certbot ở chế độ thủ công trên máy không phải là máy chủ của bạn, hãy đảm bảo rằng bạn ổn với điều đó. " Tùy chọn này nói có với dấu nhắc đó.
muru

39

Tôi đã có thể sử dụng dehydratedmáy khách để lấy chứng chỉ bằng xác thực DNS.

https://github.com/lukas2511/dehydrated

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

Bạn sẽ cần sử dụng móc xác thực DNS chính xác cho tên miền của mình, nhưng có một vài tùy chọn có sẵn làm ví dụ:

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


Điều này làm việc thực sự tốt cho tôi. Nhắc nhở duy nhất mà tôi muốn thêm là tôi đã phải cài đặt một vài phụ thuộc đá quý được xác định trong route53.rbtập lệnh hook.
jmreicha

10

Cho đến hôm nay, khách hàng chính thức không hỗ trợ loại thử thách DNS-01 (chưa).

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

Tôi đã không nhìn vào điều này vì vậy tôi thực sự không biết. Sự hiểu biết cấp cao của tôi chỉ là "không có hỗ trợ trong ứng dụng khách Python của chúng tôi cho thử thách DNS".

Bạn có thể theo dõi tiến trình tại PR này . Ngoài ra, có một số khách hàng đã hỗ trợ nó.




3

Như đã đề cập trong các câu trả lời trước, bạn có thể dễ dàng xác minh tên miền bằng DNS bằng cách này:

  1. cài đặt các ứng dụng cần thiết (trong 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. tạo chứng chỉ với xác nhận thách thức DNS thủ công cho www.example.com (thay thế bằng tên miền của bạn): ./dehydrated/dehydrated -c -t dns-01 -d www.example.com -k ./dehydrated/hooks /manual/manual_hook.rb

3

Sau khi thử các kết hợp khác nhau, đây là những gì làm việc cho tôi bằng cách sử dụng kho lưu trữ git mất nướcletencrypt-thủ công-hook . Nếu các bước dưới đây phù hợp với bạn, đừng quên gắn dấu sao cho các kho lưu trữ này

LƯU Ý: Đây là ngoài câu trả lời của panticz.de và 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...

Bạn sẽ nhận được một hàm băm (sau khi chạy lệnh trên), tạo bản ghi TXT trong DNS của bạn. Đảm bảo nó hoạt động bằng cách chạy lệnh bên dưới hoặc Hộp công cụ GSuite

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

Bây giờ, nhấn enter tại dấu nhắc. Điều này không làm việc cho tôi mặc dù bản ghi TXT đã được cập nhật. Tôi đã phải nhấn Ctrl + C và chạy lại lệnh.

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

Bây giờ, certs công cộng và tư nhân của bạn có mặt ở đây.

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

Để gia hạn (thời gian chờ tối thiểu là 30 ngày), chỉ cần lại lệnh tương tự.

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

1

Hugo Landau đã viết một ứng dụng khách ACME trong Go ( https://github.com/hlandau/acme ) hỗ trợ các thách thức DNS (với giao thức nsupdate của BIND). Nó đã hoạt động hoàn hảo đối với tôi trong ít nhất 18 tháng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.