Let’s Encrypt とは、無料でSSL証明書を発行するための認証局 (CA: Certificate Authority) で、ウェブサイトのセキュリティを簡単かつ手頃な価格で向上させることができます。Let’s Encrypt は、非営利団体である Internet Security Research Group(ISRG)によって運営されています。
主な特徴
- 無料: Let’s Encrypt の SSL 証明書は無料で提供されています。
- 自動化: 証明書の取得、インストール、更新が自動化されており、効率的に管理できます。
- オープン: Let’s Encrypt はオープンスタンダードに基づいて開発されており、アクセスしやすいです。
- 透明性: 発行した証明書はすぐに公開され、誰でも確認することができます。
- 広範: 多くのプラットフォームや環境で利用可能です。
前提条件
- ドメイン名(例:example.com)
- ドメインを指す A レコードまたは CNAME レコードが DNS に登録済み
- ウェブサーバーがインストール及び設定済み (例: Apache, Nginx)
Certbot の導入
Certbot をインストール
EPEL リポジトリを有効化し、Certbot をインストールします。
sudo yum install epel-release
sudo yum install certbot
Webサーバー用の Certbot プラグインをインストール
ウェブサーバー(Apache または Nginx)に対応する Certbot プラグインをインストールします。
Apache
sudo yum install certbot-apache
Nginx
sudo yum install certbot-nginx
SAN (Subject Alternative Name) 証明書
Certbotを使用してHTTP認証でSAN証明書を取得する手順は以下の通りです。ここでは、例としてwww.example.com と example.com
の証明書を取得する方法を説明します。
SAN証明書は、HTTP認証、DNS認証のどちらも対応していまが、ここでは、HTTP認証での手順を説明します。
SAN 証明書の主な特徴
- 複数のドメインとサブドメインの対応: SAN 証明書には、複数のドメインとサブドメインを登録して、1枚の証明書で保護することができます。これにより、証明書管理の手間やコストを削減できます。
- 柔軟性: 追加のドメインやサブドメインを後から追加・変更することが可能です。ただし、追加や変更のたびに証明書の再発行が必要になります。
- 互換性: SAN 証明書は、ほとんどのウェブブラウザーとデバイスでサポートされており、広い範囲の互換性があります。
ただし、SAN 証明書はワイルドカード証明書と違って、指定されたドメインおよびサブドメインのみをカバーし、全てのサブドメインを自動的にカバーするわけではありません。大量のサブドメインを持つ場合はワイルドカード証明書の利用も検討してください。
Certbot を使用して SSL/TLS 証明書を取得
Certbot を使用して SSL/TLS 証明書を取得し、ウェブサーバーに自動的にインストールします。
Apache の場合
sudo certbot --apache -d example.com -d www.example.com
Nginx の場合
sudo certbot --nginx -d example.com -d www.example.com
ワイルドカード証明書
Certbotを使用してDNS認証でワイルドカード証明書を取得する手順は以下の通りです。ここでは、例としてexample.com
とそのワイルドカード(*.example.com
)の証明書を取得する方法を説明します。
ワイルドカード証明書は、DNS認証のみに対応しています。
DNS認証は、HTTP認証と異なり外部のDNSと連携する仕組みが必要になるため動作が複雑です。
ワイルドカード証明書の主な特徴
- 無制限のサブドメインの保護: ワイルドカード証明書は、無制限のサブドメインを保護できます。これにより、新しいサブドメインを追加した場合でも、その都度証明書を再発行する必要がありません。
- 互換性: ワイルドカード証明書は、ほとんどのウェブブラウザーとデバイスでサポートされており、広い範囲の互換性があります。
ただし、ワイルドカード証明書は、サブドメインのみを保護し、複数の異なるドメイン(例:example1.com
, example2.com
)を保護することはできません。そういった場合は、SAN (Subject Alternative Name) 証明書の利用を検討してください。
また、階層が違うドメインは無効です。
(例:*.example.com
証明書で、 *.sub.example.com
は保護できません)
CertBot を使用してワイルドカード証明書の取得
Certbotを実行してDNSプラグインを指定し、ワイルドカード証明書をリクエストします。サーバーによっては sudo
が必要です。
sudo certbot certonly --manual --preferred-challenges dns -d example.com -d *.example.com
Certbotは、DNS認証用のTXTレコードを追加するよう指示します。表示された値をメモしてください。
Please deploy a DNS TXT record under the name
_acme-challenge.example.com with the following value:
abcdef1234567890abcdef1234567890abcdef12
Before continuing, verify the record is deployed.
DNSプロバイダの管理画面にアクセスし、指示されたTXTレコードを追加します。次のような形式で入力してください。
Type: TXT
Name: _acme-challenge.example.com
Value: abcdef1234567890abcdef1234567890abcdef12
TXTレコードが適切に反映(プロパゲーション)されるまで待ちます。通常、数分から数時間かかります。https://dnschecker.org/ などのツールを使用して、TXTレコードが正しく認識されているか確認できます。
反映後、Certbotのウィンドウに戻って認証を続行します。Press Enter to Continue
と表示されている場所でEnterキーを押してください。
認証が成功すると、証明書ファイル(fullchain.pem
)と秘密鍵ファイル(privkey.pem
)へのパスが表示されます。
Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/example.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/example.com/privkey.pem
証明書の更新を自動化 (オプション)
Let’s Encrypt 証明書は 90 日間の有効期限があります。以下のコマンドで Certbot の自動更新機能をテストできます。
sudo certbot renew --dry-run
DNSチャレンジを使ってワイルドカード証明書を取得する場合、CertbotにDNSプロバイダ用のプラグインをインストールして設定すると、自動更新が可能になります。これらのプラグインは、DNSレコードを自動的に更新して、証明書のリニューアルを簡単に行えるようになります。
例として、Google Cloud DNSを使用している場合、次のような手順で証明書の取得と自動更新が可能です。
CertbotのGoogle Cloud DNSプラグインをインストール
sudo apt-get install certbot-dns-google
Google Cloudの認証用JSONキーファイルを作成し、サーバーにアップロード
証明書の取得時に--dns-google
プラグインと--dns-google-credentials
オプションを使用
sudo certbot certonly --dns-google --dns-google-credentials /path/to/your/credentials.json -d example.com -d *.example.com
これで、証明書が取得され、sudo certbot renew --dry-run
を使って自動更新が確認できます。更新時には、CertbotがGoogle Cloud DNSのTXTレコードを自動的に更新します。
他のDNSプロバイダも同様の方法で対応している場合があります。
証明書が正しくインストールされているか確認
ウェブブラウザで https://example.com や https://www.example.com にアクセスして、鍵のアイコンが表示されることを確認してください。これで、証明書が正しくインストールされていることがわかります。
証明書の自動更新
最後に、証明書の自動更新を有効にするために、以下のコマンドを使用してcronジョブを作成します。
sudo crontab -e
ファイルを開いたら、以下の行を追加して保存してください。
0 2 * * * /usr/bin/certbot renew --apache && systemctl restart httpd
これにより、毎日午前2時に証明書が更新され、Apacheが再起動されるようになります。
証明書のディレクトリ
Certbotで取得したLet’s Encrypt証明書は、通常次のディレクトリに配置されています。
/etc/letsencrypt/live/your_domain_name/
このディレクトリ内には以下のファイルが含まれています。
- cert.pem: サーバー証明書(公開鍵)
- chain.pem: 中間証明書チェーン
- fullchain.pem: cert.pemとchain.pemを組み合わせたもの。これはサーバー証明書と中間証明書チェーンを含む単一のファイルです。
- privkey.pem: 秘密鍵
証明書を使用するサービスやアプリケーションの構成ファイルに適切なパスを指定してください。
例えば、Nginxで証明書を使用する場合、次のように設定ファイルに追加します。
ssl_certificate /etc/letsencrypt/live/your_domain_name/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your_domain_name/privkey.pem;
Apacheの場合は、次のように設定ファイルに追加します。
SSLCertificateFile /etc/letsencrypt/live/your_domain_name/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/your_domain_name/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/your_domain_name/chain.pem
証明書が適切にインストールされた後、Webサーバーを再起動して変更を適用します。