Bagaimana cara menggunakan Let's Encrypt DNS validation challenge?

160

Let's Encrypt telah mengumumkan bahwa mereka memiliki:

Mengaktifkan dukungan untuk tantangan ACME DNS

Bagaimana cara saya membuat ./letsencrypt-autosertifikat baru menggunakan validasi domain tantangan DNS?

EDIT
Maksud saya: Bagaimana cara menghindari http/httpspengikatan port, dengan menggunakan fitur yang baru diumumkan (2015-01-20) yang memungkinkan Anda membuktikan kepemilikan domain dengan menambahkan catatan TXT spesifik di zona DNS dari domain target?

Pierre Prinetti
sumber
3
Catatan sisi: Certbot (ini adalah nama baru untuk klien letsencrypt) sekarang memungkinkan otentikasi berbasis webroot secara default.
Pierre Prinetti

Jawaban:

204

Saat ini dimungkinkan untuk melakukan validasi DNS juga dengan klien LetsEncrypt certbot dalam mode manual. Otomatisasi juga dimungkinkan (lihat di bawah).

Plugin manual

Anda dapat melakukan verifikasi manual - dengan plugin manual.

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

Certbot kemudian akan memberi Anda petunjuk untuk memperbarui data TXT untuk domain secara manual untuk melanjutkan validasi.

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

Setelah Anda memperbarui catatan DNS, tekan Enter, certbot akan melanjutkan dan jika LetsEncrypt CA memverifikasi tantangan, sertifikat dikeluarkan seperti biasa.

Anda juga dapat menggunakan perintah dengan lebih banyak opsi untuk meminimalkan interaktivitas dan menjawab pertanyaan certbot. Perhatikan bahwa plugin manual belum mendukung mode non-interaktif.

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

Pembaruan tidak berfungsi dengan plugin manual karena berjalan dalam mode non-interaktif. Info lebih lanjut di dokumentasi Certbot resmi .

Pembaruan: kait manual

Dalam versi Certbot baru Anda dapat menggunakan kait , misalnya --manual-auth-hook, --manual-cleanup-hook. Hooks adalah skrip eksternal yang dijalankan oleh Certbot untuk melakukan tugas.

Informasi diteruskan dalam variabel lingkungan - misalnya, domain untuk divalidasi, token tantangan. 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

Anda dapat menulis handler Anda sendiri atau menggunakan yang sudah ada, ada banyak tersedia, misalnya, untuk Cloudflare DNS.

Info lebih lanjut tentang dokumentasi kait Certbot resmi

Otomasi, Pembaruan, Scripting

Jika Anda ingin mengotomatiskan validasi tantangan DNS, saat ini tidak dimungkinkan dengan vanila certbot. Pembaruan: beberapa otomatisasi dimungkinkan dengan kait Certbot.

Karena itu, kami membuat plugin sederhana yang mendukung scripting dengan otomatisasi DNS. Ini tersedia sebagai certbot-external-auth .

pip install certbot-external-auth

Ini mendukung metode validasi DNS, HTTP, TLS-SNI. Anda dapat menggunakannya dalam mode handler atau mode output JSON.

Mode handler

Dalam mode handler, plugin certbot + memanggil kait eksternal (program, skrip shell, python, ...) untuk melakukan validasi dan instalasi. Dalam prakteknya Anda menulis skrip handler / shell sederhana yang mendapat argumen input - domain, token dan membuat perubahan dalam DNS. Ketika pawang selesai, certbot melanjutkan dengan validasi seperti biasa.

Ini memberi Anda fleksibilitas ekstra, pembaruan juga dimungkinkan.

Mode handler juga kompatibel dengan kait DNS Dehidrasi (mantan letsencrypt.sh). Sudah ada banyak kait DNS untuk penyedia umum (mis., CloudFlare, GoDaddy, AWS). Dalam repositori ada README dengan contoh luas dan contoh penangan.

Contoh dengan kait DNS Dehidrasi :

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 

Mode JSON

Mode plugin lain adalah mode JSON. Ini menghasilkan satu objek JSON per baris. Ini memungkinkan integrasi yang lebih rumit - misalnya, Ansible atau beberapa manajer penyebaran memanggil certbot. Komunikasi dilakukan melalui STDOUT dan STDIN. Cerbot menghasilkan objek JSON dengan data untuk melakukan validasi, misalnya,

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

Setelah DNS diperbarui, pemanggil mengirim karakter baris baru ke STDIN dari certbot untuk menandakannya dapat melanjutkan validasi.

Ini memungkinkan otomatisasi dan manajemen sertifikat dari server manajemen pusat. Untuk instalasi, Anda dapat menggunakan sertifikat melalui SSH.

Untuk info lebih lanjut silakan merujuk ke readme dan contoh-contoh di GitHub certbot-external-auth .

EDIT: Ada juga posting blog baru yang menjelaskan masalah validasi DNS dan penggunaan plugin.

EDIT: saat ini kami mengerjakan validasi 2 langkah yang mungkin, akan segera dimatikan.

ph4r05
sumber
Saat memigrasikan situs web ke server lain, Anda mungkin menginginkan sertifikat baru sebelum mengalihkan A-record. Anda dapat menggunakan metode manual ( certbot certonly --preferred-challenges dns -d example.com) untuk permintaan awal. Setelah menguji dan mengganti A-record, gunakan metode webroot umum ( certbot certonly webroot -d example.com -w /path/to/webroot) menggunakan nama domain yang sama persis seperti sebelumnya. Jika dilakukan dengan benar, certbot akan mengenali sertifikat / konfigurasi yang ada dan akan memperbarui pengaturan pembaruan, sehingga sertifikat akan diperpanjang secara otomatis di masa mendatang.
marcovtwout
Berhasil
Saya yakin ingin tahu apa artinya - manual-public-ip-logging-ok .... dokumentasi ini samar tentang hal itu dan semua contoh di luar sana yang menggunakannya tidak menjelaskan ... termasuk yang ini.
Rondo
Apakah proses pembaruan memerlukan catatan TXT baru setiap kali?
Pak Tua
1
@Rondo Ketika Anda meminta sertifikat menggunakan mode manual secara interaktif, prompt ini ditampilkan "CATATAN: IP mesin ini akan dicatat secara publik karena telah meminta sertifikat ini. Jika Anda menjalankan certbot dalam mode manual pada mesin yang tidak server Anda, pastikan Anda setuju dengan itu. " Opsi ini mengatakan ya untuk prompt itu.
muru
39

Saya dapat menggunakan dehydratedklien untuk mendapatkan sertifikat menggunakan validasi DNS.

https://github.com/lukas2511/dehydrated

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

Anda harus menggunakan kait validasi DNS yang benar untuk domain Anda, tetapi ada beberapa opsi yang tersedia sebagai contoh:

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

alexcline
sumber
Ini bekerja sangat baik untuk saya. Satu-satunya peringatan yang akan saya tambahkan adalah bahwa saya harus menginstal beberapa dependensi permata yang ditentukan dalam route53.rbskrip kait.
jmreicha
10

Sampai hari ini, klien resmi tidak mendukung jenis tantangan DNS-01 (belum).

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

Saya belum melihat ini jadi saya tidak benar-benar tahu. Pemahaman tingkat tinggi saya hanyalah "belum ada dukungan dalam klien Python kami untuk tantangan DNS".

Anda dapat mengikuti kemajuan di PR ini . Atau, ada beberapa klien yang sudah mendukungnya.

Simone Carletti
sumber
5

Saya menulis sebuah skrip kait untuk klien letsencrypt.sh yang memungkinkan Anda untuk menggunakan Verifikasi DNS Lets Enkripsi untuk penyedia DNS yang tidak menyediakan api untuk digunakan (alias, entri manual dan verifikasi diperlukan).

Anda dapat memeriksanya di sini: https://github.com/jbjonesjr/letsencrypt-manual-hook

J Jones
sumber
3

Seperti disebutkan dalam jawaban sebelumnya, Anda dapat dengan mudah memverifikasi domain dengan DNS dengan ini:

  1. instal aplikasi yang diperlukan (di bawah 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. menghasilkan sertifikat dengan konfirmasi tantangan DNS manual untuk www.example.com (ganti dengan domain Anda): ./dehydrated/dehydrated -c -t dns-01 -d www.example.com -k ./dehydrated/hooks /manual/manual_hook.rb
panticz.de
sumber
3

Setelah mencoba kombinasi yang berbeda, inilah yang bekerja untuk saya menggunakan repositori git dehidrasi dan letsencrypt-manual-hook . Jika langkah-langkah di bawah ini cocok untuk Anda, jangan lupa untuk memberi bintang pada repositori ini

CATATAN: Ini merupakan tambahan untuk jawaban panticz.de dan 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...

Anda akan mendapatkan hash (setelah menjalankan perintah di atas), buat data TXT di DNS Anda. Pastikan itu bekerja dengan menjalankan perintah di bawah ini atau GSuite Toolbox

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

Sekarang, tekan enter saat diminta. Ini tidak berhasil untuk saya meskipun catatan TXT telah diperbarui. Saya harus menekan Ctrl + C dan menjalankan perintah lagi.

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

Sekarang, sertifikat publik dan pribadi Anda hadir di sini.

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

Untuk memperbarui (waktu tunggu minimum adalah 30 hari), cukup perintah yang sama lagi.

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

Hugo Landau menulis klien ACME di Go ( https://github.com/hlandau/acme ) yang mendukung tantangan DNS (dengan protokol nsupdate BIND). Sudah bekerja dengan sempurna untuk saya setidaknya selama 18 bulan.

Harald
sumber