在C#中连接到AWS Managed SFTP服务器时SSH.NET超时

时间:2019-01-03 00:01:52

标签: c# amazon-web-services ssh sftp ssh.net

我在尝试建立与AWS Managed 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实用程序:

Wireshark Capture from C# Code

Wireshark Capture from sFTP utility

当我尝试以原始模式使用PuTTY连接到服务器的端口22时,没有任何反应。

谢谢吉姆

1 个答案:

答案 0 :(得分:2)

根据RFC 4253 Section 4.2. Protocol Version Exchange

  

建立连接后,双方必须发送一个标识字符串。

SSH.NET客户端和Amazon Managed SFTP服务器均未达到此要求。双方先等待对方发送标识字符串,然后再发送自己的标识字符串。死锁是不可避免的(仅因超时而中断)。这也解释了为什么Wireshark不能将会话标识为SSH,因为根本没有数据交换。因此,没有什么可以用来识别协议的。

如果您可以修改SSH.NET源代码,请在Session.Connect中移动此行:

SocketAbstraction.Send(_socket, Encoding.UTF8.GetBytes(string.Format(CultureInfo.InvariantCulture, "{0}\x0D\x0A", ClientVersion)));

...在此块上方:

Match versionMatch;

//  Get server version from the server,
//  ignore text lines which are sent before if any
while (true)
{
    ...
}

...应该可以解决问题。

还可以考虑将该错误报告给亚马逊。

我有reported the bug to SSH.NET 包括needed change


如果无法更改SSH.NET代码,则需要使用其他SFTP库。

例如,我的WinSCP .NET assembly与Amazon Managed 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 GUI可以generate a code template像上面的那样为您服务。