【发布时间】: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