【问题标题】:Roles of Public Certificate (cer) and TLS in FTP Client公共证书 (cer) 和 TLS 在 FTP 客户端中的作用
【发布时间】:2020-01-12 16:42:18
【问题描述】:

在连接 FTP 服务器时,FTP Client 中公共证书和 TLS 的作用是什么?

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

与底部的#2相比,最好可以使用下面的方法1,因为它不需要在客户端使用证书吗?

 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 时如何验证服务器的证书?” https://github.com/robinrodricks/FluentFTP#faq_ftps

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

方法一: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.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);
    }
});

2 相比之下,下面使用“客户端证书使用 FTPS 登录” 使用此方法的问题是它需要客户端证书或服务器的公共证书。

  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();

请参阅如何使用客户端证书通过 FTPS 登录? https://github.com/robinrodricks/FluentFTP#faq_certs

更新

我得到了一个服务器的公共证书,在这种情况下,是上述两种方法(方法2和#2使用相同的证书?

【问题讨论】:

  • 如果你真的去后台en.wikipedia.org/wiki/Transport_Layer_Security你会明白下面的答案解释的各种细节。问问自己是否要信任服务器以及如何信任客户端,或者如何信任客户端以及如何信任,那么这个答案已经足以让你消化。

标签: c# ftp certificate ssl-certificate client-certificates


【解决方案1】:

公共证书的作用是什么

TLS/SSL 使用证书。证书应由受信任的机构签署。所以一般来说,您不需要验证它,因为它应该通过受信任的权威机构进行验证(但我不知道 FluentFTP 是否真的支持)。如果 FTP 客户端不支持对受信任的机构进行验证,或者 FTP 服务器证书是自签名的,您需要自己验证证书。如果你不这样做,你就不安全,因为你失去了对Man-in-the-middle attacks 的保护。

如果你熟悉 SSH,就好像你在 SSH 中盲目接受一个 SSH 主机密钥(指纹)一样。

TLS 的作用是什么

TLS 是加密层。与 HTTPS 中的相同(也使用 TLS)。

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

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

相比之下,以下使用服务器公共证书:

不,它没有。该代码使用 client 证书来验证用户。这与 verifying server (public - sic) 证书无关。您仍然需要验证证书。

尽管如果e.Accept = e.PolicyErrors == SslPolicyErrors.None 有效,您的服务器 证书是有效的,并且由受信任的权威机构签署,您无需担心。

同样,这类似于 SSH serveruser 密钥对。请参阅我在 Understanding SSH Key Pairs 上的文章,想想 "certificate",文章中谈到了 "key"

【讨论】:

  • 您的意思是在不验证服务器证书的情况下使用 TLS 不安全吗?请参阅我对 OP 的更新。
  • 1) 是的。这就是我在第一段中的回答。 2)关于你的“差异”问题。我不知道你要求什么。这是验证证书的两种不同方法。这就是区别。 3) “客户证书” 是针对一个全新的问题。这与验证服务器公共证书无关。
  • 抱歉给您带来了困惑。请在 OP 上再次查看我的更新。
  • 始终需要验证服务器证书。使用客户端证书进行身份验证是可选的,与服务器的公共证书无关。您在问题中提到的那些“两种方法”不是替代品。它们服务于完全不同的目的。再次阅读我在回答中建议的文章。另请注意,OnValidateCertificatee.Accept = true; 的示例实现根本不安全。您必须使用 "given a server's public certificate" 来提供自定义实现。
  • 这看起来越来越像XY problem。询问您想要实施什么。而不是询问您(大部分是错误地)认为与您正在实施的内容相关的各种代码 sn-ps。这不是聊天,这是问答网站。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-02
  • 2015-07-27
  • 2019-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
相关资源
最近更新 更多