Certbotで秘密鍵の形式をRSAにして発行する

はじめに

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.pemchain1.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:


以上で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 になるのは珍しいケースです。 考えられる可能性として:

  1. 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秘密鍵であることが明確にわかります。重要なパラメータを見ていきましょう:

  1. 鍵の種類とサイズ:
  • Private-Key: (2048 bit, 2 primes) - これはRSA-2048ビット鍵です
  1. 主要なパラメータ:
  • modulus (n)
  • publicExponent (e): 65537 (標準的なRSAの公開指数)
  • privateExponent (d)
  • prime1 (p) と prime2 (q) - RSAの2つの素数
  • exponent1, exponent2, coefficient - RSAの中国剰余定理(CRT)用のパラメータ

この鍵が openssl ec -check でも valid と表示される理由についての推測:

  1. 鍵がPKCS#8形式でエンコードされている(-----BEGIN PRIVATE KEY-----
  2. OpenSSLが柔軟に解釈しようとして、エラーを出さない可能性がある

しかし、この鍵は明確にRSA鍵であり、楕円曲線の鍵ではありません。実際の使用時は openssl rsa コマンドを使用するのが適切です。

結論

ということなので、良いのかと思う。
これ以上調べると沼っていきそうなので一旦これはここでおいておくことにする。

Apacheでの動作確認

証明書を更新したので、リロードして動作を確認しておく。
※今回は一応 restartにした。

systemctl restart httpd

ページが表示されて証明書も問題ないのでOKとした。

参考

おわりに

秘密鍵をRSA方式で証明書を発行するということを実践した。
ECDSA方式が対応していないサービスではこれでやっていこうと思う。

Hugo で構築されています。
テーマ StackJimmy によって設計されています。