SSH.NET timeout when connecting to AWS Managed SFTP server in C#(在C#中连接到AWS托管SFTP服务器时SSH.NET超时)
问题描述
我在尝试建立与AWS托管SFTP服务器的连接时遇到问题。使用手头的凭据,我可以使用sftp命令从Windows命令行连接到服务器。以下是我的.NET代码:
using (var client = new SshClient(new ConnectionInfo(baseHost, user,
            new AuthenticationMethod[]{
                new PrivateKeyAuthenticationMethod(user,new PrivateKeyFile[]{
                    new PrivateKeyFile(keyLocation, pkpassword)
                }),
            }
        )))
{
    client.Connect(); // Timeout here
}
上面的代码到达client.Connect()行,然后在30秒后超时,并出现Renci.SshNet.Common.SshOperationTimeoutException异常。当我查看Wireshark的情况时,我发现sftp命令行实用程序使用的协议是SSH,而SSH.NET使用的是TCP,并且数据包大小完全不同。
有人知道我可能遗漏了什么吗?
我在与上述代码相同的计算机上运行sftp命令行实用程序。下面的第一个Wireshark图像来自上面的C#代码。第二个来自sftp实用程序:
当我尝试在原始模式下使用PuTTY连接到服务器的端口22时,没有收到响应。
谢谢,吉姆
推荐答案
根据RFC 4253 Section 4.2. Protocol Version Exchange:
建立连接后,双方必须发送标识字符串。
SSH.NET客户端和Amazon托管SFTP服务器都不符合此要求。双方都首先等待对方发送标识字符串,然后再发送自己的标识字符串。死锁是不可避免的(只有超时才会中断)。这也解释了为什么Wireshark没有将会话标识为SSH,因为根本没有数据交换。因此,没有任何东西可以用来标识该协议。
如果可以修改SSH.NET源代码,请将此行移至Session.Connect:
SocketAbstraction.Send(_socket, Encoding.UTF8.GetBytes(string.Format(CultureInfo.InvariantCulture, "{0}x0Dx0A", ClientVersion)));
.此块上方:
Match versionMatch;
//  Get server version from the server,
//  ignore text lines which are sent before if any
while (true)
{
    ...
}
.应该可以解决此问题。
还可以考虑向Amazon报告该漏洞。
我有reported the bug to SSH.NET 包括needed change。SSH.NET 2020.0.0及更高版本中包含该修复程序。
如果无法更改SSH.NET代码,则需要使用其他SFTP库。
例如,MyWinSCP .NET assembly与Amazon托管SFTP服务器兼容。
这是您的代码的等价物:
// Set up session options
SessionOptions sessionOptions = new SessionOptions
{
    Protocol = Protocol.Sftp,
    HostName = baseHost,
    UserName = user,
    SshHostKeyFingerprint = ...,
    SshPrivateKeyPath = keyLocation,
    PrivateKeyPassphrase = pkpassword,
};
using (Session session = new Session())
{
    // Connect
    session.Open(sessionOptions);
    // Your code
}
WinSCP图形用户界面可以generate a code template为您选择上面的界面。
这篇关于在C#中连接到AWS托管SFTP服务器时SSH.NET超时的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:在C#中连接到AWS托管SFTP服务器时SSH.NET超时
				
        
 
            
        基础教程推荐
- 将事件 TextChanged 分配给表单中的所有文本框 2022-01-01
 - 从 VS 2017 .NET Core 项目的发布目录中排除文件 2022-01-01
 - 如何动态获取文本框中datagridview列的总和 2022-01-01
 - 是否可以在 asp classic 和 asp.net 之间共享会话状态 2022-01-01
 - JSON.NET 中基于属性的类型解析 2022-01-01
 - 在 VS2010 中的 Post Build 事件中将 bin 文件复制到物 2022-01-01
 - 错误“此流不支持搜索操作"在 C# 中 2022-01-01
 - 首先创建代码,多对多,关联表中的附加字段 2022-01-01
 - 全局 ASAX - 获取服务器名称 2022-01-01
 - 经典 Asp 中的 ResolveUrl/Url.Content 等效项 2022-01-01
 
    	
    	
    	
    	
    	
    	
    	
    	
						
						
						
						
						
				
				
				
				