Ubuntu 18.04でacme-dns-certbotを使用してDNS検証によるLet's Encrypt証明書を取得する方法
著者は、Write for DOnationsプログラムの一環として寄付を受けるために、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非ルートユーザーが含まれています。
TLS証明書を取得できるドメイン名、DNSレコードを追加する機能を含みます。この特定の例では、
your-domainとsubdomain.your-domain、さらにワイルドカード証明書用の*.your-domainを使用します。ただし、必要に応じて他のドメイン、サブドメイン、またはワイルドカードに調整可能です。
これらの準備ができたら、サーバーに非ルートユーザーとしてログインして始めてください。
ステップ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
これは次のようなものを出力します:
certbot 0.31.0
このステップでは、Certbotをインストールしました。次に、acme-dns-certbotフックをダウンロードしてインストールします。
ステップ2 — acme-dns-certbotのインストール
ベースとなるCertbotプログラムがインストールされたので、acme-dns-certbotをダウンロードしてインストールできます。これにより、CertbotがDNS検証モードで動作できるようになります。
スクリプトのコピーをダウンロードすることから始めてください:
注意: ベストプラクティスとして、これを実行する前にこの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を追加してください:
#!/usr/bin/env python3
. . .
これは、スクリプトがレガシーなPythonバージョン2ではなく、最新のサポートされているPython 3のバージョンを使用することを保証するために必要です。
完了したら、ファイルを保存して閉じてください。
最後に、スクリプトを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のすべての自動統合機能を無効にします。この場合、サービスに自動的にインストールするのではなく、生の証明書を発行しているだけです。
Certbotを --manual-auth-hook 引数を介して acme-dns-certbot フックを使用するように設定します。CertbotがDNS検証を優先するように --preferred-challenges 引数を実行します。
証明書の検証を試みる前にCertbotに一時停止するように指示する必要があります。これは、--debug-challenges引数を使用することで行います。これは、acme-dns-certbotが必要とするDNS CNAMEレコードを設定するためのもので、このステップの後半で説明されます。--debug-challenges引数がないと、Certbotは一時停止しないため、必要なDNS変更を行う時間がなくなります。
使用したいドメイン名を-d引数で置き換えることを忘れずに。ワイルドカード証明書を発行したい場合は、アスタリスク(*)をバックスラッシュ(\)でエスケープすることを確認してください。
標準のCertbot手順に従った後、次のようなメッセージが表示されるようになります。
...
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設定に必要なDNS CNAME レコードを追加する必要があります。これにより、_acme-challenge サブドメインの制御がACME DNSサービスに委任され、acme-dns-certbotが証明書要求を検証するために必要なDNSレコードを設定できるようになります。
DigitalOceanをDNSプロバイダーとして使用している場合は、コントロールパネル内でDNSレコードを設定できます。
レコードの変更が迅速に伝播されることを保証するために、TTL(生存期間)を約300秒に設定することが推奨されます。
DNSレコードを設定したら、Certbotに戻り、証明書のリクエストを検証し、発行プロセスを完了するためにENTERを押してください。
これには数秒かかります。その後、証明書が発行されたことを確認するメッセージが表示されます。
...
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レコードを追加するように求められます。
たとえば、再度確認を行うことなく、別のスタンドアロンのワイルドカード証明書を発行することができます:
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で実行した初期設定に似た出力を表示します:
...
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
更新プロセスはユーザーの操作なしで最初から最後まで実行でき、初期設定時に指定したすべての構成オプションを記憶します。
これが有効になっているかどうかを、期限が近づくまで待たずにテストするために、ドライランをトリガーすることができます。これにより、実際の設定に変更を加えることなく、更新プロセスをシミュレートすることができます。
標準の renew コマンドを使用してドライランを実行できますが、--dry-run 引数を追加してください:
sudo certbot renew --dry-run
これは次のような出力を生成し、更新プロセスが正しく機能していることを保証します。
...
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を設定します。これにより、ワイルドカード証明書を使用する可能性と、ロードバランサーの背後にある多くの異なるウェブサーバーを管理することが可能になります。
acme-dns-certbotリポジトリを監視して、スクリプトの更新に注意してください。常に最新のサポートバージョンを実行することが推奨されます。
acme-dns-certbotについてもっと知りたい場合は、acme-dns-certbotのサーバーサイド要素であるacme-dnsプロジェクトのドキュメントを確認することをお勧めします。:
- GitHubのacme-dns
acme-dnsソフトウェアは自己ホスティングも可能であり、高セキュリティや複雑な環境で運用している場合に有益です。
また、プロセスの仕組みを説明している公式RFC文書の関連セクションを確認することで、ACME DNS検証の技術的詳細を掘り下げることもできます。
- RFC8555 - セクション8.4
