0. インストール要件
すでに Web サーバ (Apache) が稼働していることが前提。
Web サーバを停止せずに証明書を取得し、そのあと一度だけ Web サーバを再起動します。
また、証明書を更新し、それがうまくいったときも Web サーバを再起動します。
・Web サーバ
ここでは、同一のサーバに Web サーバのドメインを 2 つ作成し、それぞれエイリアスを作っているため、
合計で 4 つの URI が存在します。(1 個の証明書ファイルに 4 個分の証明書を格納する)
項目 内容 備考 OS CentOS8 - Web サーバソフト Apache 2.4.37 CentOS8 に付属 Apache の設定ファイル(http) /etc/httpd/conf/httpd.conf - Apache の設定ファイル(https) /etc/httpd/conf.d/ssl.conf - Web サーバ(1) ドキュメントルート /var/www1/htdocs/ certbot によって、この中にディレクトリ
.well-known/acme-challenge/ が一時的に作られるサーバ1-A www.example1.jp URI: https://www.example1.jp:443/ サーバ1-B example1.jp (エイリアス) URI: https://example1.jp:443/ Web サーバ(2) ドキュメントルート /var/www2/htdocs/ certbot によって、この中にディレクトリ
.well-known/acme-challenge/ が一時的に作られるサーバ2-A www.example2.jp URI: https://www.example2.jp:443/ サーバ2-B example2.jp (エイリアス) URI: https://example2.jp:443/
・証明書取得ツール
項目 内容 備考 ACME クライアント certbot ACME プロトコルとは、Web サーバと認証局の通信を自動化するための規約 ACME サーバ Let's Encrypt フリーで自動化されたオープンな認証局。DV 型認証のみを扱う 連絡先メールアドレス admin@example1.jp 緊急更新やセキュリティ通知に使われる 証明書格納ディレクトリ /etc/letsencrypt/ certbot のインストール時に自動作成される
1. certbot のインストール
1-1. EPEL 8 リリース 10 のリポジトリ情報がインストールされているか確認する。
$ su1-2. EPEL のリポジトリ情報をインストールする。(有効でない場合)
# dnf info epel-release
・有効な場合 (リリースが 10.el8)
インストール済みパッケージ 名前 : epel-release バージョン : 8 リリース : 10.el8 ← OK Arch : noarch サイズ : 32 k ソース : epel-release-8-10.el8.src.rpm リポジトリー : @System repo から : @commandline 概要 : Extra Packages for Enterprise Linux repository configuration URL : http://download.fedoraproject.org/pub/epel ライセンス : GPLv2 説明 : This package contains the Extra Packages for Enterprise Linux : (EPEL) repository GPG key as well as configuration for yum.
・無効な場合 (リリースが 8.el8)
利用可能なパッケージ 名前 : epel-release バージョン : 8 リリース : 8.el8 ← NG Arch : noarch サイズ : 23 k ソース : epel-release-8-8.el8.src.rpm リポジトリー : extras 概要 : Extra Packages for Enterprise Linux repository configuration URL : http://download.fedoraproject.org/pub/epel ライセンス : GPLv2 説明 : This package contains the Extra Packages for Enterprise Linux : (EPEL) repository GPG key as well as configuration for yum.
# dnf -y install epel-release1-3. certbot をインストールする。
# dnf -y install certbot
# which certbot
# certbot --version
/bin/certbot
# ls -d /etc/letsencrypt/
certbot 1.14.0
# exitインストールによって Let's Encrypt 用のワークディレクトリも作成された。
/etc/letsencrypt/
$
2. Apache の実行確認
2-1. Apache の実行を確認する。
$ systemctl status httpd | grep Active2-2. Apache で実行中のサーバ名、ドキュメントルートを確認する。
「active (running)」になっていること。
Active: active (running) since Thu 2020-12-24 04:43:12 JST; 14h ago
$ cat /etc/httpd/conf/httpd.conf | egrep '(ServerName|DocumentRoot|ServerAlias)'
DocumentRoot "/var/www1/htdocs" ServerName www.example1.jp:80 ServerAlias example1.jp www.example1.jp
DocumentRoot "/var/www2/htdocs" ServerName www.example2.jp:80 ServerAlias example2.jp www.example2.jp
それぞれ、
を確認できた。
Web サーバ ドキュメントルート サーバ名 エイリアス (1) /var/www1/htdocs www.example1.jp example1.jp (2) /var/www2/htdocs www.example2.jp example2.jp
3. 証明書の取得
3-1. certbot を実行する。
上記 2-2 で確認したサーバ名、ドキュメントルートを指定して certbot を実行する。3-2. 証明書ファイルを確認する。
$ su
# certbot certonly --staging \
--webroot \
-w /var/www1/htdocs/ -d www.example1.jp -d example1.jp \
-w /var/www2/htdocs/ -d www.example2.jp -d example2.jp
最初はオプション --staging を付けて実行し、すべての正常動作が確認出来たら、これを取り除いて再度実行する。
本番サーバに対する証明書取得・更新の頻度は 5 回/週 の制限があります。
ステージングサーバへのアクセスに制限はありません。
Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: Authenticator webroot, Installer None Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel): admin@example1.jp ⏎ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Please read the Terms of Service at https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must agree in order to register with the ACME server. Do you agree? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (Y)es/(N)o: y ⏎ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Would you be willing, once your first certificate is successfully issued, 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: n ⏎ Account registered. Requesting a certificate for www.example1.jp Performing the following challenges: http-01 challenge for example1.jp http-01 challenge for example2.jp http-01 challenge for www.example1.jp http-01 challenge for www.example2.jp Using the webroot path /var/www2/htdocs for all unmatched domains. # --(*1) Waiting for verification... Cleaning up challenges IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: # --(*2) /etc/letsencrypt/live/www.example1.jp/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/www.example1.jp/privkey.pem Your cert will expire on 2021-03-24. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. To non-interactively renew *all* of your certificates, run "certbot renew" - 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
・「Terms of Service」(利用規約) に同意しないと途中で終わってしまうので、
「Do you agree?」(同意しますか?) には Yes を答えることが必要。(説明のため青文字にしています。実際は青文字ではありません)
・「Would you be willing ~」には No を入力しています。EFF (メインスポンサー) のニュースやキャンペーン情報が必要な人は Yes を入力します。
- (*1) 一致しないすべてのドメインに /var/www2/htdocs を使用します。
- (*2) 証明書(と、チェーン)、キーファイルはそれぞれ、次の場所に保存されました。
/etc/letsencrypt/live/www.example1.jp/fullchain.pem
/etc/letsencrypt/live/www.example1.jp/privkey.pem
# cd /etc/letsencrypt/live/www.example1.jp/3-3. 証明書の内容を確認する。
/etc/letsencrypt/live/www.example1.jp/# ls -l
証明書ファイルへのシンボリックリンク (Apache の ssl.conf には、このリンクを記述する)/etc/letsencrypt/live/www.example1.jp/# cd ../../archive/www.example1.jp/
-rw-r--r--. 1 root root 692 12月 24 20:56 README lrwxrwxrwx. 1 root root 39 12月 24 20:56 cert.pem -> ../../archive/www.example1.jp/cert.pem -- (A) lrwxrwxrwx. 1 root root 40 12月 24 20:56 chain.pem -> ../../archive/www.example1.jp/chain1.pem -- (B) lrwxrwxrwx. 1 root root 44 12月 24 20:56 fullchain.pem -> ../../archive/www.example1.jp/fullchain1.pem lrwxrwxrwx. 1 root root 42 12月 24 20:56 privkey.pem -> ../../archive/www.example1.jp/privkey1.pem -- (C)
/etc/letsencrypt/archive/www.example1.jp/# ls -l
証明書ファイルの実体
-rw-r--r--. 1 root root 1842 12月 24 20:56 cert.pem -rw-r--r--. 1 root root 1586 12月 24 20:56 chain1.pem -rw-r--r--. 1 root root 3428 12月 24 20:56 fullchain1.pem -rw-------. 1 root root 1704 12月 24 20:56 privkey1.pem
/etc/letsencrypt/archive/www.example1.jp/# which openssl
/etc/letsencrypt/archive/www.example1.jp/# openssl x509 -noout -ext subjectAltName -dates -in cert.pem
/bin/openssl
/etc/letsencrypt/archive/www.example1.jp/# exit*3証明書の有効開始日。
X509v3 Subject Alternative Name: DNS:example1.jp, DNS:example2.jp, DNS:www.example1.jp, DNS:www.example2.jp notBefore=Dec 24 09:21:18 2020 GMT*3 notAfter=Mar 23 09:21:17 2021 GMT*4
*4証明書の有効期限。(この日までに更新する必要がある)
$
4. Apache の設定
4-1. 設定ファイルへ証明書のパスを記述する。
$ su4-2. Apache を再起動する。
# cd /etc/httpd/conf.d/
/etc/httpd/conf.d# vim ssl.conf
~ SSLCertificateFile /etc/letsencrypt/live/www.example1.jp/cert.pem -- (A) のフルパスを指定する SSLCertificateKeyFile /etc/letsencrypt/live/www.example1.jp/privkey.pem -- (C) のフルパスを指定する SSLCertificateChainFile /etc/letsencrypt/live/www.example1.jp/chain.pem -- (B) のフルパスを指定する ~
# systemctl restart httpd # exit $
5. 動作確認
5-1. Web ページをブラウザで閲覧して確認する。
下記例は Firefox 84.0.1 の画面
↓
↓
6. 証明書の自動更新
Let's Encrypt の証明書は、期限が 90 日となっている。
継続して利用するには期限前の更新が必要。
6-1. 更新コマンドを実行してみる。
$ su6-2. 証明書の自動更新用ファイルを確認する。
# certbot renew
まだ更新期限の 30 日前を迎えていないので更新されない。
更新しようともしない (No renewals were attempted) ので、Let's Encrypt サーバに負荷はかからない。
Saving debug log to /var/log/letsencrypt/letsencrypt.log - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Processing /etc/letsencrypt/renewal/www.example1.jp.conf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Cert not yet due for renewal - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The following certs are not due for renewal yet: /etc/letsencrypt/live/www.example1.jp/fullchain.pem expires on 2021-03-24 (skipped) No renewals were attempted. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# ls -l /usr/lib/systemd/system/certbot-renew.*6-3. certbot の環境ファイルを編集する。
[certbot-renew.service] (無変更)
-rw-r--r--. 1 root root 284 12月 4 05:50 /usr/lib/systemd/system/certbot-renew.service -rw-r--r--. 1 root root 195 12月 4 05:50 /usr/lib/systemd/system/certbot-renew.timer
certbot-renew.service は certbot-renew.timer から起動されるプロセスなので enable にしない。(できない)
[Unit] Description=This service automatically renews any certbot certificates found [Service] EnvironmentFile=/etc/sysconfig/certbot Type=oneshot ExecStart=/usr/bin/certbot renew --noninteractive --no-random-sleep-on-renew $PRE_HOOK $POST_HOOK $RENEW_HOOK $DEPLOY_HOOK $CERTBOT_ARGS
[certbot-renew.timer] (無変更)
毎日 2 回、ランダムに certbot-renew.service を起動するようになっている。
[Unit] Description=This is the timer to set the schedule for automated renewals [Timer] OnCalendar=*-*-* 00/12:00:00 RandomizedDelaySec=12hours Persistent=true [Install] WantedBy=timers.target
(起動されても期限が到来していなければ、上記 6-1 のように何も起きない)
# vim /etc/sysconfig/certbot6-4. 証明書の更新を systemd (timer) に登録する。
証明書が更新されたら Apache を再起動する指定を追加。
~ RENEW_HOOK="--renew-hook 'systemctl restart httpd'" ~
# systemctl enable certbot-renew.timer
# systemctl start certbot-renew.timer
# systemctl status certbot-renew.timer | grep ActiveOS 起動時に自動更新のタイマーも起動されるようになった。# systemctl list-timers | grep certbot-renew.timer
Active: active (waiting) since Thu 2020-12-25 08:56:05 JST; 1h 38min ago
次は 12 時間後 ("12h left") に certbot-renew.service が実行される。# exit
(起動されても期限が到来していなければ、上記 6-1 のように何も起きない)
Fri 2020-12-25 21:41:18 JST 12h left n/a n/a certbot-renew.timer certbot-renew.service
$
7. 証明書の失効
上記 3 で正規に (--staging を付加せず) 取得した証明書は、ACME サーバにも登録されている。
このため、サーバを変更・移動するとき等は ACME サーバ側の証明書も失効させる必要がある。
通常は実施する必要がない。
7-1. 証明書ファイルを確認する。
$ su7-2. 証明書ファイルを使用して失効させる。
# cd /etc/letsencrypt/live/
/etc/letsencrypt/live/# ls -l ./*/cert*.pem
lrwxrwxrwx. 1 root root 39 12月 24 20:56 ./www.example1.jp/cert.pem -> ../../archive/www.example1.jp/cert.pem
/etc/letsencrypt/live/# certbot revoke --cert-path ./www.example1.jp/cert.pem
/etc/letsencrypt/live/# ls -lデバッグログを
Saving debug log to /var/log/letsencrypt/letsencrypt.log - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Would you like to delete the certificate(s) you just revoked, along with all earlier and later versions of the certificate? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (Y)es (recommended)/(N)o: y ⏎ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The following certificate(s) are selected for deletion: * www.example1.jp WARNING: Before continuing, ensure that the listed certificates are not being used by any installed server software (e.g. Apache, nginx, mail servers). Deleting a certificate that is still being used will cause the server software to stop working. See https://certbot.org/deleting-certs for information on deleting certificates safely. Are you sure you want to delete the above certificate(s)? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (Y)es/(N)o: y ⏎*5 Deleted all files relating to certificate www.example1.jp. Congratulations! You have successfully revoked the certificate that was located at /etc/letsencrypt/live/www.example1.jp/cert.pem.
/var/log/letsencrypt/letsencrypt.log へ保存します。
今取り消した証明書と一緒に新旧版の証明書も削除しますか?
削除対象になっている証明書はこれです。
警告: 続行する前に、この証明書がサーバソフトによって使用されていないことを確認してください。(例: Apache、nginx、メール サーバ等)
使用中の証明書を削除すると、サーバソフトが動作を停止します。
証明書の安全な削除について https://certbot.org/deleting-certs を参照してください。
上記の証明書を削除してよいですか?
証明書 www.example1.jp に関するファイルをすべて削除しました。
おめでとう!/etc/letsencrypt/live/www.example1.jp/cert.pem に存在した証明書の取り消しが成功しました。
証明書がディレクトリごと削除されている。(*5によって)/etc/letsencrypt/live/# exit
合計 4 -rw-r--r--. 1 root root 740 12月 4 13:55 README
$