はじめに
Certbotを使ってAmazonLinux 2023のApacheにSSL証明書を発行する では、Certbot
を使って証明書を発行するところまで実施してした。
生成された秘密鍵について、ECDSA
の形式で作成されているようで、これをRSA
形式で生成されるようにしたいというのが今回の記事となる。
というのも、RSA
形式でないと秘密鍵を読み込んでくれないサービスがあったためである。(ECDSA
形式でも読み込めるように対応してほしいのだが…)
環境
EC2 AmazonLinux 2023 t4g.micro
certbot 2.6.0
発行されている秘密鍵の確認
/etc/letsencrypt/archive/ssl.k-bushi.com/
ll
-rw-r--r--. 1 root root 1273 2月 8 17:29 cert1.pem
-rw-r--r--. 1 root root 1566 2月 8 17:29 chain1.pem
-rw-r--r--. 1 root root 2839 2月 8 17:29 fullchain1.pem
-rw-------. 1 root root 241 2月 8 17:29 privkey1.pem
ファイル名 | 説明 |
---|---|
cert1.pem | サーバー証明書。ドメインの証明書自体が含まれており、公開鍵が含まれている。 |
chain1.pem | 中間証明書。サーバー証明書とルート証明書の間にある証明書が含まれており、証明書チェーンを形成する。 |
fullchain1.pem | サーバー証明書と中間証明書を結合したもの。cert1.pem と chain1.pem を一つのファイルにまとめたもの。 |
privkey1.pem | 秘密鍵。サーバー証明書に対応する秘密鍵が含まれており、サーバーが証明書を使ってデータを暗号化・復号化するために使用される。 |
というわけで、 privkey1.pem
を調べる。
## RSA Keyかどうかのチェック
[root@ip-172-31-40-240 ssl.k-bushi.com]# openssl rsa -in privkey1.pem -check
Not an RSA key
## ECDSA形式かどうかのチェック
[root@ip-172-31-40-240 ssl.k-bushi.com]# openssl ec -in privkey1.pem -check
read EC key
EC Key valid.
...
ECDSA
形式であることがわかる。
RSA形式での発行
certbot certonly --manual \
-d ssl.k-bushi.com \
--preferred-challenges dns \
--key-type rsa
--key-type rsa
を付ければよい。
https://eff-certbot.readthedocs.io/en/stable/using.html#certbot-commands
実行ログ
An ECDSA certificate named ssl.k-bushi.com already exists. Do you want to update its key type to RSA?
(U)pdate key type/(K)eep existing key type: U
U を入力 (RSAの鍵タイプに Update
する)
Renewing an existing certificate for ssl.k-bushi.com
Successfully received certificate. Certificate is saved at: /etc/letsencrypt/live/ssl.k-bushi.com/fullchain.pem Key is saved at: /etc/letsencrypt/live/ssl.k-bushi.com/privkey.pem This certificate expires on 2025-05-09. These files will be updated when the certificate renews.
NEXT STEPS:
- This certificate will not be renewed automatically. Autorenewal of –manual certificates requires the use of an authentication hook script (–manual-auth-hook) but one was not provided. To renew this certificate, repeat this same certbot command before the certificate’s expiry date.
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
以上でOK
確認
/etc/letsencrypt/archive/ssl.k-bushi.com
を見ると、以下が生成されている。
※3個あるけど、2回目に間違えて発行したのでこうなっている。
-rw-r--r--. 1 root root 1273 2月 8 17:29 cert1.pem
-rw-r--r--. 1 root root 1269 2月 8 18:22 cert2.pem
-rw-r--r--. 1 root root 1769 2月 8 18:23 cert3.pem
-rw-r--r--. 1 root root 1566 2月 8 17:29 chain1.pem
-rw-r--r--. 1 root root 1566 2月 8 18:22 chain2.pem
-rw-r--r--. 1 root root 1801 2月 8 18:23 chain3.pem
-rw-r--r--. 1 root root 2839 2月 8 17:29 fullchain1.pem
-rw-r--r--. 1 root root 2835 2月 8 18:22 fullchain2.pem
-rw-r--r--. 1 root root 3570 2月 8 18:23 fullchain3.pem
-rw-------. 1 root root 241 2月 8 17:29 privkey1.pem
-rw-------. 1 root root 241 2月 8 18:22 privkey2.pem
-rw-------. 1 root root 1704 2月 8 18:23 privkey3.pem
現在の最新がどこを見ているのかも一応確認
[root@ip-172-31-40-240 ssl.k-bushi.com]# ll /etc/letsencrypt/live/ssl.k-bushi.com/
合計 4
-rw-r--r--. 1 root root 692 2月 8 17:29 README
lrwxrwxrwx. 1 root root 39 2月 8 18:23 cert.pem -> ../../archive/ssl.k-bushi.com/cert3.pem
lrwxrwxrwx. 1 root root 40 2月 8 18:23 chain.pem -> ../../archive/ssl.k-bushi.com/chain3.pem
lrwxrwxrwx. 1 root root 44 2月 8 18:23 fullchain.pem -> ../../archive/ssl.k-bushi.com/fullchain3.pem
lrwxrwxrwx. 1 root root 42 2月 8 18:23 privkey.pem -> ../../archive/ssl.k-bushi.com/privkey3.pem
というわけで、~~~3
系を見ているのがわかる。
形式をチェックする
## RSA Keyかどうかのチェック
[root@ip-172-31-40-240 ssl.k-bushi.com]# openssl rsa -in privkey3.pem -check
RSA key ok
writing RSA key
... (略) ...
## ECDSA形式かどうかのチェック
[root@ip-172-31-40-240 ssl.k-bushi.com]# openssl ec -in privkey3.pem -check
read EC key
EC Key valid.
... (略) ...
んん~?
どっちでも読み込めるみたいなんだけど。
どういうことなんだ。
よくわからないので、Claude
に聞いてみる。
Claudeに聞いてみる
質問
openssl ec -in privkey3.pem -check
と
openssl rsa -in privkey3.pem -check
のコマンドでどっちもvalidになるんですけど、これは何の形式の鍵なのかわからないです。
回答
両方のコマンドで valid になるというのは興味深い状況ですね。この状況について分析してみましょう。 RSAとECDSA(楕円曲線)の秘密鍵は通常、異なる数学的構造を持っているため、両方のコマンドで valid になるのは珍しいケースです。 考えられる可能性として:
- PKCS#8形式で格納されている可能性
- PKCS#8は汎用的な秘密鍵格納フォーマットで、RSAもECも格納できます
- この場合、OpenSSLが鍵を読み込む際に柔軟に解釈している可能性があります
確認するために、以下のコマンドを試してみることをお勧めします:
# 鍵の形式を確認
openssl asn1parse -in privkey3.pem
# 鍵の詳細情報を表示
openssl pkey -in privkey3.pem -text
これらのコマンドを実行すると、実際の鍵のタイプや構造がより詳細にわかるはずです。特に pkey コマンドは鍵の具体的なパラメータを表示するので、RSAなのかECなのかが判別できるはずです。
出力結果を共有していただければ、より具体的なアドバイスができます。
また、この鍵がどのように生成されたのかの情報があれば、それも手がかりになるかもしれません。
質問2
# 鍵の詳細情報を表示
openssl pkey -in privkey3.pem -text
を実行した。
pkeyの方の出力結果は以下です。
※pkeyのコマンドの内容を共有した。
回答2
この出力結果から、この鍵はRSA秘密鍵であることが明確にわかります。重要なパラメータを見ていきましょう:
- 鍵の種類とサイズ:
Private-Key: (2048 bit, 2 primes)
- これはRSA-2048ビット鍵です
- 主要なパラメータ:
- modulus (n)
- publicExponent (e): 65537 (標準的なRSAの公開指数)
- privateExponent (d)
- prime1 (p) と prime2 (q) - RSAの2つの素数
- exponent1, exponent2, coefficient - RSAの中国剰余定理(CRT)用のパラメータ
この鍵が openssl ec -check
でも valid と表示される理由についての推測:
- 鍵がPKCS#8形式でエンコードされている(
-----BEGIN PRIVATE KEY-----
) - OpenSSLが柔軟に解釈しようとして、エラーを出さない可能性がある
しかし、この鍵は明確にRSA鍵であり、楕円曲線の鍵ではありません。実際の使用時は openssl rsa
コマンドを使用するのが適切です。
結論
ということなので、良いのかと思う。
これ以上調べると沼っていきそうなので一旦これはここでおいておくことにする。
Apacheでの動作確認
証明書を更新したので、リロードして動作を確認しておく。
※今回は一応 restart
にした。
systemctl restart httpd
ページが表示されて証明書も問題ないのでOKとした。
参考
User Guide — Certbot 3.1.0 documentation
https://eff-certbot.readthedocs.io/en/stable/using.html#certbot-commandsLet’s encrypt の暗号化方式がECDSAになっていた
https://www.softel.co.jp/blogs/tech/archives/7704Let’s Encryptの証明書をRSA方式で更新。
https://manualmaton.com/2023/05/28/lets-encrypt%E3%81%AE%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%92rsa%E6%96%B9%E5%BC%8F%E3%81%A7%E6%9B%B4%E6%96%B0%E3%80%82/
おわりに
秘密鍵をRSA
方式で証明書を発行するということを実践した。ECDSA
方式が対応していないサービスではこれでやっていこうと思う。