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コマンドに与える引数の説明です。
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/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"
発行オプションについて補足します。
これで永続的に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の設定を再確認してください。
焦らずTXTレコードの登録を行い、設定が反映したのを確認してから次に進めてください。