You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用WinSCP .NET组件连接SFTP服务器时遇主机密钥不匹配错误

解决WinSCP .NET组件SFTP连接的主机密钥指纹问题

我之前也踩过一模一样的坑!WinSCP客户端用着顺风顺水,换成.NET组件就接连报错,咱们一步步来把问题搞定:

为什么会出现第一个报错?

WinSCP客户端第一次连接服务器时,会自动弹出确认并保存主机密钥,之后就不用再管这个环节了。但.NET组件没有这个自动保存的逻辑,必须显式指定SshHostKeyFingerprint参数,否则就会抛出"SessionOptions.Protocol为Protocol.Sftp或Protocol.Scp,但SessionOptions.SshHostKeyFingerprint未设置"的异常。

为什么设置后又报密钥不匹配?

大概率是你获取的指纹格式不对,或者拿错了服务器的主机密钥指纹。这里的核心是:直接从能正常连接的WinSCP客户端里复制正确的指纹,别自己手动拼接或修改!

步骤1:从WinSCP客户端获取正确的主机密钥指纹

  • 打开WinSCP,用你能正常连接的配置登录到SFTP服务器
  • 登录成功后,点击顶部菜单栏的「会话」→「服务器和协议信息」
  • 在弹出的窗口里,找到「主机密钥指纹」这一项,复制完整的字符串(格式类似 ssh-rsa 2048 AA:BB:CC:...
  • 划重点:不要只复制后面的十六进制部分,要完整复制整个行的内容,格式错一点都会导致不匹配!

步骤2:正确配置SessionOptions

把复制的指纹粘贴到你的代码里,示例代码如下:

SessionOptions sessionOptions = new SessionOptions
{
    Protocol = Protocol.Sftp,
    HostName = "你的SFTP主机地址",
    PortNumber = 22, // 替换成你的实际端口号,默认是22
    UserName = "你的登录账号",
    Password = "你的登录密码",
    SshHostKeyFingerprint = "这里粘贴刚才复制的完整指纹",
    SshPrivateKeyPath = @"C:\YourPath\YourPrivateKey.ppk" // 你的ppk密钥文件路径
};

using (Session session = new Session())
{
    try
    {
        session.Open(sessionOptions);
        Console.WriteLine("SFTP连接成功!");
        // 这里可以添加你的文件上传、下载等操作逻辑
    }
    catch (Exception ex)
    {
        Console.WriteLine($"连接失败:{ex.Message}");
    }
}

额外注意事项

  • 确认你复制的指纹属于当前连接的服务器:如果服务器更换了主机密钥,或者你混淆了测试/生产环境的服务器,都会导致密钥不匹配
  • 如果你的密钥是OpenSSH格式(不是ppk),需要先用WinSCP转换成ppk格式(通过「工具」→「转换密钥文件」操作)
  • 检查指纹字符串有没有拼写错误,比如漏了冒号、空格,虽然指纹不区分大小写,但完全复制更稳妥

内容的提问来源于stack exchange,提问作者briba

火山引擎 最新活动