【发布时间】:2009-12-16 20:49:09
【问题描述】:
我用 C# 制作了一个简单的 ftp 客户端,它可以满足我的需要(连接到 ftp,可选择使用代理),但我也希望能够使用 AUTH SSL。
因此,我没有使用 NetworkStream,而是查看了 SslStream,并希望它是一个相当容易的替代品。
但是,在与我的 (glftpd, selfsigned openssl cert) 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;
}
我以 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 安装。
如果我不得不猜测我会认为它与机器名/证书名有关,但我已经尝试过证书名(即“glftpd”),所以现在我对失败的原因一无所知握手。
还应注意证书是自签名的。
非常感谢任何帮助!
- 查克
【问题讨论】: