RHEL9で作る自宅サーバ:Let’s Encryptで作った証明書をいろいろする

dnsサーバRHEL9パソコン自宅サーバ

複数のサーバからLet’s Encryptの証明書を取得する

Let’s Encryptのサーバ証明書をDNSサーバを使って取得しています。証明書はDNSサーバの /etc/letsencrypt/ に格納されます。
サーバ証明書はメールサーバやwwwサーバでも使うものですから、「現行のDNSサーバと一緒にメールサーバやwwwサーバも一緒に新サーバに移行しないのいけない?」と悩んでいました。サーバ証明書を新旧サーバの間で同期させる案もありますが、移行期間中だけのためにそんな仕組みを入れるのは面倒だし。

で、一つ気が付きました。Let’s EncryptのcertbotはDNSサーバに対してTSIGを飛ばして動的レコードを書き換えます。TSIGの飛ばし先をlocalhostではなく、稼働中のDNSにすれば他のホストからもサーバー証明書を取得できるのでは?具体的には

[root@ace ~]# vi /etc/letsencrypt/rfc2136.ini
[root@ace ~]# chmod 640 /etc/letsencrypt/rfc2136.ini
[root@ace ~]# cat /etc/letsencrypt/rfc2136.ini
# Target DNS server (IPv4 or IPv6 address, not a hostname)
dns_rfc2136_server = 127.0.0.1
# Target DNS port
dns_rfc2136_port = 53
# TSIG key name
dns_rfc2136_name = ddns-key
# TSIG key secret
dns_rfc2136_secret = ***非公開情報***
# TSIG key algorithm
dns_rfc2136_algorithm = HMAC-SHA256
# TSIG sign SOA query (optional, default: false)
dns_rfc2136_sign_query = false

[root@ace ~]# ls -al /etc/letsencrypt/
合計 20
drwxr-xr-x  2 root root   40  2月  5 23:02 .
drwxr-xr-x 82 root root 8192  2月  5 22:15 ..
-rw-r--r--  1 root root  152  5月 23  2023 cli.ini
-rw-r-----  1 root root  396  2月  6 11:46 rfc2136.ini
[root@ace ~]#

rfc2136.iniファイルの「dns_rfc2136_server」の部分ですね。
試してみたら、稼働中のDNSの動的レコードを書き換えて、構築中のサーバに取得することができました!
これでDNSサーバ単独で移行できそうです。

さらに、これで取得したサーバ証明書が問題ないか確認したいと思います。問題になりそうなのは

  • 新しいサーバ証明書を発行したことによって、古い証明書が失効してしまう。
  • certbot renewコマンドでサーバ証明書を更新する際、期限切れが近いのに他サーバで更新したことによって「最近更新したから」と更新してくれない。

とかが考えられます。

作成したサーバ証明書の状態を確認する

[root@myhome ~]# certbot certificates
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Found the following certs:
  Certificate Name: *確認用ドメイン*
    Serial Number: 39b07978587849c4fdb4686ce2f9f48ece1
    Key Type: RSA
    Domains: *確認用ドメイン* *.*確認用ドメイン*
    Expiry Date: 2024-06-05 07:54:13+00:00 (VALID: 88 days)
    Certificate Path: /etc/letsencrypt/live/*確認用ドメイン*/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/*確認用ドメイン*/privkey.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[root@myhome ~]#

certbot certificates」コマンドが簡単で必要な情報がでてきますね。こちらは現行のサーバ証明書の情報です。

[root@ace letsencrypt]# certbot certificates
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Found the following certs:
  Certificate Name: ※確認用ドメイン※
    Serial Number: 4aaeffe2f2fec91bd0ce45c695ca91e0a0e
    Key Type: ECDSA
    Domains: ※確認用ドメイン※ *.※確認用ドメイン※
    Expiry Date: 2024-06-05 15:27:38+00:00 (VALID: 88 days)
    Certificate Path: /etc/letsencrypt/live/※確認用ドメイン※/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/※確認用ドメイン※/privkey.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[root@ace letsencrypt]#

こちらは構築中のサーバで取得したサーバ証明書の情報です。
現在は2024年3月なので、有効期限は十分に残っています。
Serial Numberはそれぞれの証明書に与えられた唯一の番号なので控えておきます。
ちなみにRHEL9のopensslだとKey TypeがECDSAになるんですね。

[root@ace letsencrypt]# openssl x509 -text -noout -in /etc/letsencrypt/live/※確認用ドメイン※/cert.pem
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            04:aa:ef:fe:2f:2f:ec:91:bd:0c:e4:5c:69:5c:a9:1e:0a:0e
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = US, O = Let's Encrypt, CN = R3
        Validity
            Not Before: Mar  7 15:27:39 2024 GMT
            Not After : Jun  5 15:27:38 2024 GMT
:
省略
:
                OCSP - URI:http://r3.o.lencr.org
:
省略
:

opensslのコマンドだと、もっと詳細にサーバ証明書の情報を見ることができます。

サーバ証明書の失効状態を確認する

Let’s Encryptのサーバ証明書の失効の有無はOCSPレスポンダ(opensslコマンドで詳細に情報を出すとURI:http://r3.o.lencr.orgと書かれていました)で管理されています。ここに問い合わせないといけないのですが、以下のサイトを使うのが早いと思います。

こちらのサイトでドメイン名を入力すると、今まで発行されたサーバ証明書の一覧が出てきます。

証明書が発行された日時を参考にcrt.sh IDをクリックして詳細画面を表示します。

シリアル番号で、該当のサーバ証明書であることを確認して、Mechanism OCSPのStatusのCheckをクリックすると、有効であれば「Good」失効されていれば「Revoked」と表示されます。

結論は「新しいサーバ証明書を発行しても、古い証明書は有効のままでした。

ちなみにせっかく調べたので、opensslコマンドで失効状態の有無を確認方法を示します。opensslのバージョンによって微妙にオプションが違うのではまってしまいました

OpenSSL 1.0.2k-fips  26 Jan 2017 の場合
OCSPレスポンダは URI:http://r3.o.lencr.org でした。

入力するコマンド
openssl ocsp -no_nonce \
 -issuer /etc/letsencrypt/live/※確認用ドメイン※/chain.pem \
 -cert /etc/letsencrypt/live/※確認用ドメイン※/cert.pem \
 -url http://r3.o.lencr.org \
 -header "HOST" "r3.o.lencr.org" \
 -verify_other /etc/letsencrypt/live/※確認用ドメイン※/chain.pem

実行結果
[root@myhome zeke]# openssl ocsp -no_nonce -issuer /etc/letsencrypt/live/※確認用ドメイン※/chain.pem -cert /etc/letsencrypt/live/※確認用ドメイン※/cert.pem -url http://r3.o.lencr.org -header "HOST" "r3.o.lencr.org" -verify_other /etc/letsencrypt/live/※確認用ドメイン※/chain.pem
Response verify OK
/etc/letsencrypt/live/※確認用ドメイン※/cert.pem: good
        This Update: Mar  7 09:00:00 2024 GMT
        Next Update: Mar 14 08:59:58 2024 GMT
[root@myhome zeke]#
OpenSSL 3.0.7 1 Nov 2022 (Library: OpenSSL 3.0.7 1 Nov 2022) の場合
OCSPレスポンダは URI:http://r3.o.lencr.org でした。

入力するコマンド
openssl ocsp -no_nonce \
 -issuer /etc/letsencrypt/live/※確認用ドメイン※/chain.pem \
 -cert /etc/letsencrypt/live/※確認用ドメイン※/cert.pem \
 -url http://r3.o.lencr.org

実行結果
[root@ace letsencrypt]# openssl ocsp -no_nonce -issuer /etc/letsencrypt/live/※確認用ドメイン※/chain.pem -cert /etc/letsencrypt/live/※確認用ドメイン※/cert.pem -url http://r3.o.lencr.org
Response verify OK
/etc/letsencrypt/live/※確認用ドメイン※/cert.pem: good
        This Update: Mar  7 09:00:00 2024 GMT
        Next Update: Mar 14 08:59:58 2024 GMT
[root@ace letsencrypt]#

ちなみに失効したサーバ証明書の場合、以下のようにrevokedが付きます。

[root@ace letsencrypt]# openssl ocsp -no_nonce \
 -issuer /etc/letsencrypt/archive/※確認用ドメイン※/chain1.pem \
 -cert /etc/letsencrypt/archive/※確認用ドメイン※/cert1.pem \
 -url http://r3.o.lencr.org
Response verify OK
/etc/letsencrypt/archive/※確認用ドメイン※/cert1.pem: revoked
        This Update: Mar  7 16:35:00 2024 GMT
        Next Update: Mar 14 16:34:58 2024 GMT
        Revocation Time: Mar  7 16:34:02 2024 GMT
[root@ace letsencrypt]#

サーバ証明書の失効方法

サーバ証明書の秘密鍵が流出したなどの理由で、有効期限が来るのを待たずに証明書を無効化したい場合は、執行の操作を行います。
こちらもせっかく調べたので、書いておきます。

入力コマンド
certbot revoke --cert-path /etc/letsencrypt/archive/※確認用ドメイン※/cert1.pem

実行結果
[root@ace letsencrypt]# certbot revoke --cert-path /etc/letsencrypt/archive/※確認用ドメイン※/cert1.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: n
Congratulations! You have successfully revoked the certificate that was located at /etc/letsencrypt/archive/※確認用ドメイン※/cert1.pem.
[root@ace letsencrypt]#

いくつか有効なサーバ証明書を作成して、archiveディレクトリにある特定の証明書を1つだけ失効させてみました。
delete the certificate(s)」にYesで答えると該当ドメインのサーバ証明書が全部削除されます。(最初、失効したものだけ削除されるのかと思って、Yesにしちゃいました)

その結果、失効させたサーバ証明書だけ無効になって、その前後に作成した証明書は有効のままでした。

あと気になるのは「certbot renew」を使ってサーバ証明書を更新するときの動作ですが、有効期限が90日あるので、それを確かめる前に移行が終わっているような気がします。

アカウントの作成

サーバ証明書を作成するときに自動で作成されるので、あまり気にしていませんがLet’s Encrypt アカウント IDというのがあります。これを作成するコマンドは

[root@ace accounts]# certbot register
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices)
 (Enter 'c' to cancel): zeke@zeke.ne.jp

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.3-September-21-2022.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: y
Account registered.
[root@ace accounts]#

メールアドレスの入力と利用規約(Terms of Service)への承認、メールアドレスをElectronic Frontier Foundationで共有してよいかの入力があります。

[root@ace accounts]# certbot show_account
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Account details for server https://acme-v02.api.letsencrypt.org/directory:
  Account URL: https://acme-v02.api.letsencrypt.org/acme/acct/1609343697
  Account Thumbprint: qyjrcS_kXMhrlyfJdQ66gZFs8j7LKqUwiVmNUmzdgv0
  Email contact: zeke@zeke.ne.jp
[root@ace accounts]#

certbot show_accountコマンドで、アカウントができたことが確認できました!

アカウントの更新

アカウントに登録したメールアドレスを変更することができます。

[root@ace accounts]# certbot update_account --email zeke@mail.zeke.ne.jp
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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: y
Your e-mail address was updated to zeke@mail.zeke.ne.jp.
[root@ace accounts]#

メールアドレスを変更すると、改めてElectronic Frontier Foundationで共有してよいか問われます。

[root@ace accounts]# certbot update_account --email zeke@mail.zeke.ne.jp --no-eff-email
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Your e-mail address was updated to zeke@mail.zeke.ne.jp.
[root@ace accounts]#

オプションの「–no-eff-email」でEFFでの共有を承認しない、「–eff-email」で共有を承認するをつけると、すぐに変更できます。

アカウントの削除

[root@ace accounts]# certbot unregister
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Are you sure you would like to irrevocably deactivate your account?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(D)eactivate/(A)bort: d
Account deactivated.
[root@ace accounts]#

certbot unregisterでアカウントの削除ができます。

[root@ace accounts]# certbot show_account
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Could not find an existing account for server https://acme-v02.api.letsencrypt.org/directory.
[root@ace accounts]#

アカウントの状態を確認すると、サーバに存在しないことが確認できました。

ステージング環境のアカウントの状態確認

おまけにステージング環境はacme-staging-v02.api.letsencrypt.orgでアカウントが管理されているようで

[root@ace accounts]# certbot show_account --server https://acme-staging-v02.api.letsencrypt.org/directory
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Account details for server https://acme-staging-v02.api.letsencrypt.org/directory:
  Account URL: https://acme-staging-v02.api.letsencrypt.org/acme/acct/7378818
  Account Thumbprint: 9LrBStbWK0gnRoABEACFnsK6abUAOVnzyzWczfzOF4c
  Email contact: none
[root@ace accounts]#

カーバ証明書を作成するとき--dry-runオプションをつけると、ステージング環境のアカウントが自動生成されるみたいです。
アカウント管理サーバを指定すると、ステージング環境のアカウントの状態が見れますが、他のアカウント操作コマンドではサーバ指定できないのでこれ以上何もできなさそうです。
メールアドレスを登録しないから放置すればいいのかな?

構築中のサーバで証明書を取得

とりあえず、サーバ証明書を新たに取得しても古い証明書に対して影響はなさそうなので、構築中のサーバで証明書を取得しました。

[root@ace letsencrypt]# certbot certonly --dns-rfc2136 --dns-rfc2136-credentials /etc/letsencrypt/rfc2136.ini -d zeke.ne.jp -d *.zeke.ne.jp -d *.info.zeke.ne.jp -d *.mail.zeke.ne.jp
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for zeke.ne.jp and 3 more domains
Waiting 60 seconds for DNS changes to propagate

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/zeke.ne.jp/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/zeke.ne.jp/privkey.pem
This certificate expires on 2024-06-07.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[root@ace letsencrypt]# 

うまくいったようなので、状況確認です。

[root@ace letsencrypt]# certbot certificates
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Found the following certs:
:
省略
:
  Certificate Name: zeke.ne.jp
    Serial Number: 321f11fe7171cb189587e0cc728d2d0d3f1
    Key Type: ECDSA
    Domains: zeke.ne.jp *.info.zeke.ne.jp *.mail.zeke.ne.jp *.zeke.ne.jp
    Expiry Date: 2024-06-07 02:50:41+00:00 (VALID: 89 days)
    Certificate Path: /etc/letsencrypt/live/zeke.ne.jp/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/zeke.ne.jp/privkey.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[root@ace letsencrypt]#

公開鍵のキーのアルゴリズムをRSAからECDSAに変えてみました。Google様もこれを使っているようなので、多分影響はないはず。

[root@ace letsencrypt]# openssl ec -text -noout -in /etc/letsencrypt/live/zeke.ne.jp/privkey.pem
read EC key
Private-Key: (256 bit)
:

こちらが、ECDSA形式の鍵の内容を見るコマンドです。

サーバ証明書を自動更新

[root@ace letsencrypt]# vi /etc/cron.daily/letsencrypt
[root@ace letsencrypt]# chmod 700 /etc/cron.daily/letsencrypt
[root@ace letsencrypt]# ls -l /etc/cron.daily/letsencrypt
-rwx------ 1 root root 161  3月  9 13:16 /etc/cron.daily/letsencrypt
[root@ace letsencrypt]# cat /etc/cron.daily/letsencrypt
#!/bin/sh

/usr/bin/certbot renew -q --deploy-hook "systemctl restart httpd ; systemctl restart postfix ; systemctl restart dovecot ; systemctl restart vsftpd"

[root@ace letsencrypt]#

サーバ証明書を自動更新するためにcronの設定をします。/etc/cron.dailyにスクリプトを入れておくと日次で実行してくれます。

お勧めのKindle本です!

コメント