使用
SSH.NET
,我正在尝试从我的 SSH 主机(在本例中为 Raspberry Pi)获取 ed25519
和 rsa
主机密钥。
文档演示了这种技术,但是
e.FingerPrint
包含一个 16 元素的字节数组(不清楚该数组到底代表什么)。但是,我希望复制内置 Win11 SSH 客户端的功能,该客户端以这种格式检索主机密钥并将其存储在文件%USERPROFILE%\.ssh\known_hosts
中:
offsite ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICuy9wsbY7fBFFoB6K0RU/BsISB3mL4PQ3311ta0S/cW
offsite ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDAEmXakR9rh5Sokj/PvmyiL/tZtQp7OPbQYb9PdlQjPXELJpBZkFs5gnoqxFj5ysqKnBREY/GpOKkXxdh5dMGGzoir93ypicI7A1VQTd3d8WQdtV1tnP7u9hbAfSqtj+7OGCsi0eMUBYx1fS3XbSC1jKr2MG2ovMCp3kdHtDoGrysP5ai0EXY07ZMmTpxTJbZFtZ8IX3U+ON71KIfZSC6UqlptFyFh1SUmpZXbnsbSr4BDoI8fG0A9Km9BTohWK9ioPSLL530KXz72S4EaBgx0Za1c+TGPqnjAu+s9kc0DeBrwLTEZzfS40xj+sdM4IvPERMBZAPH6cmMutHNWVtIdPyiTi93gCn8oz3D0UX8QT3Yc9Qhx0KLw7AzLajAXSc7zdOebtovZmOejyl4YrYO4Q2rZ3ODTqotFgXGJWNFkg/PoV+Yzy4tILOujDlTHUv3/BkFaj4TSnzgl7NzstdZpNM1R0KBkHlDuM10K9yyLEmNlHSvx8zTZWBTEkzb1FoU=
我试过遍历 SSH.NET 的
Client.ConnectionInfo.HostKeyAlgorithms
字典,但我不确定从哪里获取条目值调用所需的字节数组:
Dim aData As Byte() = Nothing
For Each oAlgorithm In oClient.ConnectionInfo.HostKeyAlgorithms
Dim oInstance = oAlgorithm.Value(aData)
End For
该代码失败,因为
Func(Of Byte(), KeyHostAlgorithm)
调用需要一个包含元素的实际数组。它还拒绝空数组(以及任何其他数组)。例如:
oAlgorithm.Value({})
请求的长度(4)大于实际读取的字节数(0)。参数名称:length
oAlgorithm.Value({0, 1, 2})
请求的长度(4)大于实际读取的字节数(3)。参数名称:length
oAlgorithm.Value({0, 1, 2, 3})
不支持超过 2147483647 的数据。
这里有什么?那个字节数组参数应该是什么,从哪里得到它?
我也在
Client.HostKeyReceived
事件处理程序中尝试过这个:
Dim sFingerprint = Convert.ToBase64String(New SHA256Managed().ComputeHash(e.HostKey))
但是计算出的 Base64 字符串与我的
known_hosts
文件中当前针对该主机的条目不同。
如何从 SSH 主机检索各种密钥,以匹配
known_hosts
(特别是ed25519
和rsa
)中的内容的方式?
--编辑--
我已经成功地发现了要在函数调用中使用的字节数组:
oHandler = Sub(Sender As SshClient, e As HostKeyEventArgs)
Dim aData As Byte()
For Each oAlgorithm In Sender.ConnectionInfo.HostKeyAlgorithms
Dim oInstance = oAlgorithm.Value(e.HostKey)
If TypeOf oInstance.Key Is Ed25519Key Then
aData = DirectCast(oInstance.Key, Ed25519Key).PublicKey
Exit For
End If
Next
End Sub
但是,
aData
计算出的Base64 仍然与Win11 SSH 客户端的输出不匹配。有谁知道这些值是如何得出的?