我已经用以下命令创建了公钥/私钥对:
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
您可以采用相同的方法,以便他/她提取他/她的公钥,以便在发送之前加密您的公钥来保护它。