Let's Encrypt DNSチャレンジ検証の使用方法


160

Let's Encryptが以下を発表しました:

ACME DNSチャレンジのサポートを有効にしました

./letsencrypt-autoDNSチャレンジドメイン検証を使用して新しい証明書を生成するにはどうすればよいですか?

編集
私が意味する:http/httpsターゲットドメインのDNSゾーンに特定のTXTレコードを追加してドメイン所有権を証明できる新しく発表された機能(2015-01-20)を使用して、ポートバインディングを回避するにはどうすればよいですか?


3
サイドノート:Certbot(これはletsencryptクライアントの新しい名前です)がデフォルトでwebrootベースの認証を許可するようになりました。
ピエールプリンネッティ

回答:


204

現在、手動モードの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_DOMAINCERTBOT_VALIDATIONCERTBOT_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モードです。1行に1つの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ステップ検証に取り組んでいますが、まもなく終了します。


Webサイトを別のサーバーに移行する場合、Aレコードを切り替える前に新しい証明書が必要になる場合があります。certbot certonly --preferred-challenges dns -d example.com最初の要求には手動の方法()を使用できます。Aレコードをテストして切り替えた後certbot certonly webroot -d example.com -w /path/to/webroot、以前とまったく同じドメイン名を使用して一般的なwebrootメソッド()を使用します。正しく行われた場合、certbotは既存の証明書/構成を認識し、更新設定を更新するため、証明書は将来自動的に更新されます。
-marcovtwout

動作します
。EC2

--manual-public-ip-logging-okが何を意味するのかを確実に知りたいと思う....ドキュメントはそれについて不可解であり、それを使用するそこにあるすべての例は説明していない...これを含む。
ロンド

更新プロセスでは、毎回新しいTXTレコードが必要ですか?
オールドギーザー

1
@Rondo手動モードを使用してインタラクティブに証明書を要求すると、このプロンプトが表示されます。サーバーに問題がないことを確認してください。」このオプションは、そのプロンプトに対して「はい」と言います。
ムル

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. 必要なアプリケーションをインストールします(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. www.example.comの手動のDNSチャレンジ確認で証明書を生成します(ドメインに置き換えます): ./dehydrated/dehydrated -c -t dns-01 -d www.example.com -k ./dehydrated/hooks /manual/manual_hook.rb

3

さまざまな組み合わせを試した後、これが脱水およびletsencrypt-manual-hook 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"
~$

次に、プロンプトで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はGo(https://github.com/hlandau/acme)でDNSチャレンジ(BINDのnsupdateプロトコルを使用)をサポートするACMEクライアントを作成しました。少なくとも18か月間、私にとって完璧に機能していました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.