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

序章

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

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

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

certbot-dns-digitaloceanツールを使用して、CertbotをDigitalOceanのDNS管理APIと統合し、証明書を要求したときに証明書検証レコードをオンザフライで自動的に構成できるようにすることができます。

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

certbot-dns-digitaloceanは、DNS検証を使用してのみ発行できるワイルドカード証明書も完全にサポートしています。

前提条件

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

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

  • DigitalOceanアカウントを介して管理される、つまりDNSレコードを管理するためのドメイン名。 この特定の例では、ワイルドカード証明書にyour_domainsubdomain.your_domain、および*.your_domainを使用しますが、必要に応じて他のドメインまたはサブドメインに合わせて調整できます。

  • 読み取りおよび書き込み権限を持つDigitalOceanAPIキー(パーソナルアクセストークン)。 作成するには、パーソナルアクセストークンの作成方法にアクセスしてください。

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

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

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

Certbotは公式のUbuntuAptリポジトリ内で利用できるため、デフォルトのシステムパッケージマネージャーを使用してインストールできます。

  1. sudo apt update
  2. sudo apt install certbot

インストールが完了したら、次のコマンドで確認できます。

  1. certbot --version

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

Output
certbot 0.40.0

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

ステップ2—certbot-dns-digitaloceanのインストールと設定

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

手順1でインストールしたCertbot自体と同様に、certbot-dns-digitaloceanユーティリティはUbuntuのデフォルトリポジトリ内で利用できます。 ただし、Certbotリポジトリには、より確実に更新されたバージョンが含まれているため、可能な場合は常にこれを使用することをお勧めします。

certbot-dns-digitaloceanのパッケージをインストールして続行します。

  1. sudo apt install python3-certbot-dns-digitalocean

インストールが完了したら、前提条件の一部として生成したDigitalOceanAPIキー/パーソナルアクセストークンを含む構成ファイルを設定する必要があります。

プライベートな場所にcreds.iniファイルを作成することから始めます。

  1. touch ~/certbot-creds.ini

次に、サーバー上の他のユーザーがファイルを読み取れないようにするために、ファイルのアクセス許可を制限します。

  1. chmod go-rwx ~/certbot-creds.ini

最後に、テキストエディタを使用してファイルを開き、DigitalOceanアクセストークンを追加します。

  1. nano ~/certbot-creds.ini

ファイルの内容は次のようになります。

〜/ certbot-creds.ini
dns_digitalocean_token = your_digitalocean_access_token

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

警告: DigitalOceanアクセストークンはDigitalOceanアカウントへのアクセスを許可するため、パスワードと同じように保護する必要があります。 誰とも共有したり、公開コードリポジトリにチェックインしたりしないでください。

この手順では、certbot-dns-digitaloceanユーティリティをダウンロードしてインストールし、APIクレデンシャルを含む構成ファイルを作成しました。

ステップ3—証明書の発行

このステップでは、CertbotとDigitalOceanAPIを使用して証明書を発行します。

最初の証明書を発行するには、次の引数を使用してCertbotを実行し、資格情報ファイルとドメインへの正しいパスを指定してください。

  1. sudo certbot certonly --dns-digitalocean --dns-digitalocean-credentials ~/certbot-creds.ini -d your_domain -d subdomain.your_domain

注: unsafe permissions on credentials configuration fileの警告が表示された場合は、ファイルのアクセス許可が正しく制限されていないため、サーバー上の他のユーザーがトークンにアクセスできることを示しています。 手順2のchmodコマンドで再確認してください。

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

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 ...

証明書の発行に失敗した場合は、DNSの変更が反映されるのに十分な時間がなかったことが原因である可能性があります。 オプションで、DNS伝播遅延を増やして、検証DNSレコードが伝播し、Let’sEncryptによって取得される時間を増やすことができます。 遅延はデフォルトで10秒ですが、--dns-digitalocean-propagation-seconds引数を使用してこれを増やすことができます。

  1. sudo certbot certonly --dns-digitalocean --dns-digitalocean-credentials ~/certbot-creds.ini --dns-digitalocean-propagation-seconds 30 -d your_domain -d subdomain.your_domain

最後に、certbot-dns-digitaloceanを使用して、ドメインのワイルドカード証明書を発行することもできます。

  1. sudo certbot certonly --dns-digitalocean --dns-digitalocean-credentials ~/certbot-creds.ini -d \*.your_domain

注:場合によっては、同じホスト名に対して短期間に複数の証明書を要求すると、発行が失敗し始める可能性があります。 これは、レート制限とDNS存続時間(TTL)値が原因であり、新しいDNS変更の伝播に遅延が発生する場合があります。

これを軽減するには、TTLの期間を待つか、この手順の前半で詳しく説明した--dns-digitalocean-propagation-secondsオプションの調整を検討してください。

このステップでは、certbot-dns-digitaloceanでCertbotを初めて使用し、最初の証明書を発行しました。

ステップ4—証明書の更新

この最後のステップでは、Certbotとcertbot-dns-digitaloceanを使用して証明書を更新します。

証明書の有効期限が近づくと、Certbotは自動的に証明書を更新できます。

  1. sudo certbot renew

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

デフォルトでは、Certbotはこれを自動スケジュールシステムタスクとして実行します。つまり、証明書にそれ以上のメンテナンスは必要ありません。 certbot.timerである関連するシステムサービスのステータスを印刷することにより、スケジュールされたタスクが正しくインストールされていることを確認できます。

  1. sudo systemctl status certbot.timer

これにより、次のようなものが出力されます。これは、ロードされたタスクが1日に2回実行されるようにスケジュールされていることを示しています。

Output
● certbot.timer - Run certbot twice daily Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled) Active: active (waiting) since Sun 2020-11-22 18:18:40 UTC; 2 weeks 6 days ago Trigger: Sun 2020-12-13 7:17:57 UTC; 11h left Nov 22 18:18:40 droplet1 systemd[1]: Started Run certbot twice daily.

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

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

  1. sudo certbot renew --dry-run

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

Output
... Cert not due for renewal, but simulating renewal for dry run Plugins selected: Authenticator dns-digitalocean, Installer None Renewing an existing certificate Performing the following challenges: dns-01 challenge for your_domain dns-01 challenge for subdomain.your_domain Waiting 10 seconds for DNS changes to propagate Waiting for verification... Cleaning up challenges ...

この最後のステップでは、Certbot内の自動更新プロセスをテストしました。

結論

このチュートリアルでは、certbot-dns-digitaloceanを使用してCertbotを設定し、DigitalOceanDNS管理APIでDNS検証を使用して証明書を発行します。

certbot-dns-digitaloceanについて詳しく知りたい場合は、ユーティリティの公式ドキュメントを確認してください。

または、DigitalOceanを使用してDNSレコードを管理していない場合は、 Ubuntu18.04でacme-dns-certbotを使用してDNS検証を使用してLet’sEncrypt証明書を取得する方法を確認してください。 certbot-dns-digitaloceanのプロバイダーに依存しない代替手段。

最後に、さらに技術的な読み物が必要な場合は、プロセスがどのように機能するかを概説している公式RFCドキュメントの関連セクションを確認して、ACMEDNS検証の詳細を掘り下げることができます。