2

我试图了解 SSL 的工作原理。在我希望制作一个支持 SSL 的小型 FTP 客户端时,我遇到了一些问题:

TcpClient FtpConnection = new TcpClient(FtpServer, FtpPort);
NetworkStream FtpStream = FtpConnection.GetStream();
StreamReader FtpReader = new StreamReader(FtpStream);
FtpWriter = new StreamWriter(IrcStream);
send_cmd("AUTH SSL");

send_cmd 只是一个 FtpWriter.WriteLine(text); FtpWriter.Flush(); 功能。

我的“问题”是这样的:首先我需要建立一个到 FTP 的(非 ssl)连接,然后告诉它建立一个 ssl 连接(AUTH SSL),然后我想我需要建立一个新的连接 - 某事喜欢:

TcpClient client = new TcpClient(FtpServer, FtpPort);
SslStream sslStream = new SslStream(client.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null);
try
{
    sslStream.AuthenticateAsClient("foobar");
}
catch (AuthenticationException e)
{
    MessageBox.Show("Authentication failed - closing the connection.");
    client.Close();
    return;
}

取自 msdn。由于意外的数据包格式(我尝试过使用谷歌搜索,但所有人都说这是因为作者连接到了错误的端口),我一直在握手失败,我认为这是:连接不是 ssl,直到 AUTH SSL 发送到它。所以我的问题是,我将如何将其设为“混合”连接,以便与服务器建立 SSL 连接?

任何帮助是极大的赞赏!

4

2 回答 2

1

使用这样的库与我想要的相反。由于我在搜索网络时发现的点击量很少,所以我将发布我的发现:构建 C# ftp 客户端基本上是这样的:

TcpClient blabla = new TcpClient("some.host", 21);
NetworkStream blabla_stream = blabla.GetStream();
StreamReader unsecure_reader = new StreamReader(blabla_stream);
StreamWriter blabla_writer = new StreamWriter(blabla_stream);
blabla_writer.WriteLine("AUTH SSL");
string response = "";
while ((response = unsecure_reader.ReadLine()) != null)
{
   if (response.Substring(0,3) == "234")
   {
       SslStream ssl_connection = new SslStream(blabla.GetStream(), false, new RemoteCertificateValidationCallback(validate_certificate), null);
       ssl_connection.AuthenticateAsClient("");
       StreamReader ssl_stream = new StreamReader(ssl_connection);
       ftp_writer = new StreamWriter(ssl_connection);
   }
}

其中 validate_certificate 是一个基于 msdn 的函数(您可以自己搜索并轻松修改它)。

有关详细信息,请参阅 RFC 4217 和 2228。

于 2010-04-01T20:24:44.050 回答
0

http://ftps.codeplex.com/

这个项目包含你需要的每一个部分。

于 2010-03-27T03:13:09.130 回答