Let's Encrypt と Apache で https
〜 CentOS8 版 〜
2020-12-25 作成 福島
2021-01-07 更新 福島
2021-07-26 更新 福島
TOP > tips > letsenc

0. インストール要件

すでに Web サーバ (Apache) が稼働していることが前提。
Web サーバを停止せずに証明書を取得し、そのあと一度だけ Web サーバを再起動します。
また、証明書を更新し、それがうまくいったときも Web サーバを再起動します。

・Web サーバ
ここでは、同一のサーバに Web サーバのドメインを 2 つ作成し、それぞれエイリアスを作っているため、
合計で 4 つの URI が存在します。(1 個の証明書ファイルに 4 個分の証明書を格納する)
項目内容備考
OSCentOS8-
Web サーバソフトApache 2.4.37CentOS8 に付属
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-Awww.example1.jpURI: https://www.example1.jp:443/
サーバ1-Bexample1.jp (エイリアス)URI: https://example1.jp:443/
Web サーバ(2)ドキュメントルート/var/www2/htdocs/certbot によって、この中にディレクトリ
.well-known/acme-challenge/ が一時的に作られる
サーバ2-Awww.example2.jpURI: https://www.example2.jp:443/
サーバ2-Bexample2.jp (エイリアス)URI: https://example2.jp:443/

・証明書取得ツール
項目内容備考
ACME クライアントcertbotACME プロトコルとは、Web サーバと認証局の通信を自動化するための規約
ACME サーバLet's Encryptフリーで自動化されたオープンな認証局。DV 型認証のみを扱う
連絡先メールアドレスadmin@example1.jp緊急更新やセキュリティ通知に使われる
証明書格納ディレクトリ/etc/letsencrypt/certbot のインストール時に自動作成される


1. certbot のインストール

1-1. EPEL 8 リリース 10 のリポジトリ情報がインストールされているか確認する。
$ su
# 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.
1-2. EPEL のリポジトリ情報をインストールする。(有効でない場合)
# dnf -y install epel-release
1-3. certbot をインストールする。
# dnf -y install certbot
# which certbot
/bin/certbot
# certbot --version
certbot 1.14.0
# ls -d /etc/letsencrypt/
/etc/letsencrypt/
 インストールによって Let's Encrypt 用のワークディレクトリも作成された。
# exit
$


2. Apache の実行確認

2-1. Apache の実行を確認する。
$ systemctl status httpd | grep Active
Active: active (running) since Thu 2020-12-24 04:43:12 JST; 14h ago
「active (running)」になっていること。
2-2. Apache で実行中のサーバ名、ドキュメントルートを確認する。
$ 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/htdocswww.example1.jpexample1.jp
(2)/var/www2/htdocswww.example2.jpexample2.jp
を確認できた。


3. 証明書の取得

3-1. certbot を実行する。
上記 2-2 で確認したサーバ名、ドキュメントルートを指定して certbot を実行する。

$ 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 を入力します。
3-2. 証明書ファイルを確認する。
# cd /etc/letsencrypt/live/www.example1.jp/
/etc/letsencrypt/live/www.example1.jp/# ls -l
証明書ファイルへのシンボリックリンク (Apache の ssl.conf には、このリンクを記述する)
-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/live/www.example1.jp/# cd ../../archive/www.example1.jp/
/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
3-3. 証明書の内容を確認する。
/etc/letsencrypt/archive/www.example1.jp/# which openssl
/bin/openssl
/etc/letsencrypt/archive/www.example1.jp/# openssl x509 -noout -ext subjectAltName -dates -in cert.pem
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
*3証明書の有効開始日。
*4証明書の有効期限。(この日までに更新する必要がある)
/etc/letsencrypt/archive/www.example1.jp/# exit
$


4. Apache の設定

4-1. 設定ファイルへ証明書のパスを記述する。
$ su
# 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) のフルパスを指定する

4-2. Apache を再起動する。
# systemctl restart httpd
# exit
$


5. 動作確認

5-1. Web ページをブラウザで閲覧して確認する。
下記例は Firefox 84.0.1 の画面


 ↓

 ↓


6. 証明書の自動更新

Let's Encrypt の証明書は、期限が 90 日となっている。
継続して利用するには期限前の更新が必要。

6-1. 更新コマンドを実行してみる。
$ su
# 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.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
6-2. 証明書の自動更新用ファイルを確認する。
# ls -l /usr/lib/systemd/system/certbot-renew.*
-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] (無変更)
[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.service は certbot-renew.timer から起動されるプロセスなので enable にしない。(できない)

[certbot-renew.timer] (無変更)
[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
毎日 2 回、ランダムに certbot-renew.service を起動するようになっている。
(起動されても期限が到来していなければ、上記 6-1 のように何も起きない)
6-3. certbot の環境ファイルを編集する。
# vim /etc/sysconfig/certbot
証明書が更新されたら Apache を再起動する指定を追加。

RENEW_HOOK="--renew-hook 'systemctl restart httpd'"

6-4. 証明書の更新を systemd (timer) に登録する。
# systemctl enable certbot-renew.timer
# systemctl start certbot-renew.timer
# systemctl status certbot-renew.timer | grep Active
OS 起動時に自動更新のタイマーも起動されるようになった。
Active: active (waiting) since Thu 2020-12-25 08:56:05 JST; 1h 38min ago
# systemctl list-timers | grep certbot-renew.timer
次は 12 時間後 ("12h left") に certbot-renew.service が実行される。
Fri 2020-12-25 21:41:18 JST  12h left    n/a    n/a     certbot-renew.timer   certbot-renew.service
(起動されても期限が到来していなければ、上記 6-1 のように何も起きない)
# exit
$


7. 証明書の失効

上記 3 で正規に (--staging を付加せず) 取得した証明書は、ACME サーバにも登録されている。
このため、サーバを変更・移動するとき等は ACME サーバ側の証明書も失効させる必要がある。
通常は実施する必要がない

7-1. 証明書ファイルを確認する。
$ su
# 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
7-2. 証明書ファイルを使用して失効させる。
/etc/letsencrypt/live/# certbot revoke --cert-path ./www.example1.jp/cert.pem
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 に存在した証明書の取り消しが成功しました。

/etc/letsencrypt/live/# ls -l
証明書がディレクトリごと削除されている。(*5によって)
合計 4
-rw-r--r--. 1 root root 740 12月  4 13:55 README
/etc/letsencrypt/live/# exit
$