C# FTP客户端中公共证书(cer)和TLS的角色

C# FTP客户端中公共证书(cer)和TLS的角色,c#,ftp,certificate,ssl-certificate,client-certificates,C#,Ftp,Certificate,Ssl Certificate,Client Certificates,连接到FTP服务器时,FTP客户端中的公共证书和TLS的角色是什么 1从客户端禁用服务器证书验证并仅使用TLS是否安全?如下图所示 最好使用下面的方法1,因为它不需要在客户机上使用证书,而底部的方法2可以吗 FtpClient client = new FtpClient(hostname, username, password); // or set Host & Credentials client.EncryptionMode = FtpEncryptionMode.Ex

连接到FTP服务器时,FTP客户端中的公共证书和TLS的角色是什么

1从客户端禁用服务器证书验证并仅使用TLS是否安全?如下图所示

最好使用下面的方法1,因为它不需要在客户机上使用证书,而底部的方法2可以吗

 FtpClient client = new FtpClient(hostname, username, password); // or set Host & Credentials
    client.EncryptionMode = FtpEncryptionMode.Explicit;
    client.SslProtocols = SslProtocols.Tls;
    client.ValidateCertificate += new FtpSslValidation(OnValidateCertificate);
    client.Connect();    
    void OnValidateCertificate(FtpClient control, FtpSslValidationEventArgs e) {
        //Ignore test if certificate is valid here by setting true
        e.Accept = true;
    }
请参阅如何在使用FTPS时验证服务器的证书?

使用FTPS时如何验证服务器的证书

方法1:如果SSL证书没有错误,则连接

client.ValidateCertificate += new FtpSslValidation(delegate (FtpClient c, FtpSslValidationEventArgs e) {
    if (e.PolicyErrors != System.Net.Security.SslPolicyErrors.None){
        e.Accept = false;
    }else{
        e.Accept = true;
    }
});
方法2:如果证书与白名单证书匹配,则连接

  client.EncryptionMode = FtpEncryptionMode.Explicit;
    client.SslProtocols = SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12;
    client.SocketKeepAlive = false;
    client.ClientCertificates.Add(new X509Certificate2("C:\mycert.cer"));
    client.ValidateCertificate += (control, e) => {
        e.Accept = e.PolicyErrors == SslPolicyErrors.None;
    };
    client.Connect();
首先,必须发现有效证书的字符串。使用以下代码将有效的证书字符串保存到文件:

client.ValidateCertificate += new FtpSslValidation(delegate (FtpClient c, FtpSslValidationEventArgs e) {
    File.WriteAllText(@"C:\cert.txt", e.Certificate.GetRawCertDataString());
});
然后,最后使用此代码检查收到的证书是否与您信任的证书匹配:

string ValidCert = "<insert contents of cert.txt>";
client.ValidateCertificate += new FtpSslValidation(delegate (FtpClient c, FtpSslValidationEventArgs e) {
    if (e.PolicyErrors == SslPolicyErrors.None || e.Certificate.GetRawCertDataString() == ValidCert) {
        e.Accept = true;
    }else{
        throw new Exception("Invalid certificate : " + e.PolicyErrors);
    }
});
请参阅如何使用客户端证书登录FTPS?

更新

我得到了一个服务器的公共证书,在本例中,方法2和2上面的两个方法是否都使用相同的证书

公共证书的作用是什么

TLS/SSL使用证书。证书应由受信任的机构签名。因此,一般来说,您不需要验证它,因为它应该根据受信任的机构进行验证,但我不知道FluentFTP是否真正支持这一点。如果FTP客户端不支持根据受信任的权限进行验证,或者FTP服务器证书是自签名的,则需要自己验证证书。如果你不这样做,你就不安全了,因为你失去了一种保护

如果您熟悉SSH,则类似于盲目接受SSH中的SSH主机密钥指纹

你的角色是什么。。。TLS

TLS是加密层。与HTTPS相同,HTTPS也使用TLS

从客户端禁用服务器证书验证并仅使用TLS是否安全

证书是TLS不可分割的一部分,而不是两个独立的东西。如果您不验证证书,TLS将无法完全保护您

相比之下,下面使用的是服务器公共证书:

不,没有。该代码使用客户端证书对用户进行身份验证。这与验证服务器公共sic证书无关。您仍然需要验证证书

虽然如果e.Accept=e.PolicyErrors==SslPolicyErrors.None有效,但您的服务器证书是有效的,并且由受信任的机构签名,您无需担心


同样,这类似于SSH服务器和用户密钥对。请参阅我的文章,just think certificate,文章中谈到了密钥。

您的意思是在不验证服务器证书的情况下使用TLS是不安全的吗?请看我在OP.1上的更新。是的。这就是我在第一段的回答。2.关于你的分歧问题。我不知道你要什么。这是验证证书的两种不同方法。这就是区别。3客户端证书是一个全新的问题。这与验证服务器公共证书无关。很抱歉造成混淆。请在OP上再次查看我的更新。始终需要验证服务器证书。使用客户端证书进行身份验证是可选的,与服务器的公共证书无关。你在问题中提到的这两种方法不是替代方法。它们的用途完全不同。再次阅读我在回答中建议的文章。还请注意,OnValidateCertificate的示例实现带有e.Accept=true;一点也不安全。您必须使用给定服务器的公共证书来提供自定义实现。这看起来越来越像一个应用程序。询问您想要实现什么。而不是询问您通常错误地认为与您正在实现的内容相关的各种代码片段。这不是聊天,这是问答网站。如果你真的浏览了一下背景,你就会了解下面解释的各种细节。问问自己,如果你想信任一个服务器和如何信任,或者如何信任一个客户机和如何信任,那么这个答案已经足够让你理解了。