著者はCOVID-19救済基金を選択し、 Write forDOnationsプログラムの一環として寄付を受け取りました。

序章

Let’s Encrypt 証明書の大部分は、HTTP検証を使用して発行されます。これにより、単一のサーバーに証明書を簡単にインストールできます。 ただし、HTTP検証は、負荷分散されたWebサイトで使用する証明書の発行に常に適しているとは限りません。また、ワイルドカード証明書の発行にも使用できません。

DNS検証では、HTTPを介してコンテンツを提供するのではなく、DNSレコードを使用して証明書発行要求を検証できます。 これは、ロードバランサーの背後で実行されているWebサーバーのクラスター、またはインターネット経由で直接アクセスできないシステムに対して、証明書を同時に発行できることを意味します。 ワイルドカード証明書は、DNS検証を使用してサポートされています。

acme-dns-certbot ツールは、 Certbot をサードパーティのDNSサーバーに接続するために使用されます。サードパーティのDNSサーバーでは、証明書を要求するときにAPIを介して証明書検証レコードを自動的に設定できます。 これの利点は、CertbotをDNSプロバイダーアカウントと直接統合する必要がないことです。また、完全なDNS構成への無制限のアクセスを許可する必要もありません。これはセキュリティに役立ちます。

委任されたDNSゾーンは、証明書検証レコードのルックアップをサードパーティのDNSサービスにリダイレクトするために使用されるため、初期設定が完了すると、必要な数の証明書を要求できます。手動検証を実行します。

acme-dns-certbotのもう1つの重要な利点は、ロードバランサーの背後で実行されている可能性がある、またはHTTP経由で直接アクセスできない個々のサーバーの証明書を発行するために使用できることです。 これらの場合、すべてのサーバーに検証ファイルを設定しない限り、従来のHTTP証明書検証を使用することはできません。 acme-dns-certbotツールは、内部システムやステージング環境など、インターネット経由でアクセスできないサーバーに対して証明書を発行する場合にも役立ちます。

このチュートリアルでは、Certbotのacme-dns-certbotフックを使用して、DNS検証を使用してLet’sEncrypt証明書を発行します。

前提条件

このチュートリアルを完了するには、次のものが必要です。

  • Ubuntu 18.04を使用した初期サーバーセットアップに従ってセットアップされたUbuntu18.04サーバー(sudo非rootユーザーを含む)。

  • DNSレコードを追加する機能を含む、TLS証明書を取得できるドメイン名。 この特定の例では、ワイルドカード証明書にyour-domainsubdomain.your-domain、および*.your-domainを使用します。 ただし、必要に応じて、他のドメイン、サブドメイン、またはワイルドカードに合わせて調整できます。

これらの準備ができたら、root以外のユーザーとしてサーバーにログインして開始します。

ステップ1—Certbotをインストールする

このステップでは、Let’sEncrypt証明書の発行と管理に使用されるプログラムであるCertbotをインストールします。

Certbotは公式のUbuntuAptリポジトリ内で利用できますが、Certbot開発者が管理するリポジトリを使用することをお勧めします。これは、常に最新バージョンのソフトウェアを使用しているためです。

Certbotリポジトリを追加することから始めます。

  1. sudo apt-add-repository ppa:certbot/certbot

ENTERを押してプロンプトを受け入れ、新しいリポジトリをシステムに追加する必要があります。

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

  1. sudo apt install certbot

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

  1. certbot --version

これにより、次のようなものが出力されます。

Output
certbot 0.31.0

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

ステップ2—acme-dns-certbotをインストールする

基本のCertbotプログラムがインストールされたので、acme-dns-certbotをダウンロードしてインストールできます。これにより、CertbotがDNS検証モードで動作できるようになります。

スクリプトのコピーをダウンロードすることから始めます。

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

ダウンロードが完了したら、スクリプトを実行可能としてマークします。

  1. chmod +x acme-dns-auth.py

次に、お気に入りのテキストエディタを使用してファイルを編集し、最初の行を調整して、Python3を使用するように強制します。

  1. nano acme-dns-auth.py

3を最初の行の最後に追加します。

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

これは、スクリプトが従来のPythonバージョン2ではなく、サポートされている最新バージョンのPython3を使用するために必要です。

完了したら、ファイルを保存して閉じます。

最後に、スクリプトをCertbot Let’s Encryptディレクトリに移動して、Certbotがスクリプトをロードできるようにします。

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

この手順では、acme-dns-certbotフックをダウンロードしてインストールしました。 次に、セットアッププロセスを開始し、最初の証明書の発行に向けて作業できます。

ステップ3—acme-dns-certbotを設定する

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

まず、Certbotを実行して、DNS検証を使用して証明書を発行するように強制します。 これにより、acme-dns-certbotスクリプトが実行され、初期セットアッププロセスがトリガーされます。

  1. 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のすべての自動統合機能を無効にします。 この場合、サービスに自動的にインストールするのではなく、生の証明書を発行するだけです。

--manual-auth-hook引数を使用して、acme-dns-certbotフックを使用するようにCertbotを構成します。 --preferred-challenges引数を実行して、CertbotがDNS検証を優先するようにします。

また、証明書の検証を試みる前に一時停止するようにCertbotに指示する必要があります。これは、--debug-challenges引数を使用して行います。 これは、acme-dns-certbotに必要なDNSCNAMEレコードを設定できるようにするためです。これについてはこの手順の後半で説明します。 --debug-challenges引数がないと、Certbotは一時停止しないため、必要なDNS変更を行う時間がありません。

-d引数を使用して、使用する各ドメイン名を置き換えることを忘れないでください。 ワイルドカード証明書を発行する場合は、必ず円記号(\)を使用してアスタリスク(*)をエスケープしてください。

標準の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構成に必要なDNSCNAMEレコードを追加する必要があります。 これにより、_acme-challengeサブドメインの制御がACMEDNSサービスに委任され、acme-dns-certbotが証明書要求を検証するために必要なDNSレコードを設定できるようになります。

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

A screenshot of the DigitalOcean DNS control panel, showing an example of a CNAME record for ACME DNS

レコードへの変更が迅速に伝播されるようにするには、TTL(存続時間)を約300秒に設定することをお勧めします。

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 CNAMEレコードを追加しなくても、同じDNS名の証明書を引き続き発行できます。 ただし、別のサブドメインまたはまったく新しいドメイン名の証明書を取得する場合は、別のCNAMEレコードを追加するように求められます。

たとえば、検証を再度実行しなくても、別のスタンドアロンワイルドカード証明書を発行できます。

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

ただし、サブドメインの証明書を発行しようとすると、サブドメインのCNAMEレコードを追加するように求められます。

  1. 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は自動的に証明書を更新します。

  1. sudo certbot renew

更新プロセスは、ユーザーの操作なしで最初から最後まで実行でき、初期セットアップ中に指定したすべての構成オプションを記憶します。

有効期限が近づくまで待たずにこれが機能していることをテストするために、ドライランをトリガーできます。 これにより、構成に実際の変更を加えることなく、更新プロセスがシミュレートされます。

標準のrenewコマンドを使用してドライランをトリガーできますが、--dry-run引数を使用します。

  1. sudo certbot renew --dry-run

これにより、次のようなものが出力され、更新プロセスが正しく機能していることが保証されます。

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内の自動更新プロセスをテストしました。

結論

この記事では、DNS検証を使用して証明書を発行するために、acme-dns-certbotを使用してCertbotを設定しました。 これにより、ワイルドカード証明書を使用したり、ロードバランサーの背後にある可能性のある個別のWebサーバーの大規模な資産を管理したりする可能性が広がります。

サポートされている最新バージョンを実行することを常にお勧めしますので、スクリプトの更新については、acme-dns-certbotリポジトリに注意してください。

acme-dns-certbotの詳細に興味がある場合は、acme-dns-certbotのサーバー側要素であるacme-dnsプロジェクトのドキュメントを確認することをお勧めします。

acme-dnsソフトウェアは自己ホスト型にすることもできます。これは、高セキュリティまたは複雑な環境で操作している場合に役立つ可能性があります。

または、プロセスの仕組みを概説している公式RFCドキュメントの関連セクションを確認して、ACMEDNS検証の技術的な詳細を掘り下げることもできます。