我用这个命令创建了一个公钥/私钥对:
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:error:09FFF06C:PEMroutines:CRYPTO_internal:no start line:/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 -----BEGIN RSA PRIVATE KEY----- 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
会被拒绝呢?
不,它只是一种“类似 PEM”的格式。有一个“-----HEADER-----”,还有 Base64 编码的数据。但这就是相似之处的结束——在 Base64 blob 中发现的实际数据结构与 PEM 的完全不同;它甚至没有像典型的“PEM”文件那样使用 ASN.1 DER,而是使用 SSH 数据格式。
ssh-keygen 命令用于以OpenSSL 样式的 PEM 或“bare RSA”或 PKCS#1 格式输出 RSA 私钥,但这不再是默认值。您仍然可以使用该
-m PEM
选项获取它,也可以使用-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 格式。