在不进行身份验证的情况下检索主机指纹?
Retrieve host fingerprint without authenticating?
有什么方法可以检索远程主机指纹而无需传递凭据或以其他方式对设备进行身份验证?
有一个 ssh.net 示例,其中显示了如何验证主机指纹,但它需要凭据。 SshClient
没有不使用用户名的构造函数,甚至 ConnectionInfo
class 也需要一个,所以我不确定如何最好地进行。
虽然我确实找到了 NuDoq 存储库,但没有太多文档,但是这个 class 相当大,示例有限,所以任何正确方向的观点都值得赞赏!
这是他们给出的示例,但需要验证:
byte[] expectedFingerPrint = new byte[] {
0x66, 0x31, 0xaf, 0x00, 0x54, 0xb9, 0x87, 0x31,
0xff, 0x58, 0x1c, 0x31, 0xb1, 0xa2, 0x4c, 0x6b
};
using (var client = new SshClient("sftp.foo.com", "guest", "pwd"))
{
client.HostKeyReceived += (sender, e) =>
{
if (expectedFingerPrint.Length == e.FingerPrint.Length)
{
for (var i = 0; i < expectedFingerPrint.Length; i++)
{
if (expectedFingerPrint[i] != e.FingerPrint[i])
{
e.CanTrust = false;
break;
}
}
}
else
{
e.CanTrust = false;
}
};
client.Connect();
}
HostKeyReceived
发生在任何身份验证之前。验证之前必须验证主机密钥,这样客户端就不会无意中将凭据发送到恶意服务器或 MITM。
所以凭据并不重要。只需在构造函数中提供虚拟凭据,检查事件处理程序中的指纹,然后中止连接。
有什么方法可以检索远程主机指纹而无需传递凭据或以其他方式对设备进行身份验证?
有一个 ssh.net 示例,其中显示了如何验证主机指纹,但它需要凭据。 SshClient
没有不使用用户名的构造函数,甚至 ConnectionInfo
class 也需要一个,所以我不确定如何最好地进行。
虽然我确实找到了 NuDoq 存储库,但没有太多文档,但是这个 class 相当大,示例有限,所以任何正确方向的观点都值得赞赏!
这是他们给出的示例,但需要验证:
byte[] expectedFingerPrint = new byte[] {
0x66, 0x31, 0xaf, 0x00, 0x54, 0xb9, 0x87, 0x31,
0xff, 0x58, 0x1c, 0x31, 0xb1, 0xa2, 0x4c, 0x6b
};
using (var client = new SshClient("sftp.foo.com", "guest", "pwd"))
{
client.HostKeyReceived += (sender, e) =>
{
if (expectedFingerPrint.Length == e.FingerPrint.Length)
{
for (var i = 0; i < expectedFingerPrint.Length; i++)
{
if (expectedFingerPrint[i] != e.FingerPrint[i])
{
e.CanTrust = false;
break;
}
}
}
else
{
e.CanTrust = false;
}
};
client.Connect();
}
HostKeyReceived
发生在任何身份验证之前。验证之前必须验证主机密钥,这样客户端就不会无意中将凭据发送到恶意服务器或 MITM。
所以凭据并不重要。只需在构造函数中提供虚拟凭据,检查事件处理程序中的指纹,然后中止连接。