Let's Encrypt 無料SSLサーバ証明書のインストール

Let's Encryptは、商用利用も可能な無料のSSL/TLSサーバ証明書です。
ここでは、CentOS7でのインストール方法を記載します。

1. 準備作業

Let's EncryptのCertbotパッケージをインストールするためには「EPEL」リポジトリを経由して行う必要があります。
※リポジトリの「EPEL」を利用する方法は、yumのリポジトリの追加登録方法 (CentOS 7)を参照して下さい。

2. Certbotのインストール

「certbot」および「python-certbot-apache」をインストールします。
# yum --enablerepo=epel install certbot python-certbot-apache
CentOS8では、以下のようになります。
# dnf --enablerepo=epel install certbot

3. SSL/TLS サーバ証明書の取得

Let's Encrypt で SSL/TLS サーバ証明書を取得する際には、一般の認証局で SSL/TLS サーバ証明書を取得する場合とは異なり、秘密鍵・公開鍵・署名リクエスト(CSR)を手動で生成する必要はありません。これらの作業は、Certbot クライアントが自動的に行います。

(1) DNS設定と準備
Let's Encrypt のサーバから、入力したドメイン名を正引き(DNSのAレコードの参照)したIPアドレスの TCP Port 80 と TCP Port 443 に接続することで、ドメイン所有者であることの認証が行われます。
そのため、Certbot クライアントは、インターネットから当該ドメイン名にアクセスした際に接続されるサーバ(DNSのAレコードで指定されたIPアドレスのサーバ)で実行する必要があります。また、ルータやファイアウォールで TCP Port 80 や TCP Port 443 をブロックしている場合、予めインターネットからの接続(インバウンド)を許可する設定に変更する必要があります。

(2) Certbot クライアントの実行
以下のコマンドを入力すると、Let's Encrypt 発行の SSL/TLS サーバ証明書を取得するためのプログラムが起動して、画面が CLI から TUI に切り替わります。
# certbot certonly --standalone -d example.jp -d www.example.jp
※オプション -d で指定されているexample.jpやwww.example.jpは、サーバ証明書の取得を希望するドメイン名・サブドメイン名に置き換えてください。

(3) クライアントの自動アップデート
Certbot クライアントを実行すると、新しいバージョンのクライアントの有無が自動的にチェックされ、必要に応じてアップデートされます。
このアップデートには数秒~数十秒程度かかりますので、しばらくそのままで待ちます。
Checking for new version...

(4) メールアドレスの入力
Certbot クライアントが起動すると、
Enter email address (used for urgent notices and lost key recovery)
という入力欄が表示されるので、メールアドレスを入力します。
ここで入力したメールアドレスは、緊急の通知、鍵を紛失したときの復旧、証明書の有効期限が近付いた場合の通知に使用されます。

メールアドレスを入力して「了解」を選択します。

(5) 利用規約への同意
Let's Encrypt の利用規約(Terms of Service)への同意が求められます。
「Agree(同意)」を選択して、次のステップへ進みます。

(6) ドメイン名の入力
Certbot クライアントの実行時に、オプション「-d」で SSL/TLS サーバ証明書の取得を希望するドメイン名を指定しなかった場合には、TUI で入力が求められます。
オプション「-d」が指定されていた場合には、この画面は表示されずに次のステップに進みます。

(7) Webサーバの一時停止
TCP Port 80 や TCP Port 443 を Apache などのWebサーバソフトウェアが Listen している場合には、エラーメッセージが表示されます。
The program httpd (process ID 4078) is already listening on TCP port 80.
This will prevent us from binding to that port.
Please stop the httpd program temporarily and then try again.
もしくは
At least one of the (possibly) required ports is already taken.
Problem binding to port 80: Could not bind to IPv4 or IPv6.
※上記エラーメッセージが表示されて Certbot クライアントが終了された場合であっても「(4) メールアドレスの入力」と「(5) 利用規約への同意」の内容は保存されています。そのため、Webサーバの停止後に Certbot クライアントを再度実行すると、すぐに SSL/TLS サーバ証明書の取得処理が始まります。ただし、オプション「-d」で SSL/TLS サーバ証明書の取得を希望するドメイン名を指定しない場合には、TUI で入力が求められます。

Apacheを停止させます。
# systemctl stop httpd.service

その後、Certbot クライアントを再度実行します。
# certbot certonly --standalone -d example.jp -d www.example.jp

(8) SSL/TLS サーバ証明書の取得完了
SSL/TLS サーバ証明書の取得が完了すると、証明書等が /etc/letsencrypt ディレクトリ以下に自動的に保存されます。

(9) Webサーバの起動
Apacheを起動させます。
# systemctl start httpd.service

3. 取得した証明書ファイル

取得した証明書等の 実体 は、以下の場所に保存されます。
(1) サーバ証明書(公開鍵)
/etc/letsencrypt/archive/(ドメイン名)/cert[N].pem
※このファイルは SSL/TLS サーバ証明書(公開鍵を含む)です。中間証明書や秘密鍵は含まれていません。
※このファイルは Apache 2.4.8 未満 において、SSLCertificateFile ディレクティブで指定します。
※Apache 2.4.8 以降 や nginx では、このファイルは使用しません。

(2) 中間証明書
/etc/letsencrypt/archive/(ドメイン名)/chain[N].pem
※このファイルは、Webサイトへのアクセス時にブラウザに提供する中間証明書です。
※このファイルは Apache 2.4.8 未満 において、SSLCertificateChainFile ディレクティブで指定します。
※Apache 2.4.8 以降 や nginx では、このファイルは使用しません。

(3) サーバ証明書と中間証明書が結合されたファイル
/etc/letsencrypt/archive/(ドメイン名)/fullchain[N].pem
※このファイルは、certN.pem と chainN.pem の内容が結合されたファイルです。SSL/TLS サーバ証明書(公開鍵を含む)と中間証明書の両方が含まれています。
※このファイルは、Apache 2.4.8 以上では SSLCertificateFile ディレクティブ、nginx では ssl_certificate ディレクティブで指定します。
※Apache 2.4.8 未満 では、このファイルは使用しません。

(4) 秘密鍵
/etc/letsencrypt/archive/(ドメイン名)/privkey[N].pem
※このファイルは Apache(全バージョン) の SSLCertificateKeyFile ディレクティブ、nginx の ssl_certificate_key ディレクティブで指定します。
※ファイル名のNには、取得した証明書等の番号(発行順で連番)が入ります。
※Let's Encrypt で当該ドメインの証明書を発行したのが1回目の場合には、ファイル名のNは 1 となります。
※既に証明書等が保存されている状態で再度証明書等を取得した場合には、ファイル名のNが 2 以上の新しい番号で証明書等が保存されます。古い証明書等が上書きされることはありません。

(5) 証明書ファイルのシンボリックリンク
また、証明書等への シンボリックリンク が、以下の場所に作成されます。
■ サーバ証明書(公開鍵)
/etc/letsencrypt/live/(ドメイン名)/cert.pem
■ 中間証明書
/etc/letsencrypt/live/(ドメイン名)/chain.pem
■ サーバ証明書と中間証明書が結合されたファイル
/etc/letsencrypt/live/(ドメイン名)/fullchain.pem
■ 秘密鍵
/etc/letsencrypt/live/(ドメイン名)/privkey.pem
※既に証明書等が保存されている状態で新しい証明書等を取得した場合には、シンボリックリンクのリンク先のパスが新しい証明書等に変更されます。
※Apache や nginx などのWebサーバの設定で SSL/TLS の証明書等のファイルを指定する際に、シンボリックリンクで指定しておくと、証明書等の更新時にWebサーバの設定ファイルの書き換えが不要となります。

4. 証明書の有効期限の更新

証明書の有効期限の更新は、コマンドで実行できます。

/usr/bin/certbot renew --pre-hook "systemctl stop httpd.service" --post-hook "systemctl start httpd.service"
オプション 内容
--pre-hook 証明書を更新する前に実行するコマンドを記載します。
--post-hook 証明書を更新した後に実行するコマンドを記載します。
※上記コマンドでは、更新前にhttpdサービスを停止させ、更新後に起動させます。

これをcrontabに登録しておけば、有効期限が90日を切った証明書を自動的に更新させることができます。




最終更新:2020年03月09日 08:25