使用EnableSSL的FtpWebRequest

时间:2009-10-22 15:29:27

标签: c# ssl ftp ftpwebrequest

我实现了自定义FTP类,以便与我付费的托管服务器一起使用。 我使用FTP来备份,恢复和更新我的应用程序。 我现在正处于想要让ssl投入生产的那一刻。 我问我的托管公司他们是否支持ssl协议,他们说他们这样做。

所以我在Microsoft MSDN教程之后将我的方法修改为:

reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(m_ftpAddress.Trim()));
reqFTP.UseBinary = true;
reqFTP.Credentials = new NetworkCredential(m_ftpUsername, m_ftpPassword);
reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;

ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(ValidateServerCertificate);
                X509Certificate cert = new X509Certificate(path to a certificate created with makecert.exe);

reqFTP.ClientCertificates.Add(cert);
reqFTP.AuthenticationLevel = AuthenticationLevel.MutualAuthRequested;
reqFTP.ImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Identification;

reqFTP.EnableSsl = true;

现在,MSDN说如果服务器支持ssl协议,那么当被问到AUTH TLS时它不会抛出异常。这可以在跟踪日志中看到。所以我认为这不是服务器问题。

在身份验证阶段之后,服务器返回

  

System.Net信息:0:[0216] FtpControlStream#41622463 - 接收响应[227进入被动模式(IP和端口号)。]

消息触发错误:

  

System.Net错误:0:[0216] FtpWebRequest中的异常#12547953 :: GetResponse - 远程服务器返回错误:227进入被动模式(IP和端口号)。

我尝试设置

reqFTP.UsePassive = true;

属性为false然后我收到此错误:

  

System.Net信息:0:[2692] FtpControlStream#4878312 - 收到回复[500非法端口命令]

当然,如果没有将EnableSLL属性设置为true,一切都可以正常运行。

有没有人对此有任何想法?

编辑:我将代码修改为fallows:

reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(m_ftpAddress.Trim()));
reqFTP.UseBinary = true;
reqFTP.Credentials = new NetworkCredential(m_ftpUsername, m_ftpPassword);
reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;

ServicePointManager.ServerCertificateValidationCallback = new       
     System.Net.Security.RemoteCertificateValidationCallback(ValidateServerCertificate);

reqFTP.ClientCertificates.Add(cert);
reqFTP.AuthenticationLevel = AuthenticationLevel.MutualAuthRequested;
reqFTP.ImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Identification
reqFTP.EnableSsl = true;

ValidateServerCertificate始终返回 true 。在此修改之后,效果为无。

我不明白:

  • 此时应用程序正在使用服务器证书,对吗?
  • 在修改之前还使用了我的?

有人可以解释我这是如何运作的吗?

编辑:在与托管公司交换了许多电子邮件之后,结果发现他们的FTP软件存在问题,而且代码没问题。

1 个答案:

答案 0 :(得分:1)

您是否检查过您的主机是否使用FTPS或SFTP?

它们是不同的协议,你的主人可能认为你在谈论错误的协议。