我在C#中创建了一个简单的ftp客户端,它可以满足我的需要(连接到ftp,可选择使用代理),但我也希望能够使用AUTH SSL。
因此,我没有使用NetworkStream,而是查看了SslStream,并希望它是一个相当容易的替代品。
然而,在与我的(glftpd,自签名openssl证书)ftp握手时,我似乎遇到了很多问题。这是一个代码snippit:
TcpClient client = new TcpClient("192.168.0.2", 1337);
SslStream sslStream = new SslStream(
client.GetStream(),
false,
new RemoteCertificateValidationCallback(ValidateServerCertificate),
null
);
try
{
sslStream.AuthenticateAsClient("192.168.0.2"); // or "glftpd", neither worked.
}
catch (AuthenticationException e)
{
Console.WriteLine("Exception: {0}", e.Message);
if (e.InnerException != null)
{
Console.WriteLine("Inner exception: {0}", e.InnerException.Message);
}
Console.WriteLine("Authentication failed - closing the connection.");
client.Close();
return;
}
我使用IOException打破AuthenticateAsClient:“由于意外的数据包格式,握手失败了。” 我没有打破ValidateServerCertificate(从未到达)。
我发现很难调试此错误,因为我可以将TcpClient端口设置为1208219421并仍然收到相同的错误(所以我甚至不知道它是否无法与ssl端口通信)。
上面的代码(在我看过的3-4个不同的C#ssl指南中)是从link text修改的
我已经尝试了sslStream.AuthenticateAsClient(...,...,SslProtocols.Tls,false)和sslStream.AuthenticateAsClient(...,...,SslProtocols.Ssl3,false)Ssl2和Default,以及我知道TLS适用于我的glftpd安装。
如果我不得不猜测我认为它与machinename / certname有关,但我已经尝试了certname(这是“glftpd”),所以现在我对于为什么我失败了一无所知握手。
还应注意证书是自签名的。
非常感谢任何帮助!
答案 0 :(得分:1)
您检查了端口号吗?这是问题吗?
编辑1
http://en.wikipedia.org/wki/FTPS
也许您的服务器未处于“隐式”模式?应该是吗?
您可能也希望在产品中支持显式模式支持。
编辑2
(道歉,我还不能评论,没有足够的代表所以我正在编辑。:-))
如果不需要对实时代码中的显式和隐式支持,我通常希望在可能的情况下同时在两个端口上运行TCP服务器,一个用于隐式SSL,另一个用于显式/非SSL。您的服务器软件可能支持也可能不支持。
编辑3
取决于您是否控制服务器/您希望符合标准的程度!
隐式模式将被视为稍微不那么标准,但OTOH的工作量较少。
编辑4
使用Explicit而非Implicit可能更好地防止拒绝服务问题,但我不确定,我必须研究协议。我的经验是XMPP。
编辑5
另外,显式模式的纯文本启动可能会使某些公司法律部门对任何未经授权的访问的法律问题稍微放松一些,而不是直接开始在线路上进行TLS乱码的事情。