Windows+nginxのLet’s Encryptの証明書を更新する

技術メモ

はじめに

本サイトは Windows 上に nginx を配置し、そこから Docker Desktop の WordPress と通信する構成としている。

通信を SSL 化する際の証明書は Let’s Encrypt[公式] で発行している。以前は ZeroSSL[Wikipedia] を使用していたが有料化されたので乗り換えした経緯がある。今回は Let’s Encrypt の証明書を更新する手順を記す。非常に簡単である。

現在の状態

更新前の状態。

Chrome の証明書ビューアで確認すると、有効期限が2024年2月1日になっているのが分かる。

Let’s Encrypt の証明書は有効期限が 90 日である。これを更新する。

nginx の証明書格納先

ssl_protocols TLSv1.2 TLSv1.3;
server {
    listen      443 ssl;
    server_name dezikomoe.ddns.net;

    ssl_certificate      D:/nginx/cert/lets/fullchain.pem; # サーバー証明書のパス
    ssl_certificate_key  D:/nginx/cert/lets/privkey.pem;   # 秘密鍵のパス

nginx.conf を抜粋したものが上記である。

ssl_certificate 及び ssl_certificate_key でパスを指定している。ここに更新後の証明書を配置するのがゴールとなる。

certbot

証明書に関する操作は certbot コマンドを使用する。

certbot は証明書の発行時にインストールしているはず。→certbot[公式]

certbot certificates

dezikomoe@rio2:/mnt/c/Windows/system32$ sudo certbot certificates
[sudo] password for dezikomoe:
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Found the following certs:
  Certificate Name: dezikomoe.ddns.net
    Domains: dezikomoe.ddns.net
    Expiry Date: 2024-02-01 12:21:09+00:00 (VALID: 18 days)
    Certificate Path: /etc/letsencrypt/live/dezikomoe.ddns.net/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/dezikomoe.ddns.net/privkey.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

wsl のコンソールに入り、sudo certbot certificates すると、先程 Chrome で確認したのと同じ有効期限の日付が確認できる。コンソールに「Expiry Date: 2024-02-01」と出力されているのがそれだ。

Certificate Path / Private Key Path に出力されているのは前回作成した証明書のパスであり、nginx.conf で指定しているパスとは異なる。ここで出力されているパスのファイルを元にして処理が行われるため注意。

certbot renew –dry-run

dezikomoe@rio2:/mnt/c/Windows/system32$ sudo certbot renew --dry-run
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/dezikomoe.ddns.net.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert is due for renewal, auto-renewing...
Plugins selected: Authenticator webroot, Installer None
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for dezikomoe.ddns.net
Using the webroot path /mnt/d/nginx/html for all unmatched domains.
Waiting for verification...
Cleaning up challenges

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
new certificate deployed without reload, fullchain is
/etc/letsencrypt/live/dezikomoe.ddns.net/fullchain.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates below have not been saved.)

Congratulations, all renewals succeeded. The following certs have been renewed:
  /etc/letsencrypt/live/dezikomoe.ddns.net/fullchain.pem (success)
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates above have not been saved.)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

sudo certbot renew –dry-run で、正しく証明書の生成ができるのかリハーサルする。

一発で成功する自信があれば不要な手順ではあるが、(確か)3回連続で更新に失敗すると一時的にロックされ、開放までに(確か)数日間待つ必要がある。慌てると碌な事にならない。Congratulations が出力されるのを確認する。

certbot renew

dezikomoe@rio2:/mnt/c/Windows/system32$ sudo certbot renew
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/dezikomoe.ddns.net.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert is due for renewal, auto-renewing...
Plugins selected: Authenticator webroot, Installer None
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for dezikomoe.ddns.net
Using the webroot path /mnt/d/nginx/html for all unmatched domains.
Waiting for verification...
Cleaning up challenges

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
new certificate deployed without reload, fullchain is
/etc/letsencrypt/live/dezikomoe.ddns.net/fullchain.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Congratulations, all renewals succeeded. The following certs have been renewed:
  /etc/letsencrypt/live/dezikomoe.ddns.net/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

本番実行。–dry-run オプションを外して sudo certbot renew する。成功!

生成された証明書の配置と反映

生成の確認

dezikomoe@rio2:/mnt/c/Windows/system32$ sudo ls -al /etc/letsencrypt/live/dezikomoe.ddns.net/
total 12
drwxr-xr-x 2 root root 4096 Jan 14 12:35 .
drwx------ 3 root root 4096 Aug  6 11:28 ..
-rw-r--r-- 1 root root  692 Aug  6 11:28 README
lrwxrwxrwx 1 root root   42 Jan 14 12:35 cert.pem -> ../../archive/dezikomoe.ddns.net/cert4.pem
lrwxrwxrwx 1 root root   43 Jan 14 12:35 chain.pem -> ../../archive/dezikomoe.ddns.net/chain4.pem
lrwxrwxrwx 1 root root   47 Jan 14 12:35 fullchain.pem -> ../../archive/dezikomoe.ddns.net/fullchain4.pem
lrwxrwxrwx 1 root root   45 Jan 14 12:35 privkey.pem -> ../../archive/dezikomoe.ddns.net/privkey4.pem

sudo ls -al すると、必要なファイルが生成されているのが確認できる。root で作成しているので sudo しないと見えない。

補足

いずれもパーミッションが 777 になっているが、デフォルトだと違った気がする。以前は chmod 777 をした記憶があるのだが、その時の状態が残ってしまっているのかも知れない。必要なら(必要な筈だ) chmod でパーミッションを変更する。

証明書の配置

dezikomoe@rio2:/mnt/c/Windows/system32$ sudo cp -f /etc/letsencrypt/live/dezikomoe.ddns.net/privkey.pem /mnt/d/nginx/cert/lets
dezikomoe@rio2:/mnt/c/Windows/system32$ sudo cp -f /etc/letsencrypt/live/dezikomoe.ddns.net/fullchain.pem /mnt/d/nginx/cert/lets

Windows 上の「D:/nginx/cert/lets/」は wsl では「/mnt/d/nginx/cert/lets」として見える。

同様に sudo を付与してファイルをコピーする。

コピーした証明書の確認

dezikomoe@rio2:/mnt/c/Windows/system32$ ls -al /mnt/d/nginx/cert/lets
total 12
drwxrwxrwx 1 dezikomoe dezikomoe 4096 Nov  3 22:25 .
drwxrwxrwx 1 dezikomoe dezikomoe 4096 Dec  6 15:52 ..
-rwxrwxrwx 1 dezikomoe dezikomoe 5523 Jan 14 12:46 fullchain.pem
-rwxrwxrwx 1 dezikomoe dezikomoe 1704 Jan 14 12:46 privkey.pem

/mnt/d/nginx/cert/lets(=D:/nginx/cert/lets/) の下に格納できた。

この時点ではまだ nginx には反映されない。

nginx -s reload

D:\nginx>nginx -s reload

コマンドプロンプトで nginx -s reload しリロードする。

更新確認

有効期限が2024年4月13日に更新された。パチパチ。

cron なりで更新の自動化をするかはお好み。有効期限が近くなると Let’s Encrypt が警告のメールを送ってくれるが、予め Google カレンダーなりに登録しておけば良いだろう。今回もそうする事にした。

タイトルとURLをコピーしました