5

我正在尝试使用 WinSCP .NET 程序集连接到 WinSCP 服务器。我遇到的问题是它会检查主机密钥指纹。我创建了一个 RSA 密钥。我的代码如下:

var server = new WinSCP.SessionOptions();
server.UserName = "ftp_user";
server.Password = "******";
server.HostName = "192.x.x.x";
server.Protocol = WinSCP.Protocol.Sftp;
server.SshHostKeyFingerprint =
    "9f:39:52:d5:08:0c:1d:a8:02:c9:7e:44:49:7f:44:fb";

var session = new WinSCP.Session();            
session.Open(server);

SshHostKeyFingerprint属性分配中,我收到以下错误:

SSH 主机密钥指纹“9f:39:52:d5:08:0c:1d:a8:02:c9:7e:44:49:7f:44:fb”不匹配模式 /(ssh-rsa |ssh-dss )?\d+ ([0-9a-f]{2}:){15}[0-9a-f]{2}(;(ssh-rsa |ssh-dss )?\d+ ([0-9a- f]{2}:){15}[0-9a-f]{2})*/

如果我正确阅读,它正在检查 15 2 个字符集,并且我正在分配一个 16 个集合值。我从服务器得到这个值。

更新: 我缺少的是指纹类型(ssh-dssssh-rsa)及其大小(10242048)。因此,答案如下:

server.SshHostKeyFingerprint =
    "ssh-rsa 1024 9f:39:52:d5:08:0c:1d:a8:02:c9:7e:44:49:7f:44:fb";

如果我正确阅读正则表达式,它不会让您知道在指纹类型之后需要指纹大小。

我希望这对其他人有帮助。感谢大家的洞察力和投入。

4

2 回答 2

6

您缺少ssh-rsa前缀(仅看似可选)和密钥大小。

您可以在服务器和协议信息对话框中以正确的格式获取指纹:

服务器和协议信息对话框

虽然最简单的方法是使用 WinSCP GUI 函数生成具有正确值的代码模板。

有关详细信息,请参阅在哪里获取 SSH 主机密钥指纹以授权服务器?


请注意,它实际上是在寻找 16 对(15 对后跟一个冒号和一个尾随对)。


即将推出的 WinSCP 5.16 将允许像您一样只使用校验和。尽管无论如何都不建议省略键类型前缀。如果没有前缀,WinSCP 可能会与服务器在另一种(更好的)主机密钥类型上达成一致,而不是您拥有校验和的那种。然后验证显然会失败。

于 2013-12-26T21:18:11.150 回答
2
/(ssh-rsa |ssh-dss )?\d+ ([0-9a-f]{2}:){15}[0-9a-f]{2}(;(ssh-rsa |ssh-dss )?\d+ ([0-9a-f]{2}:){15}[0-9a-f]{2})*/

这将查找 15 对十六进制数字,每对后有一个冒号,然后再查找一对没有冒号的。所以不是 15/16 是你的问题。这是它的其余部分。

有一堆可选组件,但您缺少的强制性组件是\d+十六进制之前的。这是一个十进制数,显然表示密钥大小,可能类似于 1024 或 2048 或 4096。先放它,然后是空格,然后是十六进制的东西。

于 2013-12-26T17:52:07.113 回答