Let’s Encrypt ワイルドカード証明書の設定方法:すべてのサブドメインを保護

Linux

<景品表示法に基づく表記> 本サイトのコンテンツには、商品プロモーションが含まれている場合があります。

Let’s Encryptを利用してワイルドカード証明書が取得できるので手順をまとめてみました。

  • 無料でサーバー証明書を発行したい
  • ワイルドカード証明書を発行したい
  • Let’s Encrypt の発行手順を知りたい

ウェブサイトのセキュリティは極めて重要です。特に、多くのサブドメインを持つ場合、すべてを保護するためにどのようにSSL/TLS証明書を取得できるかを知っておくことは不可欠です。

急ぎの方は、このコマンドを利用してください。ドメイン、メアドは読み換えてください。

# certbot certonly \
--manual \
--server https://acme-v02.api.letsencrypt.org/directory \ 
--preferred-challenges dns \ 
-d my-domain.com \
-d *.my-domain.com \
--agree-tos \ 
--manual-public-ip-logging-ok \
-m [email protected] 

Let’s Encryptを使用してワイルドカード証明書を作成する方法に焦点を当てたガイドをご紹介します。SSL証明書の取得を簡単かつ効果的に行い、セキュリティを向上させましょう。

Let’s Encryptとは

無料でSSL/TLS証明書を提供する非営利の認証局

Let’s Encrypt(レッツ エンクリプト)は、非営利の認証局(Certificate Authority, CA)で、無料でSSL/TLS証明書を提供し、ウェブサイトやアプリケーションのセキュリティを向上させるために設計されたオープンソースのプロジェクトです。

Let’s Encryptはセキュアなウェブトラフィックを実珸化するための貴重なツールであり、ウェブサイトやアプリケーションのセキュリティを向上させるのに役立ちます。無料で利用できるため、誰でも手軽にSSL/TLS証明書を入手できる点が特に魅力的です。

Let’s Encryptの主要な特徴と役割について

無料のSSL/TLS証明書提供

Let’s Encryptは無料でSSL/TLS証明書を提供する唯一の大規模な認証局です。これにより、ウェブサイトの運営者や開発者は安価な方法でウェブトラフィックを暗号化し、データのセキュリティを向上させることができます。

オープンソース

Let’s Encryptはオープンソースプロジェクトで、ソースコードや設計が一般に公開されています。これはセキュリティに関して透明性を提供し、コミュニティの検証を受けることができる点で重要です。

自動証明書の取得

Let’s Encryptは自動化を重視しており、SSL/TLS証明書の取得を簡単に行えるように設計されています。自動更新もサポートしており、証明書の有効期限が切れる心配が減ります。

ワイルドカード証明書

Let’s Encryptはワイルドカード証明書をサポートしており、サブドメインを一括して保護するために使用できます。例えば、*.example.comという形式で、すべてのサブドメインに対して有効な証明書を取得できます。

強固なセキュリティ基準

Let’s EncryptはSSL/TLSの最新のセキュリティ基準に従っており、高度な暗号化を提供します。これにより、データの機密性や完全性を確保できます。

広範なプラットフォームとツールのサポート

Let’s Encryptはさまざまなプラットフォームとツールに統合できるように設計されています。これにより、多くのウェブホスティングプロバイダーとウェブサーバーソフトウェアで簡単に使用できます。

コミュニティと協力

Let’s Encryptプロジェクトはコミュニティと協力体制の一環として運営されており、証明書の発行プロセスやセキュリティポリシーの向上に協力するさまざまな団体やボランティアが参加しています。

Let’s Encryptを利用するための事前準備

git インストール

私は Rocky Linux を利用しています。「Rocky Linux (ロッキーリナックス)」と「AlmaLinux(アルマリナックス)」という Linux ディストリビューションは CentOS Linux の後継として RHEL(Red Hat Enterprise Linux)の完全クローンです。

Let’s Encrypt を利用するには git パッケージが必要になります。

# dnf install git

dnf コマンドを利用してパッケージをインストールしてください。

Let’s Encrypt をインストール

git コマンドを利用して、Let’s Encrypt をダウンロード(clone)してきます。ダウンロードする位置が任意のディレクトリです。私の場合は /etc の下に展開します。

# cd /etc
# git clone https://github.com/letsencrypt/letsencrypt.git

/etc/letsencrypt 配下にLet’s Encrypt がダウンロードされます。

certbot をインストール

私の場合は certbot を利用して Let’s Encrypt を設定するのでパッケージをインストールします。certbot パッケージは epel に格納されています。

# dnf install epel-release
# dnf install certbot

dnf コマンドを利用してパッケージをインストールしてください。

DNS認証によるワイルドカードSSL証明書の発行

ワイルドカード証明書はDNS認証が条件

ドメインの使用権があることを確認する認証方式を、ワイルドカード証明書を発行する場合はDNS認証を選択する必要があります。

デフォルトの認証方式はHTTPによる認証です。ウェブサイトに認証用ファイルを設置しHTTP経由で確認できれば認証が成功します。

ワイルドカード証明書を使用する場合は、DNSによる認証方式に変更する必要があります。
Let’s Encryptが発行するトークンをDNSのTXTレコードに追加することでドメインの使用権があることを確認します。

certbotを用いてワイルドカード証明書の発行

certbotコマンドの実行(DNS登録まで)

certbotコマンドを利用してLet’s Encryptのサーバー証明書を発行します。

# certbot certonly \
--manual \
--server https://acme-v02.api.letsencrypt.org/directory \ 
--preferred-challenges dns \ 
-d my-domain.com \
-d *.my-domain.com \
--agree-tos \ 
--manual-public-ip-logging-ok \
-m [email protected] 

certbotコマンドに与える引数の説明です。

certonly:証明書の取得プロセスのみ実行します。certbot に引数を与えない場合は、「Webサービス」と「証明書の取得」を同時に行います。ApacheやNginxを利用する場合は、Webサービスが不要なので証明書の取得プロセスのみを行います。
–manual:ドメイン名の認証を手動で行います。引数を与えない場合、サーバー設定から自動でドメインを認識します。
–server:証明書発行に利用するサーバーを指定します。デフォルトのURIは https://acme-v01.api.letsencrypt.org/directoryです。ワイルドカード証明書に対応しているサーバーを指定します。
–preferred-challenges:ドメインの使用権の認証方式を指定します。デフォルトはhttpでウェブサーバー上に認証用ファイルを設置しHTTP経由で確認が実施されます。ワイルドカード証明書は、DNS認証を指定する必要があります。
-d:証明書を発行するドメインを指定します。ワイルドカード証明書を発行する場合は、ルートドメインと、ワイルドカードを指定したサブドメインの2つを引数に与えます。
–agree-tos:利用規約に自動で同意します。
–manual-public-ip-logging-ok:グローバルIPアドレスを認証局でロギングすること許可します。
-m:アカウント登録や回復などに使用する電子メールアドレスを指定します。証明書を取得するドメイン名のメールアドレスである必要はなく、同一のメールアドレスで、複数の証明書を管理することができます。

certbotコマンドを実行すると、プロンプトにメッセージが表示されるので、手順に沿って進めていきます。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: y ←yを入力しエンターキー押下 

Let’s Encrypt プロジェクトの創設パートナーであり、Certbot を開発する非営利団体である Electronic Frontier Foundation とあなたの電子メール アドレスを共有してもよろしいでしょうか? Web の暗号化に関する取り組み、EFF ニュース、キャンペーン、デジタルの自由をサポートする方法について電子メールをお送りしたいと考えています。

次は、DNS のTXTレコードを設定するようにトークンが表示されます。DNSサーバーに表示されたトークンをTXTレコードを登録します。

Please deploy a DNS TXT record under the name
_acme-challenge.my-domain.com with the following value:

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Before continuing, verify the record is deployed.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue ←DNS TXTレコードが反映したことを確認すること!

次の値を使用して、_acme-challenge.my-domain.com という名前で DNS TXT レコードを展開してください。

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

続行する前に、レコードがデプロイされていることを確認してください。

DNSの設定が反映するまで少し時間が必要です。レコードが反映したか確認してからエンターキーを押下することをおすすめします。

DNS情報の登録

プロンプトに表示されたトークンをDNSのTXTレコードに追加します。

ちなみに、DNSレコードが反映する前や、早まってエンターキー押下した場合はエラーになります。実行するたびにトークンが変わります。

DNSはレコードをキャッシュします。間違ったレコードを登録してしまうと再反映まで時間がかかります。焦らずTXTレコードの登録を行い、設定が反映したのを確認してから次に進めてください。

利用端末がWindowsであれば、コマンドプロンプトを利用して反映を確認することができます。

C:a>nslookup -type=TXT _acme-challenge.my-domain.com 8.8.8.8
サーバー:  dns.google
Address:  8.8.8.8

権限のない回答:
_acme-challenge.my-domain.com  text =

        "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

C:\Users\koura>

プロンプトにトークンが表示されます。

certbotコマンドの実行(DNS登録後のつづき)

DNSのTXTレコードが反映していることを確認したらcertbotコマンドを実行したプロンプトを進めます。

Please deploy a DNS TXT record under the name
_acme-challenge.my-domain.com with the following value:

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Before continuing, verify the record is deployed.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue ←DNS TXTレコードが反映したことを確認すること!

DNSのTXTレコードを読み取ることができると証明書が発行されます。

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/my-domain.com/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/my-domain.com/privkey.pem
This certificate expires on YYYY-MM-DD.
These files will be updated when the certificate renews.

NEXT STEPS:
- This certificate will not be renewed automatically. Autorenewal of --manual certificates requires the use of an authentication hook script (--manual-auth-hook) but one was not provided. To renew this certificate, repeat this same certbot command before the certificate's expiry date.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

証明書を正常に受け取りました。

証明書の保存場所: /etc/letsencrypt/live/my-domain.com/fullchain.pem
キーの保存場所: /etc/letsencrypt/live/my-domain.com/privkey.pem

この証明書の有効期限は YYYY-MM-DD です。 これらのファイルは、証明書が更新されるときに更新されます。

次のステップ: – この証明書は自動的には更新されません。 –manual 証明書の自動更新には認証フック スクリプト (–manual-auth-hook) の使用が必要ですが、そのスクリプトが提供されていませんでした。 この証明書を更新するには、証明書の有効期限が切れる前に、これと同じ certbot コマンドを繰り返します。

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Certbot を気に入っていただけましたら、私たちの取り組みをサポートすることをご検討ください。
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –

Webサーバー(Apache,Nginx,IIS)にサーバー証明書の適応

Let’s Encrypt証明書は、/etc/letsencrypt/live/my-domain.com/ に保存されます。

サーバー証明書:/etc/letsencrypt/live/my-domain.com/fullchain.pem
秘密鍵:/etc/letsencrypt/live/my-domain.com/privkey.pem

Webサーバー(Apache,Nginxなど)に発行されたLet’s Encrypt証明書を指定してください。

Apacheの場合はこんな感じです。

 <VirtualHost *:443>
        ServerName my-domain.com
        SSLEngine on
        SSLCertificateFile /etc/letsencrypt/live/my-domain.com/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/my-domain.com/privkey.pem
</VirtualHost>

関連記事 CentOS8 + Apache + Let’s Encrypt、無料でサイトをSSL化(https)する

Nginxの場合はこんな感じです。

 server {
        listen  443 ssl  ;
        server_name     my-domain.com;

        ssl_certificate /etc/letsencrypt/live/my-domain.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/my-domain.com/privkey.pem;
}

関連記事 Nginx + Let’s Encrypt のインストール

発行されたLet’s Encrypt証明書の有効期間は通常3ヶ月です。定期的に更新を行う必要があるのでご注意ください。

Let’s Encrypt 証明書の自動更新

Let’s Encryptサーバー証明書の有効期間は3ヶ月

Let’s Encryptの証明書の短い有効期限は、セキュリティを向上させ、証明書の更新プロセスを改善し、ウェブサイトのセキュリティを確保するための重要な措置です。短期間の証明書を定期的に更新することで、ウェブサイトの保護とセキュリティを維持することができます。

セキュリティ向上:長期間にわたる証明書は、万一証明書が漏洩したり秘密鍵が破られた場合、攻撃者が長期間にわたり悪用する機会を提供します。3ヶ月ごとに証明書を更新することで、潜在的なリスクを最小限に抑え、セキュリティを向上させます。

自動更新の奨励:短期間の証明書は、証明書の自動更新を奨励します。これにより、証明書の有効期限切れによる問題を減らし、ウェブサイトのセキュリティを保護するのに役立ちます。自動更新は手動更新よりも信頼性が高く、証明書の常に最新で有効であることを確保します。

ドメイン所有権の確認:3ヶ月ごとに新しい証明書を取得することは、ドメイン所有権を確認する機会を提供します。これにより、ドメインが正当な所有者のものであることを確認し、証明書の滥用や不正使用を防ぎます。

速い変更への対応:ウェブサイトの設定が変更された場合、新しい設定が迅速に反映されるように、証明書の有効期限が短いことが役立ちます。長期間の証明書は設定変更に対応しにくく、適切なセキュリティ設定を確保するのに時間がかかることがあります。

ステートレスな証明書の促進:Let’s Encryptは、ステートレスな証明書の使用を奨励しています。これは、証明書のステートレスな管理をサポートするプロトコルで、証明書をより効率的に扱うための方法です。3ヶ月ごとの更新は、ステートレスな証明書の実装を促進します。

certbot コマンド定期的に実行するためにCronを利用して自動更新スクリプトを実行することで簡単に実施することが可能となります。

Cronを用いた自動更新スクリプト

Let’s Encryptの証明書を更新するには、certbot renewコマンドを使用します。コマンドはこんな感じです。

# /usr/bin/certbot renew --post-hook "/bin/systemctl restart httpd"

cronでスケジューリング登録してcertbot renewを実行することで自動化します。

Let’s Encrypt証明書の有効期限は3ヶ月です。更新処理を3ヶ月(90日)より少し短めにして登録するようにします。ギリギリを指定するとCronが実行される前に有効期限が切れてしまう場合があります。

Cronを1ヶ月毎に指定していると、月末31日を何度か経過すると足りなくなりましたので今は毎週実行しています。更新不要の場合は、自動的にスキップされるので問題はありません。

# 毎週 木 4:10
# For Nginx
10 4 * * 4  /usr/bin/certbot renew --post-hook "/bin/systemctl reload nginx"

# For Apache
10 4 * * 4  /usr/bin/certbot renew --post-hook "/bin/systemctl reload httpd"

発行オプションについて補足します。

–post-hook: 証明書の更新後に実行するコマンドを指定する。更新が必要なときのみ(=デフォルトでは有効期限まで30日未満のときのみ)実行される。一般的には、更新後の証明書を反映するための、Apache/Nginxを再起動するコマンドを指定する。
–pre-hook: 証明書の更新前に実行するコマンドを指定する。更新が必要なときのみ(=デフォルトでは有効期限まで30日未満のときのみ)実行される。
–dry-run: テスト実行する(いわゆるドライラン)。実際には証明書は更新しない。–pre-hook, –post-hookで指定したコマンドは実行される。このオプションはcertonlyサブコマンドでも使用できる。
–force-renewal: 有効期限までの日数に関わらず、強制的に証明書を更新する。ただし、一定期間内に更新できる回数には制限がある。

これで永続的にLet’s Encrypt証明書を利用することが可能となります。

トラブルシューティング

Certbot failed to authenticate some domains (authenticator: manual)

Let’s Encryptのワイルドカード証明書は、DNSによる認証方式を利用します。証明書発行でエラーが発生する場合は、DNSのTXTレコードを読み取れずエラーになるのが原因です。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name:

_acme-challenge.my-domain.com.

with the following value:

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Before continuing, verify the TXT record has been deployed. Depending on the DNS
provider, this may take some time, from a few seconds to multiple minutes. You can
check if it has finished deploying with aid of online tools, such as the Google
Admin Toolbox: https://toolbox.googleapps.com/apps/dig/#TXT/_acme-challenge.my-domain.com.
Look for one or more bolded line(s) below the line ';ANSWER'. It should show the
value(s) you've just added.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Certbot failed to authenticate some domains (authenticator: manual). The Certificate Authority reported these problems:
  Domain: my-domain.com
  Type:   dns
  Detail: DNS problem: NXDOMAIN looking up TXT for _acme-challenge.my-domain.com - check that a DNS record exists for this domain

Hint: The Certificate Authority failed to verify the manually created DNS TXT records. Ensure that you created these in the correct location, or
try waiting longer for DNS propagation on the next attempt.

Some challenges have failed.
Ask for help or search for solutions at https://community.letsencrypt.org. See the logfile /var/log/letsencrypt/letsencrypt.log or re-run Certbot with -v for more details.


– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
DNS TXT レコードを次の名前で展開してください。

_acme-challenge.my-domain.com.

次の値を使用します。

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

続行する前に、TXT レコードが展開されていることを確認してください。 DNSに応じてプロバイダーの場合、これには数秒から数分まで時間がかかる場合があります。 あなたはできるGoogle などのオンライン ツールを使用して、展開が完了したかどうかを確認します。管理ツールボックス: https://toolbox.googleapps.com/apps/dig/#TXT/_acme-challenge.my-domain.com「;ANSWER」行の下にある 1 つ以上の太字の行を探します。 表示されるはずです
追加した値。

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –

Certbot が一部のドメインの認証に失敗しました (認証者: 手動)。 認証局は次の問題を報告しました。
ドメイン: my-domain.com
タイプ: DNS
詳細: DNS の問題: NXDOMAIN が _acme-challenge.my-domain.com の TXT を検索しています – このドメインの DNS レコードが存在することを確認してください

ヒント: 認証局は、手動で作成された DNS TXT レコードを検証できませんでした。 これらが正しい場所に作成されたことを確認するか、次回の試行で DNS の伝達を長めに待ってみてください。

いくつかのチャレンジは失敗しました。
https://community.letsencrypt.org で助けを求めるか、解決策を検索してください。 詳細については、ログファイル /var/log/letsencrypt/letsencrypt.log を参照するか、-v を指定して Certbot を再実行してください。

Let’s Encryptが発行するトークンをDNSのTXTレコードとして読み取りに失敗しているのが原因です。DNSの設定を再確認してください。

DNSはレコードをキャッシュします。間違ったレコードを登録してしまうと再反映まで時間がかかります。

焦らずTXTレコードの登録を行い、設定が反映したのを確認してから次に進めてください。