Ubuntu 18.04でacme-dns-certbotを使用してDNS認証を通じてLet’s Encrypt証明書を取得する方法

作者は、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のリポジトリを追加します。

sudo apt-add-repository ppa:certbot/certbot

これには、ENTER キーを押すことで、プロンプトを承认し、システムに新しいリポジトリを追加します。

次に、Certbotパッケージをインストールします。

sudo apt install certbot

インストールが完了したら、Certbotが正常にインストールされたことを確認することができます。

certbot --version

これは以下のようなものになります:

Output
certbot 0.31.0

このステップでCertbotをインストールしました。次に、acme-dns-certbot フックをダウンロードしインストールします。

ステップ2 — acme-dns-certbotのインストール

基本的なCertbotプログラムがインストールされた後、CertbotをDNS検証モードで操作することができるacme-dns-certbotをダウンロードしインストールすることができます。

まず、スクリプトのコピーをダウンロードします。

注意: 作为一种最佳实践,请确保在运行此Github仓库中的脚本之前,先审阅该仓库和脚本。您还可以首先克隆这个仓库,然后使用acme-dns-certbot.py脚本。这个克隆提供了一个额外的安全层,确保脚本处于我们的控制之下,并且不易受到未经验证的更改的影响。

wget https://github.com/joohoi/acme-dns-certbot-joohoi/raw/master/acme-dns-auth.py

下载完成后,将脚本标记为可执行文件:

chmod +x acme-dns-auth.py

然后,使用您最喜欢的文本编辑器编辑文件,并调整第一行以强制其使用Python 3:

nano acme-dns-auth.py

在第一行的末尾添加一个3

acme-dns-certbot.py
#!/usr/bin/env python3
. . .

这样做是为了确保脚本使用最新支持的Python 3版本,而不是遗留的Python 2版本。

完成后,保存并关闭文件。

最后,将脚本移动到Certbot Let’s Encrypt目录中,以便Certbot可以加载它:

sudo mv acme-dns-auth.py /etc/letsencrypt/

在这一步中,您下载并安装了acme-dns-certbot钩子。接下来,您可以开始设置过程,并朝着发布您的第一个证书努力。

ステップ 3 — acme-dns-certbotの設定

acme-dns-certbotを使用するには、初期設定プロセスを完了し、少なくとも1つの証明書を発行する必要があります。

最初に、Certbotを実行してDNS検証を使用して証明書を発行することを強制する。これにより、acme-dns-certbotスクリプトを実行して初期設定プロセスを発生させます。

sudo certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d \*.your-domain -d your-domain

この場合、--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の手順を実行した後、以下のようなメッセージが表示されるようになります。

Output
... Output from acme-dns-auth.py: Please add the following CNAME record to your main DNS zone: _acme-challenge.your-domain CNAME a15ce5b2-f170-4c91-97bf-09a5764a88f6.auth.acme-dns.io. Waiting for verification... ...

DNSのCNAMEレコードをドメインのDNS設定に追加する必要があります。これにより_acme-challengeサブドメインの管理がACME DNSサービスに委譲され、acme-dns-certbotが証明書の要求を検証するために必要なDNSレコードを設定することができます。

DNSプロバイダーとしてDigitalOceanを使用している場合は、DNSレコードをコントロールパネル内で設定することができます。

レコードの生存期間(TTL)を約300秒に設定することが推奨されます。これにより、レコードの変更が速く propagationされます。

DNSレコードを設定した後、Certbotに戻り、ENTERキーを押して証明書の要求を検証し、発行プロセスを完了します。

これにより数秒かかり、証明書が発行されたことを確認するメッセージが表示されます。

Output
... Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/your-domain/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/your-domain/privkey.pem ...

acme-dns-certbotを初めて実行し、必要なDNSレコードを設定し、証明書を成功적に発行しました。次に、証明書の自動更新を設定しましょう。

手順 4 — acme-dns-certbotの使用

この最後の手順で、acme-dns-certbotを使用して証明書を追加で発行し、既存の証明書を更新します。

まず、acme-dns-certbotを使用して至少1つの証明書を発行し成功した後、同じDNS名の証明書の発行を続けることができます。これには追加のDNS CNAME レコードを追加する必要はありません。しかし、異なるサブドメインまたは全新のドメイン名の証明書を取得したい場合は、追加のCNAME レコードを追加するように提示されます。

たとえば、再度別のスタンドアロンのワイルドカード証明書を発行することができ、これには第3の手順で行った初期設定を再行する必要はありません:

sudo certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d \*.your-domain

しかし、サブドメインの証明書を発行しようとすると、サブドメイン用のCNAME レコードを追加するように提示されます:

sudo certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d subdomain.your-domain

これは、第3の手順で行った初期設定と似た出力を表示します:

Output
... Please add the following CNAME record to your main DNS zone: _acme-challenge.subdomain.your-domain CNAME 8450fb54-8e01-4bfe-961a-424befd05088.auth.acme-dns.io. Waiting for verification... ...

ここで、acme-dns-certbotを使用して証明書を発行できるようになったら、証明書の更新プロセスも考慮する価値があります。

証明書が期限切れに近づくと、Certbotは自動的に証明書を更新することができます:

sudo certbot renew

更新プロセスは、ユーザーとの対話を一切行わずに完了することができ、初期設定時に指定したすべての設定オプションを記録します。

dry runをトリガーして、expiry dateまで待たないでこの機能が機能していることを確認することができます。これは、実際の設定に変更を加えずにrenewalプロセスをシミュレートします。

standard renew commandを使用してdry runをトリガーすることができますが、--dry-run 引数を使用してください。

sudo certbot renew --dry-run

これは、次のような内容に似たものを出力します。これにより、renewalプロセスが正しく機能していることを確認できます。

Output
... Cert not due for renewal, but simulating renewal for dry run Plugins selected: Authenticator manual, Installer None Renewing an existing certificate Performing the following challenges: dns-01 challenge for your-domain dns-01 challenge for your-domain Waiting for verification... Cleaning up challenges ...

この最後のステップで、あなたはもう一つの証明書を発行し、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 文档的相关部分来了解该过程是如何工作的:

Source:
https://www.digitalocean.com/community/tutorials/how-to-acquire-a-let-s-encrypt-certificate-using-dns-validation-with-acme-dns-certbot-on-ubuntu-18-04