将 OpenSSH 公钥转换为带有空格和列的十六进制格式的 PKCS#1

将 OpenSSH 公钥转换为带有空格和列的十六进制格式的 PKCS#1

我有 OpenSSH 格式的 SSH 公钥(在我的 Mac 上生成),如下所示:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDXaDj1YGcvKIhUIgmjV/Mjz8so5O2tdxG9gVlTwCxuFLjcUOsciB5R+hZ28GZtb9tb0p4ZSGd8bLcUnI/tqFlVBfRKhfixbvJlDJkzh1eqzqjgCz7Sgd7vo/9pX4FNmajcdt4nsgMI0Q0NLZOWF0M90gTAkcpfCVyt561IIrHK0MpWPqQbp917X8hfRH23sgo8B471FhN6j3ghS18OcAG8LSzCQ5IjJzyqzRRYLpYVdGVyrqNKV0wBOP7dzmZAcpit4XCtRIESKdQGzPCMcctgh2doBPwFyP1AUcTCrq5skZgik6RjaJAlCm3rxPs0bJDGInWEg0lTnTc7hEmV4tf3 nameofthekey

我需要使用以下格式转换为十六进制的 PKCS#1:

30818602 8180E6B0 25E45C19 54F3DBAD D41C79BF 2054F2C9
33775177 6F60F3B0 9654B03D 02A6A30F B04A5D59 E9BA7846
32059FB6 1157F39B 2C60C890 9B92EFA6 CD566AE2 41621AEB
7BC30538 7065BD5A E3D2380E F1ABF4BF A8EFB0C9 E9BB06E0
8A060E0E 2022047C 009BA3F6 47257E1B B3498941 3C1281BA
C5D64786 377B7426 2B5AA315 41C70201 25

并放入我的华为OLT终端中进行SSH RSA密钥访问。

谢谢。

答案1

格式一致ASN.130包含长度为 0x86 ( ) 的序列 ( ),其中包含长度为 0x80 ( ) 的80 86整数 ( ),后跟长度为 1 ( ) 的整数 ( )。这是一个可信的 RSA 公钥。0281 800201

假设 SSH 密钥在一个文件中id_rsa.pub,您可以使用以下命令将其转换为所需的格式

ssh-keygen -f /dev/stdin -e -m PKCS8 -f id_rsa.pub |
openssl pkey -pubin -outform DER |
od -t x1 -An -w4 |
tr 'a-f' 'A-F' |
tr -d ' ' |
fmt -w 54

(为什么这么复杂?因为.)

答案2

我花了一个晚上,找到了这个解决方案:

OpenSSH 公钥必须转换为PKCS#1 PEM 编码的公钥那是在base64中:

ssh-keygen -f id_rsa.pub -e -m pem

接下来,使用base64 到十六进制像这样的转换器:http://tomeko.net/online_tools/base64.php?lang=en

输入没有开始和结束标记的字符串

-----BEGIN RSA PUBLIC KEY-----
-----END RSA PUBLIC KEY-----

到转换器并单击转换

例如:

您将其输入转换器:

MIIBCgKCAQEA12g49WBnLyiIVCIJo1fzI8/LKOTtrXcRvYFZU8AsbhS43FDrHIgeUfh2dvBmbW/bW9KeGUhnfGy3FJyP7ahZVQX0SoX4sW7yZQyZM4dXqs6o4As+0oHe76P/aV+BTZmo3HbeJ7IDCNENDS2TMhdDPdIEwJHKXwlcreetSCKxytDKVj6kG6fde1/IX0R9t7IKPAeO9RYTeo94IUtfDnABvC0swkxSIyc8qs0UWC6WFXRlcq6jSldMATj+3c5mQHKYreFwrUSBEinUBszwjHHLYIdnaAT8Bcj9QFHEwS6ubJGYIpOkY2iQJQpt68T7NGyQxiJ1hIGJU503O4RJleLV9wIDAQAB

你得到这个:

3082010A0282010100D76838F560672F2888542209A357F323CFCB28E4EDAD7711BD815953C02C6E14B8DC50EB1C881E51F87676F0666D6FDB5BD29E1948677C6CB7149C8FEDA8595505F45F85F8B16EF2650C99338757AACEA8E00B3ED281DEEFA3FF695F814D99A8DC76DE27B20308D12D0D2D939617433DD204C091CA5F095CADE7AD4822B1CAE0CA563EA41BA7DD7B5FC85F447DB7B20A3C078EF516137A8F78214B5F0E7001BC2D2CC2439223273CAACD14582E9615746572AEA34A574C0138FEDDCE66407298ADE170AD44811229D406CCF08C71CB6087676804FC05C8FD4051C4C2AEAE6C91982293A4636890250A6DEBC4FB346C90C62275848349539D373B844978E2D7F70203010001

对于像华为 GPON OLT 或交换机或 Juniper 这样的网络设备,您几乎不需要将输出编辑为 6 列中的 8 个字符组,如下所示:(通过文本编辑器添加经典空格和换行符)

3082010A 02820101 00D76838 F560672F 28885422 09A357F3
23CFCB28 E4EDAD77 11BD8159 53C02C6E 14B8DC50 EB1C881E
51F87676 F0666D6F DB5BD29E 1948677C 6CB7149C 8FEDA859
5505F44A 85F8B36E F2650C99 338757AA CEA8E00B 3ED281DF
EFA3FF69 5F814D99 A8DC76DE 27B20308 D10D0D2D 93961743
3DD204C0 91CA5F09 5CADE7AD 4822B1CA D0CA563E B41BA7DD
7B5FC85F 447DB7B2 0A3C078E F516137A 8F78214B 5F0E7001
BC2D2CC2 43922327 3CAACD14 582E9615 746572AE A34A574C
0138FEDD CE664072 98FAE170 AD448112 29D416CC F08C71CB
60876768 04FC05C8 FD4051C4 C2AEAE6C 91982293 A4636890
250A6DEB C4FB346C 90C62275 84834953 9D373B84 4995E2D7
F7020301 0001

现在您可以将此 RSA 公钥放入控制台,保存,并将 RSA 密钥分配给用户,然后您可以使用 SSH 私钥登录。

答案3

Gilles 的食谱很棒,但它不适用于我的华为交换机 5720

但稍作修改后它确实可以工作

ssh-keygen -e -m pem -f ~/.ssh/id_rsa.pub | \
egrep -v  "BEGIN|END" | base64 -d | \
od -t x1 -An -w4 | tr 'a-f' 'A-F' | tr -d ' ' | fmt -w 72

答案4

试试这个单线:

ssh-keygen -e -m pem -f ~/.ssh/id_rsa.pub | sed '1d;$d' | tr -d '\n' | base64 -d | xxd -c 24 -g 4 -u | sed -e "s/^.*: //" -e "s/.\{25\}$//g"

在 Mac 和 Ubuntu 上测试,适用于华为 AR120-S 路由器。

您可能还对自动将 ssh id 导入路由器的脚本感兴趣: https://gist.github.com/TerryGeng/f24f07737ea7ff543838dd82bbbba31a

相关内容