我在C#中创建了一个简单的ftp客户端,它可以满足我的需要(连接到ftp,可以选择使用代理),但我也希望能够使用AUTH。
所以,我没有看NetworkStream,而是看了SslStream,希望它能成为一个相当容易的替代品。
然而,当与我的(glftpd,自签名的openssl证书) ftp握手时,我似乎遇到了很多问题。下面是代码片段:
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;
}我在AuthenticateAsClient上使用了IOException:“由于意外的数据包格式,握手失败了。”我从不闯入ValidateServerCertificate (从未到达)。
我发现很难调试此错误,因为我可以将TcpClient端口设置为1208219421,但仍然会收到相同的错误(因此我甚至不知道它是否无法与ssl端口对话)。
上面的代码(在3-4种不同的C# ssl指南中)是从链接文本修改的。
我尝试过sslStream.AuthenticateAsClient(.,.,SslProtocols.Tls,false)和sslStream.AuthenticateAsClient(.,SslProtocols.Ssl3,false) Ssl2和Default,我知道TLS与我的glftpd安装一起工作。
如果我不得不猜测,我会认为这与machinename/certname有关,但我已经尝试过certname (即"glftpd"),所以现在我不知道为什么握手失败。
此外,应该注意的是,证书是自签署的。
任何帮助都是非常感谢的!
发布于 2009-12-16 22:10:00
你查过端口号了吗?这就是问题所在吗?
编辑1
http://en.wikipedia.org/wki/FTPS
也许您的服务器没有处于“隐式”模式?应该是吧?
您可能也希望在产品中提供显式模式支持/而不是。
编辑2
(抱歉,我还不能评论,没有足够的代表,所以我正在做编辑。)*-)
如果不需要在活动代码中同时支持显式和隐式,那么如果可能的话,我通常喜欢在两个端口上同时运行TCP服务器,一个用于隐式SSL,另一个用于显式/非SSL。您的服务器软件可能支持也可能不支持这一点。
编辑3
取决于您是否控制服务器/如何符合标准,您想要!
隐式模式将被认为是稍微不那么标准,但OTOH的工作较少。
编辑4
使用显式而非隐式的方法可能更好地防止拒绝服务问题,但我不确定,我必须研究该协议。我的经验是使用XMPP。
编辑5
此外,显式模式的纯文本启动可能会让一些公司法律部门对任何未经授权的访问的法律问题放松一点,而不是直接开始做TLS胡言乱语的事情。
https://stackoverflow.com/questions/1917597
复制相似问题