9

我在本地机器上使用 IIS 来测试带有 SSL 连接的 FTP。我正在使用FluentFTP库连接到 FTP。我正在使用以下代码连接到服务器。

FtpClient conn = new FtpClient();
conn.Host = firewallSslDetails.Address;
conn.Credentials = new NetworkCredential(firewallSslDetails.UserName, firewallSslDetails.Password);
conn.SslProtocols = System.Security.Authentication.SslProtocols.Default;

X509Certificate2 cert = new X509Certificate2(@"C:\Users\BizTalk360\Desktop\FtpSites\ServerCert.cer");
conn.EncryptionMode = FtpEncryptionMode.Implicit;
conn.DataConnectionType = FtpDataConnectionType.AutoActive;
conn.DataConnectionEncryption = true;
conn.EnableThreadSafeDataConnections = false;
conn.ClientCertificates.Add(cert);
conn.ValidateCertificate += new FtpSslValidation(OnValidateCertificate);

conn.Connect();

服务器返回给我以下错误。

FluentFTP.FtpCommandException:策略需要 SSL。;Win32 错误:访问被拒绝。错误详情:SSL 策略需要 SSL 用于控制通道。;

对于通过 FTP 连接,上面的代码可以正常工作,而对于带有 SSL 的 FTP,它不能正常工作。

4

2 回答 2

14

由于您似乎正在连接到默认端口 21(没有在任何地方指定显式端口),您需要使用“显式”模式:

conn.EncryptionMode = FtpEncryptionMode.Explicit;

如果服务器使用自签名证书,您可能需要以编程方式对其进行验证。不要像@Ivan 的回答那样盲目地接受任何证书。这是一个安全漏洞。验证特定证书,例如通过检查其指纹。

请参阅FtpWebRequest“根据验证过程,远程证书无效”

于 2017-02-09T08:22:54.260 回答
1
//try this , 

var cl = new FtpClient(Server, Port, User, Password);
            cl.EncryptionMode = FtpEncryptionMode.Implicit;
            cl.DataConnectionType = FtpDataConnectionType.AutoPassive;
            cl.DataConnectionEncryption = true;
            cl.SslProtocols = protocol;
            cl.ValidateCertificate += new FtpSslValidation(OnValidateCertificate);
            var cer = new X509Certificate2(certificate);
            cl.ClientCertificates.Add(cer);
 System.Net.ServicePointManager.ServerCertificateValidationCallback = ServerCertificateValidationCallback;
 client.Connect();


 void OnValidateCertificate(FtpClient control, FtpSslValidationEventArgs e)
        {
            // add logic to test if certificate is valid here
            e.Accept = true;
        }
        private  bool ServerCertificateValidationCallback(object sender,
                                                X509Certificate certificate,
                                                X509Chain chain,
                                                SslPolicyErrors sslPolicyErrors)
        {
            return true;
        } 
于 2019-08-07T19:17:50.470 回答