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

Jim*_*Jim 5 .net c# winscp rsa-key-fingerprint winscp-net

我正在尝试使用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);
Run Code Online (Sandbox Code Playgroud)

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";
Run Code Online (Sandbox Code Playgroud)

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

我希望这可以帮助其他人。感谢大家的见解和投入。

Mar*_*ryl 6

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

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

服务器和协议信息对话框

尽管最简单的方法是使用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})*/
Run Code Online (Sandbox Code Playgroud)

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

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