如何使用TLS上的FTP(FTPS)验证X.509证书?

问题描述 投票:1回答:1

以下代码能够使用TLS连接到FTP服务器:

private FtpClient getFtpsClient(System.Uri uri) {
    if (uri.Scheme != "ftps") {
        throw new NotImplementedException("Only ftps is implementent");
    }
    var userInfo = uri.UserInfo.Split(":");
    FtpClient client = new FtpClient(uri.Host, userInfo[0], userInfo[1]);
    client.EncryptionMode = FtpEncryptionMode.Explicit;
    client.SslProtocols = SslProtocols.Tls;
    client.ValidateCertificate += new FtpSslValidation(OnValidateCertificate);
    client.Connect();

    void OnValidateCertificate(FtpClient control, FtpSslValidationEventArgs e) {
        var cert2 = new X509Certificate2(e.Certificate);
        e.Accept = cert2.Verify();
    }
    return client;
}

作为库,我使用FluentFTP。我想知道方法X509Certificate2.Verify()是否足以防止安全问题。

X509Certificate2.Verify()到底是做什么的?引用的文档在信息上非常短。

X509Certificate2.Verify()失败吗?

c# .net-core x509
1个回答
0
投票

man-in-the-middle attack已于3个月前更新,现在回答了问题。

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

documentation

方法2:如果证书与白名单证书匹配,则连接。

首先,您必须发现有效证书的字符串。使用此代码将有效的证书字符串保存到文件中:

client.ValidateCertificate += new FtpSslValidation(delegate (FtpClient c, FtpSslValidationEventArgs e) {
    if (e.PolicyErrors != System.Net.Security.SslPolicyErrors.None){
        e.Accept = false;
    }else{
        e.Accept = true;
    }
});

然后最后使用此代码检查收到的证书是否与您信任的证书匹配:

client.ValidateCertificate += new FtpSslValidation(delegate (FtpClient c, FtpSslValidationEventArgs e) {
    File.WriteAllText(@"C:\cert.txt", e.Certificate.GetRawCertDataString());
});
© www.soinside.com 2019 - 2024. All rights reserved.