จะใช้การตรวจสอบความท้าทาย Let's Encrypt DNS ได้อย่างไร


160

Let's Encrypt ประกาศว่าพวกเขามี:

เปิดการรองรับความท้าทาย ACME DNS

ฉันจะ./letsencrypt-autoสร้างใบรับรองใหม่โดยใช้การตรวจสอบความถูกต้องของโดเมน DNS ได้อย่างไร

แก้ไข
ฉันหมายถึง: ฉันจะหลีกเลี่ยงการhttp/httpsผูกพอร์ตได้อย่างไรโดยใช้คุณสมบัติประกาศใหม่ (2015-01-20) ที่ช่วยให้คุณพิสูจน์ความเป็นเจ้าของโดเมนโดยการเพิ่มระเบียน TXT เฉพาะในโซน DNS ของโดเมนเป้าหมาย


3
หมายเหตุด้านข้าง: Certbot (นี่คือชื่อใหม่สำหรับไคลเอ็นต์ allowencrypt) ในขณะนี้อนุญาตให้ใช้การพิสูจน์ตัวตนผ่านเว็บรูทเป็นค่าเริ่มต้น
Pierre Prinetti

คำตอบ:


203

ขณะนี้ก็เป็นไปได้ที่จะดำเนินการตรวจสอบ DNS ยังกับcertbotลูกค้า LetsEncrypt ในโหมดคู่มือ ระบบอัตโนมัติยังเป็นไปได้ (ดูด้านล่าง)

ปลั๊กอินด้วยตนเอง

คุณสามารถทำการตรวจสอบด้วยตนเอง - ด้วยปลั๊กอินด้วยตนเอง

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 อย่างเป็นทางการเอกสาร

ปรับปรุง: hooks ด้วยตนเอง

ในรุ่น Certbot ใหม่ที่คุณสามารถใช้ตะขอเช่น,--manual-auth-hook --manual-cleanup-hookhooks เป็นสคริปต์ภายนอกที่ดำเนินการโดย Certbot เพื่อทำงาน

ข้อมูลถูกส่งผ่านในตัวแปรสภาพแวดล้อมเช่นโดเมนที่จะตรวจสอบความท้าทายโทเค็น CERTBOT_DOMAINVars: 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

คุณสามารถเขียน handler ของคุณเองหรือใช้อยู่แล้วมีอยู่มากมายเช่น Cloudflare DNS

ข้อมูลเพิ่มเติมเกี่ยวกับเอกสารรับรอง Certbot hooks

ระบบอัตโนมัติ, การต่ออายุ, การเขียนสคริปต์

หากคุณต้องการให้ DNS ทำการตรวจสอบความถูกต้องอัตโนมัติจะไม่สามารถทำได้ในขณะนี้ด้วย vanila certbot อัปเดต: การทำงานอัตโนมัติบางอย่างอาจทำได้โดยใช้ Certbot hooks

เราจึงสร้างปลั๊กอินอย่างง่ายที่รองรับการเขียนสคริปต์ด้วยระบบอัตโนมัติ DNS มันมีอยู่เป็นcertbot-ภายนอกรับรองความถูกต้อง

pip install certbot-external-auth

สนับสนุนวิธีการตรวจสอบความถูกต้อง DNS, HTTP, TLS-SNI คุณสามารถใช้ในโหมดตัวจัดการหรือโหมดเอาต์พุต JSON

โหมดตัวจัดการ

ในโหมดตัวจัดการปลั๊กอิน certbot + จะเรียกใช้ hooks ภายนอก (โปรแกรม, เชลล์สคริปต์, ไพ ธ อน, ... ) เพื่อทำการตรวจสอบความถูกต้องและการติดตั้ง ในทางปฏิบัติคุณเขียนสคริปต์ตัวจัดการ / เชลล์แบบง่าย ๆ ซึ่งรับอาร์กิวเมนต์การป้อนข้อมูล - โดเมนโทเค็นและทำการเปลี่ยนแปลงใน DNS เมื่อตัวจัดการเสร็จสิ้น certbot จะดำเนินการตรวจสอบตามปกติ

สิ่งนี้ทำให้คุณมีความยืดหยุ่นเป็นพิเศษสามารถต่ออายุได้

โหมดตัวจัดการยังเข้ากันได้กับDehydrated DNS hooks (เดิม letsencrypt.sh) มี DNS hooks จำนวนมากสำหรับผู้ให้บริการทั่วไป (เช่น CloudFlare, GoDaddy, AWS) ในพื้นที่เก็บข้อมูลมี 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 แล้วผู้เรียกจะส่งอักขระขึ้นบรรทัดใหม่ไปยัง STDIN ของ certbot เพื่อให้สัญญาณว่ามันสามารถทำการตรวจสอบต่อไปได้

สิ่งนี้ช่วยให้การจัดการอัตโนมัติและใบรับรองจากเซิร์ฟเวอร์การจัดการส่วนกลาง สำหรับการติดตั้งคุณสามารถปรับใช้ใบรับรองผ่าน SSH

สำหรับข้อมูลเพิ่มเติมโปรดดูที่ readme และตัวอย่างเกี่ยวกับcertbot-external-auth GitHub

แก้ไข: นอกจากนี้ยังมีโพสต์บล็อกใหม่ที่อธิบายถึงปัญหาการตรวจสอบ DNS และการใช้งานปลั๊กอิน

แก้ไข: ขณะนี้เรากำลังทำงานกับการตรวจสอบความถูกต้อง 2 ขั้นตอนของ Ansible และจะปิดตัวลงในไม่ช้า


เมื่อทำการย้ายเว็บไซต์ไปยังเซิร์ฟเวอร์อื่นคุณอาจต้องการใบรับรองใหม่ก่อนที่จะเปลี่ยน A-record คุณสามารถใช้วิธีการด้วยตนเอง ( certbot certonly --preferred-challenges dns -d example.com) สำหรับการร้องขอเริ่มต้น หลังจากการทดสอบและสลับ A-record ให้ใช้วิธี webroot ทั่วไป ( certbot certonly webroot -d example.com -w /path/to/webroot) โดยใช้ชื่อโดเมนที่เหมือนกันทุกประการ หากทำอย่างถูกต้อง certbot จะจดจำใบรับรอง / การกำหนดค่าที่มีอยู่และจะอัปเดตการตั้งค่าการต่ออายุดังนั้นใบรับรองจะได้รับการต่ออายุโดยอัตโนมัติในอนาคต
marcovtwout

ใช้งานได้ระวัง AWS Firewall ที่ระดับ EC2
jruzafa

ฉันแน่ใจว่าต้องการทราบว่า - คู่มือสาธารณะ -ip- เข้าสู่ระบบ-ok- หมายถึง .... เอกสารที่เป็นความลับเกี่ยวกับมันและตัวอย่างทั้งหมดออกมีที่ใช้มันไม่ได้อธิบาย ... รวมถึงอันนี้
Rondo

กระบวนการต่ออายุต้องมีระเบียน TXT ใหม่ทุกครั้งหรือไม่
แก่เก่า

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

คุณจะต้องใช้ hook การตรวจสอบ DNS ที่ถูกต้องสำหรับโดเมนของคุณ แต่มีตัวอย่างให้เลือกสองสามตัวเลือก:

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


มันใช้งานได้ดีจริงๆสำหรับฉัน ข้อแม้เดียวที่ฉันจะเพิ่มคือฉันต้องติดตั้งการพึ่งพาพลอยสองสามตัวที่กำหนดไว้ในroute53.rbสคริปต์เบ็ด
jmreicha

10

ณ วันนี้ลูกค้าอย่างเป็นทางการไม่สนับสนุนประเภทการท้าทาย DNS-01 (ยัง)

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

ฉันไม่ได้ดูสิ่งนี้ดังนั้นฉันจึงไม่รู้จริงๆ ความเข้าใจระดับสูงของฉันเป็นเพียง "ยังไม่ได้รับการสนับสนุนในไคลเอนต์ Python สำหรับความท้าทาย DNS"

คุณสามารถติดตามความคืบหน้าได้ที่PRนี้ หรือมีลูกค้าบางรายที่ให้การสนับสนุนอยู่แล้ว


1
twitter.com/letsencrypt/status/689919523164721152มันทำตอนนี้
foo

5

ฉันเขียนสคริปต์เบ็ดสำหรับไคลเอ็นต์ allowencrypt.shที่ช่วยให้คุณใช้การตรวจสอบ Lets Encrypt DNS สำหรับผู้ให้บริการ DNS ที่ไม่ได้ให้ API ที่จะใช้ (ต้องใช้การป้อนข้อมูลด้วยตนเองและการตรวจสอบ)

คุณสามารถตรวจสอบได้ที่นี่: https://github.com/jbjonesjr/letsencrypt-manual-hook


3

ดังที่กล่าวไว้ในคำตอบก่อนหน้านี้คุณสามารถตรวจสอบโดเมนโดย DNS ได้อย่างง่ายดาย:

  1. ติดตั้งแอปพลิเคชั่นที่ต้องการ (ภายใต้ 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. สร้างใบรับรองด้วยการยืนยันการท้าทาย DNS ด้วยตนเองสำหรับ www.example.com (แทนที่ด้วยโดเมนของคุณ): ./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...

คุณจะได้รับแฮช (หลังจากเรียกใช้คำสั่งด้านบน) สร้างระเบียน TXTใน DNS ของคุณ ตรวจสอบให้แน่ใจว่าใช้งานได้โดยใช้คำสั่งด้านล่างหรือกล่องเครื่องมือ GSuite

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

ตอนนี้กดEnterที่พรอมต์ สิ่งนี้ไม่ได้ผลสำหรับฉันแม้ว่าจะอัปเดตระเบียน 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

Hugo Landau เขียนลูกค้า ACME ใน Go ( https://github.com/hlandau/acme ) ที่รองรับความท้าทาย DNS (ด้วยโปรโตคอล nsupdate ของ BIND) มันใช้ได้อย่างไร้ที่ติสำหรับฉันเป็นเวลาอย่างน้อย 18 เดือน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.