对于有效的 PEM,我无法通过 openssh 加载私钥

对于有效的 PEM,我无法通过 openssh 加载私钥

我已经用以下命令创建了公钥/私钥对:

ssh-keygen -t rsa -b 4096 -f my-trusted-key -C "Just a public/private key"  

我可以打开私钥文件并看到:

$ cat my-trusted-key -----BEGIN OPENSSH PRIVATE KEY----- b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAACFwAAAAdzc2gtcn 等

但是当我运行以下命令时:

$ openssl rsa -in my-trusted-key -text -inform PEM -noout

我收到以下错误

无法加载私钥 4506685036:错误:09FFF06C:PEM 例程:CRYPTO_internal:无起始行:/AppleInternal/BuildRoot/Library/Caches/com.apple.xbs/Sources/libressl/libressl-47.140.1/libressl-2.8/crypto/pem/pem_lib.c:684:预期:任何私钥

这是什么问题?它失败了?

更新
在 @garethTheRed 评论之后,我使用 openssl 创建了一个私钥,如下所示:

$ openssl genrsa -out anotherkey.key 2048  

我可以看到:

$ cat anotherkey.key -----开始 RSA 私钥----- MIIEogIBAAKCAQEAuc3m0tXo8UQvF8CJi9Cy7580WxfKvFHYZ3F06Uh19s9c51R/

现在命令就可以正常工作了

openssl rsa -in anotherkey.key -text -inform PEM -noout

私钥:(2048 位)模数:00:b9:cd:e6:d2:d5:e8:f1:44:2f:17:c0:89:8b:d0:b2:ef:9f:34:5b:17:ca:bc:51:d8:67:71:74:e9:48

但我不明白其中的区别。这两个文件都是 PEM 格式,使用查看时都cat显示相同的格式。
那么为什么生成的 pemssh-keygen被拒绝了呢?

答案1

这不是 PEM 格式吗?

不,它只是一种“类似 PEM”的格式。有一个“-----HEADER-----”和 Base64 编码的数据。但相似之处仅此而已——Base64 blob 中的实际数据结构是完全地与 PEM 不同;它甚至不像典型的“PEM”文件那样使用 ASN.1 DER,而是使用 SSH 数据格式。

ssh-keygen 命令习惯以 OpenSSL 样式的 PEM 或“裸 RSA”或 PKCS#1 格式输出 RSA 私钥,但这不再是默认格式。您仍然可以使用选项获取它-m PEM,也可以使用获取 PKCS#8 格式-m PKCS8。两者都与 OpenSSL 兼容(现在首选 PKCS#8。)

快速摘要:

  • BEGIN RSA PRIVATE KEY:称为“PEM”或“PKCS#1”,包含 ASN.1 DER 格式的数据
  • BEGIN PRIVATE KEY:“PKCS#8”,比 PEM 更通用(可以容纳任何算法),但在大多数情况下仍算作“PEM”(大多数工具可以识别这两种格式),包含 ASN.1 DER 格式的数据
  • BEGIN ENCRYPTED PRIVATE KEY:仍为 PKCS#8,但经过密码加密
  • BEGIN OPENSSH PRIVATE KEY不是“PEM”,包含特定于 OpenSSH 的 SSH2 格式的数据
  • 用于openssl genpkey创建 PKCS#8 格式的密钥、openssl genrsa创建 PKCS#1 格式的密钥、openssl pkey将 PKCS#1 转换为 PKCS#8。
  • 使用ssh-keygen -p -m PEM(使用 -m 选项更改密码)执行到位将其他 SSH 密钥类型转换为 PKCS#1 (PEM)。同样,使用ssh-keygen -p -m PKCS8进行就地转换为 PKCS#8。如果您在未指定 -m 的情况下更改密码,则密钥将转换为 OpenSSH 格式。

答案2

我在 OSX (Ventura) 上遇到了这个问题

  • 权限(权限不好,无法读取......)
  • 格式错误(PEM/PKCS8 与“SSH 类型”)

我想到了这个解决方案

# generate a PRIVATE KEY
openssl genpkey -algorithm RSA -aes-256-cbc -outform PEM -out private_key.pem -pkeyopt rsa_keygen_bits:2048
# create a passphrase made of 4 chars minimum

# SUDO ! change permissions to 600 at most
sudo chmod 600 private_key.pem
# but 400 should work and is event more secure
sudo chmod 400 private_key.pem

# SUDO again
# extract THE PUBLIC KEY in PKCS8 file format
sudo ssh-keygen -e -f private_key.pem -m PKCS8 > public_key.pem
# enter your passphrase

民众密钥提供给想要保护 data.in.txt 文件的人。他或她将执行以下操作来加密该文件:

# SUDO again
sudo openssl pkeyutl -encrypt -pubin -inkey public_key.pem -in data.in.txt -out data.enc.txt

您收到需要解密的加密文件(data.enc.txt):

# SUDO again
sudo openssl pkeyutl -decrypt -inkey private_key.pem -in data.enc.txt -out data.out.txt

# then you can read the confidential information
cat data.out.txt

您可以采用相同的方法,以便他/她提取他/她的公钥,以便在发送之前加密您的公钥来保护它。

相关内容