为何WinSCP .NET组件需配置SshHostKeyFingerprint而GUI无需?
WinSCP .NET客户端SFTP连接:SshHostKeyFingerprint必填问题解决
为什么GUI不用填但.NET客户端必须指定?
WinSCP GUI首次连接服务器时,会弹出确认主机密钥的对话框,确认后会把密钥指纹保存在本地配置中,后续连接自动复用该指纹。而WinSCP .NET客户端为了规避中间人攻击风险,默认要求显式配置主机密钥指纹,不会自动缓存或静默接受未知密钥,因此代码里必须指定这个参数。
如何获取远程服务器的SshHostKeyFingerprint?
有三种简单可行的方式:
- 从WinSCP GUI提取
打开WinSCP并通过已有的SFTP连接登录服务器,点击菜单栏「会话」→「服务器和协议信息」,在弹出窗口中找到「主机密钥指纹」,复制完整格式的字符串(例如ssh-rsa 2048 xx:xx:xx:...)。 - 从Linux服务器直接查询
登录目标Linux主机,执行命令ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub(针对RSA密钥),输出的字符串即为指纹,直接复制即可。 - 通过WinSCP命令行获取
打开命令提示符,执行winscp.com /command "open sftp://用户名:密码@主机名" "exit",首次运行时会显示主机密钥指纹,复制对应内容即可。
修改后的代码示例
将获取到的指纹填入SshHostKeyFingerprint字段:
try { // Setup session options SessionOptions sessionOptions = new SessionOptions { Protocol = Protocol.Sftp, HostName = TagService.MAE_IP_PLC, UserName = "manufact", Password = "SUNRISE", // 替换为你获取到的主机密钥指纹 SshHostKeyFingerprint = "ssh-rsa 2048 aa:bb:cc:dd:ee:ff:gg:hh:ii:jj:kk:ll:mm:nn:oo:pp" }; using (Session session = new Session()) { // Connect session.Open(sessionOptions); // Upload files TransferOptions transferOptions = new TransferOptions(); transferOptions.TransferMode = TransferMode.Binary; TransferOperationResult transferResult; transferResult = session.PutFiles(@"c:\test\versions_840Dsl", "/card/siemens/versions.xml", false, transferOptions); // Throw on any error transferResult.Check(); // Print results foreach (TransferEventArgs transfer in transferResult.Transfers) { Console.WriteLine("Upload of {0} succeeded", transfer.FileName); } } //return 0; } catch (Exception e) { Console.WriteLine("Error: {0}", e); //return 1; using (StreamWriter sw = File.AppendText(CommonClass.error_path)) { sw.WriteLine("WinSCP Error " + e + " " + Convert.ToString(DateTime.Now)); } }
内容的提问来源于stack exchange,提问作者Mdarende
相关产品推荐
相关产品推荐

