jww*_*jww 6 openssh public-key
我在解析 OpenSSH 公钥文件时遇到问题。我相信(但我不确定)格式在 RFC 4253, The Secure Shell (SSH) Transport Layer Protocol Section 6.6, Public Key Algorithms 中有详细说明。
对于 RSA 密钥,RFC 说:
“ssh-rsa”密钥格式具有以下特定编码:
Run Code Online (Sandbox Code Playgroud)string "ssh-rsa" mpint e mpint n这里的 'e' 和 'n' 参数构成了签名密钥 blob。
这就是问题开始的地方。该文档没有提供语法,也没有定义什么string和mpint是什么。这导致:
$ cat rsa.ssh.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDSNM6RVVmwN3y0NurIQnmZgjcx5K5zzZu9nDqopW4J
In/mr8OYZI3heSJShnIM8EThvwVGXXXyyJVRQAvRHYFO4DxS6bufSNWr3BxBGaGYlYxI9mgvQnT6+MzE
3oZyEMdQNPlV5VfbileXlrPoAk1TkGdVdhwdLJMI2B4KUyMf+Q== jwalton@test
Run Code Online (Sandbox Code Playgroud)
进而:
$ echo 'AAAAB3NzaC1yc2EAAAADAQABAAAAgQDSNM6RVVmwN3y0NurIQnmZgjcx5K5zzZu9nDqopW4
JIn/mr8OYZI3heSJShnIM8EThvwVGXXXyyJVRQAvRHYFO4DxS6bufSNWr3BxBGaGYlYxI9mgvQnT6+M
zE3oZyEMdQNPlV5VfbileXlrPoAk1TkGdVdhwdLJMI2B4KUyMf+Q==' | base64 -d > rsa.bin
Run Code Online (Sandbox Code Playgroud)
最后:
$ hexdump -C rsa.bin
00000000 00 00 00 07 73 73 68 2d 72 73 61 00 00 00 03 01 |....ssh-rsa.....|
00000010 00 01 00 00 00 81 00 d2 34 ce 91 55 59 b0 37 7c |........4..UY.7||
00000020 b4 36 ea c8 42 79 99 82 37 31 e4 ae 73 cd 9b bd |.6..By..71..s...|
00000030 9c 3a a8 a5 6e 09 22 7f e6 af c3 98 64 8d e1 79 |.:..n.".....d..y|
00000040 22 52 86 72 0c f0 44 e1 bf 05 46 5d 75 f2 c8 95 |"R.r..D...F]u...|
00000050 51 40 0b d1 1d 81 4e e0 3c 52 e9 bb 9f 48 d5 ab |Q@....N.<R...H..|
00000060 dc 1c 41 19 a1 98 95 8c 48 f6 68 2f 42 74 fa f8 |..A.....H.h/Bt..|
00000070 cc c4 de 86 72 10 c7 50 34 f9 55 e5 57 db 8a 57 |....r..P4.U.W..W|
00000080 97 96 b3 e8 02 4d 53 90 67 55 76 1c 1d 2c 93 08 |.....MS.gUv..,..|
00000090 d8 1e 0a 53 23 1f f9 |...S#..|
00000097
Run Code Online (Sandbox Code Playgroud)
所以公钥文件中似乎有未记录的字段。RFC 似乎没有引用其他文档来定义字段。RFC 也未能记录私钥文件。我现在停滞不前。
OpenSSH 在哪里定义其密钥文件中使用的字段?
所以公钥文件中似乎有未记录的字段。RFC 似乎没有引用其他文档来定义字段。
它们在 RFC 4251“The Secure Shell (SSH) Protocol Architecture”的第 5 节中定义。
RFC 也未能记录私钥文件。
SSH 协议根本不记录任何文件格式。它仅在作为 SSH 协议的一部分发送时才定义公钥的序列化(例如,当客户端发送 SSH_MSG_USERAUTH 以提供其公钥时)。
因此,由于私钥从未作为 SSH 协议的一部分通过网络发送,因此其序列化也不需要成为规范的一部分——只有由该密钥生成的签名需要具有定义的格式。
OpenSSH 在哪里定义其密钥文件中使用的字段?
对于公钥,OpenSSH 很可能选择重新使用相同的 RFC 4253 格式将它们存储在文件中,因为这是最方便的选择(即它已经有了序列化代码)。规范不要求这样做,实际上大多数其他客户都有自己的格式。
因为 OpenSSH 将 OpenSSL 用于加密代码(算法、密钥生成),所以以前版本的 OpenSSH 只是使用 OpenSSL 函数提供的任何格式来存储私钥——这是 DER 序列化的 PKCS#1 'RSAPrivateKey' 格式(也通常称为 PEM 格式) ) 大多数时候。有关格式的 ASN.1 定义,请参阅RFC 3447。
(OpenSSL 本身现在更喜欢以 PKCS#8 格式存储私钥,这意味着 OpenSSH 也可以加载这些密钥,尽管它不会写入它们。有关容器格式的 ASN.1 定义,请参阅RFC 5208。)
您可以通过“BEGIN RSA PRIVATE KEY”标头识别 PKCS#1 格式,通过“BEGIN PRIVATE KEY”标头识别 PKCS#8。您可以使用dumpasn1或openssl asn1parse来调查其内容,以及openssl rsa和openssl pkey。
最新版本的 OpenSSH 为私钥文件发明了一种新的自定义格式。容器格式记录在PROTOCOL.key 中,各个密钥格式[可能?] 与ssh-agent使用的相同,后者记录在Draft-miller-ssh-agent 中。此格式使用 RFC 4251 数据类型。
其他 SSH 软件通常具有不同的格式。例如,PuTTY 使用“PPK”格式(我记得在某处有记录,但奇怪的是我找不到在哪里)来存储公钥和私钥。它的Public-Lines字段存储相同的 RFC 4253 公钥,而私有字段是自定义的。
还有RFC 4716,它声称是“ The SSH Public Key Format”,但它通常不被认为是 SSH 的组成部分。(SSH.COM、SecureCRT 和可能的 MultiNet SSH 使用这种格式。)
| 归档时间: |
|
| 查看次数: |
6053 次 |
| 最近记录: |