.Net Core使用SSH.NET包连接远程SFTP出现哈希算法不支持错误问询
问题根因
你遇到的异常与业务代码逻辑无关,是SSH.NET 2020.0.1版本的.NET Core兼容性缺陷导致的:
- 该版本内部实现HMAC哈希校验逻辑时,采用了操作
HashName属性动态创建哈希算法的实现方式,这种方式仅在.NET Framework下被支持 - .NET Core 3.0+废弃了通过
HashName属性动态调用哈希算法的能力,要求必须显式实例化对应哈希算法的子类,因此触发报错
解决方案
方案1(推荐):升级SSH.NET版本
SSH.NET官方在2020.0.2版本已经修复了该兼容性问题,直接将NuGet中的SSH.NET包升级到2020.0.2及以上版本即可,你的原有代码无需做任何修改就能正常运行。
方案2(兼容旧版本):手动指定加密算法
如果受项目依赖限制无法升级SSH.NET版本,可以手动构造连接信息,将HMAC算法的创建逻辑替换为显式实例化的实现,绕开兼容性问题,修改后的代码如下:
public void Connect() { string host = "xxxx.xx.xxx"; int port = xx; string userid = "xxxx"; string password = "xxxx"; try { // 构造连接信息和密码验证方式 var authMethod = new Renci.SshNet.PasswordAuthenticationMethod(userid, password); var connectionInfo = new Renci.SshNet.ConnectionInfo(host, port, userid, authMethod); // 替换HMAC算法的创建逻辑为显式实例化,规避HashName调用 connectionInfo.HmacAlgorithms["hmac-sha1"] = () => new System.Security.Cryptography.HMACSHA1(); connectionInfo.HmacAlgorithms["hmac-sha2-256"] = () => new System.Security.Cryptography.HMACSHA256(); connectionInfo.HmacAlgorithms["hmac-sha2-512"] = () => new System.Security.Cryptography.HMACSHA512(); connectionInfo.Timeout = TimeSpan.FromMinutes(1); var client = new Renci.SshNet.SftpClient(connectionInfo); if (!client.IsConnected) { client.Connect(); Console.WriteLine("SFTP client connected successfully"); } } catch(Exception ex) { Console.WriteLine(ex.Message); } }
内容的提问来源于stack exchange,提问作者Kuntal Ghosh
相关产品推荐
相关产品推荐

