我用C#制作了一个简单的ftp客户端,它可以满足我所需的功能(连接到ftp,可选使用代理),但我希望能够使用AUTH SSL。
因此,我不是使用NetworkStream,而是查看了SslStream,并希望它是一个相当容易的替换。
然而,在与我的ftp(glftpd,自签名的openssl证书)进行握手时,我似乎遇到了很多问题。这里是一段代码片段:
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"),所以现在我对为什么我会得到“握手失败”毫无头绪。
还应该注意的是,证书是自签名的。
非常感谢任何帮助!
- Chuck