作者は、COVID-19救援基金を寄付で書くプログラムの一部として寄付を受け取るために選びました。
紹介
Let’s Encrypt証明書のほとんどは、HTTP認証を使用して発行されています。これにより、証明書を单一のサーバに簡単にインストールすることができます。しかし、HTTP認証は、負荷分散されたウェブサイト上で使用する証明書の発行には常に適していませんし、ワイルドカード証明書の発行もできません。
DNS認証を使用することで、証明書発行要求をHTTP経由でコンテンツ提供しないDNSレコードを使用して確認することができます。これは、負荷均衡器の背後に運営されているクラスター化されたウェブサーバーに同時に証明書を発行することや、インターネットから直接アクセスできないシステムに証明書を発行することが可能です。DNS認証を使用してもワイルドカード証明書をサポートします。
acme-dns-certbotツールは、Certbotを第三者のDNSサーバーに接続し、証明書認証レコードをAPIを通じて自動設定することができる場所に接続するために使用されます。この利点は、CertbotをDNSプロバイダーのアカウントに直接統合する必要がなく、完全なDNS設定に無制限にアクセスを许す必要もないため、安全性に有益です。
デリゲートDNSゾーンは、証明書認証レコードの照会を第三者のDNSサービスにリダイレクトするために使用されますので、初期設定が完了した後、手動で確認する必要のないことで、いくつかの証明書を要求することができます。
acme-dns-certbotのもう一つの重要な利点は、HTTPを介した証明書認証を行わない場合にも使用できることです。これは、負荷均等化器の背後に実行されている個人的なサーバーや、HTTPを介して直接アクセスできない其の他の場で使用できます。これらの状況では、証明書を発行するには、各サーバーに証明書認証用のファイルを設定する必要があります。acme-dns-certbotツールは、インターンルシステムやステージング環境など、インターネット上にはアクセスできないサーバーに証明書を発行したい場合にも便利です。
このチュートリアルでは、DNS認証を使用してLet’s Encrypt証明書を発行するために、Certbotのacme-dns-certbotフックを使用します。
前提条件
このチュートリアルを完了するためには、以下が必要です。
- Ubuntu 18.04のサーバーを、Ubuntu 18.04の初期サーバー設定に従って設定し、sudo非rootユーザーを含むこと。
-
TLS証明書を取得できるドメイン名を持っており、DNSレコードを追加することができるドメイン名。この特定の例では、
your-domain
およびsubdomain.your-domain
を使用し、ワイルドカード証明書用に*.your-domain
も使用します。しかし、これは必要に応じて他のドメイン、サブドメイン、またはワイルドカードに調整することができます。
これらを準備したら、非rootユーザーとしてサーバーにログインして始めます。
ステップ1 — Certbotのインストール
このステップでは、Let’s Encrypt証明書を発行し管理するためのプログラムであるCertbotをインストールします。
Certbotは公式のUbuntu Aptリポジトリにありますが、最新のソフトウェアのバージョンを常に提供するため、Certbot開発者がメンテナンスしているリポジトリを使用することを推奨します。
まず、Certbotのリポジトリを追加します。
これには、ENTER
キーを押すことで、プロンプトを承认し、システムに新しいリポジトリを追加します。
次に、Certbotパッケージをインストールします。
インストールが完了したら、Certbotが正常にインストールされたことを確認することができます。
これは以下のようなものになります:
このステップでCertbotをインストールしました。次に、acme-dns-certbot フックをダウンロードしインストールします。
ステップ2 — acme-dns-certbotのインストール
基本的なCertbotプログラムがインストールされた後、CertbotをDNS検証モードで操作することができるacme-dns-certbotをダウンロードしインストールすることができます。
まず、スクリプトのコピーをダウンロードします。
注意: 作为一种最佳实践,请确保在运行此Github仓库中的脚本之前,先审阅该仓库和脚本。您还可以首先克隆这个仓库,然后使用acme-dns-certbot.py
脚本。这个克隆提供了一个额外的安全层,确保脚本处于我们的控制之下,并且不易受到未经验证的更改的影响。
下载完成后,将脚本标记为可执行文件:
然后,使用您最喜欢的文本编辑器编辑文件,并调整第一行以强制其使用Python 3:
在第一行的末尾添加一个3
:
#!/usr/bin/env python3
. . .
这样做是为了确保脚本使用最新支持的Python 3版本,而不是遗留的Python 2版本。
完成后,保存并关闭文件。
最后,将脚本移动到Certbot Let’s Encrypt目录中,以便Certbot可以加载它:
在这一步中,您下载并安装了acme-dns-certbot钩子。接下来,您可以开始设置过程,并朝着发布您的第一个证书努力。
ステップ 3 — acme-dns-certbotの設定
acme-dns-certbotを使用するには、初期設定プロセスを完了し、少なくとも1つの証明書を発行する必要があります。
最初に、Certbotを実行してDNS検証を使用して証明書を発行することを強制する。これにより、acme-dns-certbotスクリプトを実行して初期設定プロセスを発生させます。
この場合、--manual
引数を使用して、Certbotのすべての自動化された統合機能を無効にします。RAW証明書を発行しますが、サービスに自動的にインストールされるわけではありません。
Certbotを、--manual-auth-hook
引数を使用してacme-dns-certbotのフックを使用するように設定します。--preferred-challenges
引数を実行して、CertbotがDNS検証を優先するようにします。
また、Certbotが証明書の検証を試みる前に一時停止するように指示する必要があります。これは--debug-challenges
引数を使用して行います。これは、後でこのステップで説明するDNSCNAME
レコードをacme-dns-certbotに必要としていることを認識するために、DNS変更を行う時間を与えます。--debug-challenges
引数を使用しないと、Certbotは一時停止しないため、必要なDNS変更を行う時間がないでしょう。
-d
引数で使用したいドメイン名をそれぞれ入れ替えてください。ワイルドカード cerificateを発行したい場合は、アスタリスク(*
)をバックスラッシュ(\
)でエスケープする必要があります。
標準的なCertbotの手順を実行した後、以下のようなメッセージが表示されるようになります。
DNSのCNAME
レコードをドメインのDNS設定に追加する必要があります。これにより_acme-challenge
サブドメインの管理がACME DNSサービスに委譲され、acme-dns-certbotが証明書の要求を検証するために必要なDNSレコードを設定することができます。
DNSプロバイダーとしてDigitalOceanを使用している場合は、DNSレコードをコントロールパネル内で設定することができます。
レコードの生存期間(TTL)を約300秒に設定することが推奨されます。これにより、レコードの変更が速く propagationされます。
DNSレコードを設定した後、Certbotに戻り、ENTER
キーを押して証明書の要求を検証し、発行プロセスを完了します。
これにより数秒かかり、証明書が発行されたことを確認するメッセージが表示されます。
acme-dns-certbotを初めて実行し、必要なDNSレコードを設定し、証明書を成功적に発行しました。次に、証明書の自動更新を設定しましょう。
手順 4 — acme-dns-certbotの使用
この最後の手順で、acme-dns-certbotを使用して証明書を追加で発行し、既存の証明書を更新します。
まず、acme-dns-certbotを使用して至少1つの証明書を発行し成功した後、同じDNS名の証明書の発行を続けることができます。これには追加のDNS CNAME
レコードを追加する必要はありません。しかし、異なるサブドメインまたは全新のドメイン名の証明書を取得したい場合は、追加のCNAME
レコードを追加するように提示されます。
たとえば、再度別のスタンドアロンのワイルドカード証明書を発行することができ、これには第3の手順で行った初期設定を再行する必要はありません:
しかし、サブドメインの証明書を発行しようとすると、サブドメイン用のCNAME
レコードを追加するように提示されます:
これは、第3の手順で行った初期設定と似た出力を表示します:
ここで、acme-dns-certbotを使用して証明書を発行できるようになったら、証明書の更新プロセスも考慮する価値があります。
証明書が期限切れに近づくと、Certbotは自動的に証明書を更新することができます:
更新プロセスは、ユーザーとの対話を一切行わずに完了することができ、初期設定時に指定したすべての設定オプションを記録します。
dry runをトリガーして、expiry dateまで待たないでこの機能が機能していることを確認することができます。これは、実際の設定に変更を加えずにrenewalプロセスをシミュレートします。
standard renew
commandを使用してdry runをトリガーすることができますが、--dry-run
引数を使用してください。
これは、次のような内容に似たものを出力します。これにより、renewalプロセスが正しく機能していることを確認できます。
この最後のステップで、あなたはもう一つの証明書を発行し、Certbot内で自動renewalプロセスをテストしました。
結論
この記事で、acme-dns-certbotを使用して、DNS認証を使用して証明書を発行するためにCertbotを設定しました。これにより、wildcard証明書を使用することもでき、 Load balancerの背後に位置する大量の独自webサーバーを管理する可能性を開くでしょう。
scriptの更新をacme-dns-certbotリポジトリに注意を払うことで、最新のサポートされているバージョンを実行することを推奨します。acme-dns-certbotリポジトリを確認してください。
acme-dns-certbotについてもっと学びたい場合は、acme-dnsプロジェクトのドキュメントを確認することができます。acme-dns-certbotのserver-side要素として、これは重要です。
acme-dns 软件也可以自行托管,如果您在高安全性或复杂环境中运营,这可能是有益的。
另外,您可以深入研究 ACME DNS 验证的技术细节,通过查看官方 RFC 文档的相关部分来了解该过程是如何工作的: