OpenSSH: CentOS8で証明書署名要求ファイルの生成に躓いた

躓いたエラーメッセージ

CentOS7 で通じてたコマンド手順をそのまま CentOS8(Stream)で実行してたら、
opensslコマンドでPrivate Keyが読み込めず、嵌りそうになった。

openssl req -new -key ./hogehoge.key -out ./hogehohe.csr -config <(cat hogehoge.conf )
unable to load Private Key
139786302900032:error:0909006C:PEM routines:get_name:no start line:crypto/pem/pem_lib.c:745:Expecting: ANY PRIVATE KEY

原因

ssh-keygenで生成した秘密鍵がPEM形式ではなかった(OpenSSH形式だった) 似すぎじゃない!?

検索すると、”最終行に改行が必要”など出てきますが、
私の場合、そもそもOpenSSLコマンド用の鍵ファイル(PEMorDER)を用意できてなかっただけでした。

同じオプションでコマンド叩いても、CentOS7(openssh-7.x)と8(openssh-8.x)で生成される鍵のフォーマットが異なってました。

ssh-keygen -t rsa -b 2048 -f hogehoge.key

CentOS Stream 8 で生成したprivate key

[root@CENTOS8]# ssh-keygen -t rsa -b 2048 -f test.privatekey
<<...略...>>
[root@CENTOS8]# cat test.privatekey
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn
<<...略...>>
RGUiA0rZ1SrmjbJZAwAAACByb290QGFuaW1hLmdmLWFkLmdvb2QtZmVlbC5jby5qcAE=
-----END OPENSSH PRIVATE KEY-----
[root@CENTOS8]# 
[root@CENTOS8]# rpm -qa | grep ssh
openssh-askpass-8.0p1-12.el8.x86_64
openssh-server-8.0p1-12.el8.x86_64
qemu-kvm-block-ssh-6.2.0-5.module_el8.6.0+1087+b42c8331.x86_64
openssh-clients-8.0p1-12.el8.x86_64
libssh-config-0.9.6-3.el8.noarch
libssh-0.9.6-3.el8.x86_64
openssh-8.0p1-12.el8.x86_64
[root@CENTOS8]# 

CentOS7 で生成したprivate key

[root@CENTOS7]# ssh-keygen -t rsa -b 2048 -f test.privatekey
<<...略...>>
[root@CENTOS7]# cat test.privatekey
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEAzr/LLmd7DRByn0NoWUaY4VjEuTujFc27pXmF0X1q6xZW2/sh
<<...略...>>
k0pU7VAl/vOBwEif0cyhTk6Crnm734XiALYayNGumoO0aHnMV+hu+jI=
-----END RSA PRIVATE KEY-----
[root@CENTOS7]# 
[root@CENTOS7]# rpm -qa | grep ssh
libssh2-1.8.0-4.el7.x86_64
openssh-7.4p1-21.el7.x86_64
openssh-server-7.4p1-21.el7.x86_64
openssh-clients-7.4p1-21.el7.x86_64
[root@CENTOS7]# 

解決方法

ssh-keygen にオプション「-m pem」を追加して生成すればOK

ssh-keygen -t rsa -m pem -b 2048 -f test.privatekey
[root@CENTOS8]# ssh-keygen -t rsa -m pem -b 2048 -f test.privatekey
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in test.privatekey.
Your public key has been saved in test.privatekey.pub.
The key fingerprint is:
SHA256:R1ZF916cKZ29GfcI65Ubee5D7AvynlNHGK1mq5vDxkY rootCENTOS8
The key's randomart image is:
+---[RSA 2048]----+
|            .oo..|
|           .  ooB|
|          o .. X*|
|         o   o*=O|
|        S . .oB=+|
|         . .E..O.|
|           =.o= o|
|            Xoo+ |
|           o+*..+|
+----[SHA256]-----+
[root@CENTOS8]#
[root@CENTOS8]# cat test.privatekey
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAqkF3XJE1loUPMMZa0WVGfDWieSSLtCKlMvzBTenf7bF90pcZ
<<...略...>>
xbmtmvWEvWUfOBrftsU9nDCrhSr+mkawMemSi3dNUPwbH2z/ZR9z
-----END RSA PRIVATE KEY-----
[root@CENTOS8]#