WinSCP .NET程序集拒绝RSA/DSA密钥指纹。

6

我正在尝试使用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";

如果我正确理解正则表达式,它并没有告诉你在指纹类型后你需要指纹大小的信息。
希望这对其他人有所帮助。感谢大家提供的见解和意见。
2个回答

7
你遗漏了 ssh-rsa 前缀(看起来是可选的),以及密钥大小。
你可以在 服务器和协议信息对话框 中获取正确格式的指纹。

Server and Protocol Information Dialog

虽然最简单的方法是使用WinSCP GUI功能来生成正确值的代码模板

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


请注意,实际上它正在寻找16对(15对跟随一个冒号和一个尾随对)。
自WinSCP 5.16版本以来,实际上可以像您所做的那样仅使用校验和。然而,无论如何不建议省略密钥类型前缀。如果没有前缀,WinSCP可能会与服务器就另一个(更好的)主机密钥类型达成一致,而不是您具有校验和的那个类型。然后验证显然将失败。

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对数字,而在于后面的部分。

有很多可选组件,但你缺少的强制组件是hex之前的\d+。它是一个十进制数,显然代表密钥大小,可能为1024、2048或4096等。请将其放在第一位,然后加上一个空格,再添加你的十六进制内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接