繁体   English   中英

使用特定的CA进行SSL连接

[英]Use a particular CA for a SSL connection

我正在使用.NET Framework 2.0阅读您的应用程序中的支持证书,试图确定如何为SSL连接设置CA。

在“ 验证证书”下的文章的大约一半处,MSDN提供了一些代码:

static void ValidateCert(X509Certificate2 cert)
{
    X509Chain chain = new X509Chain();

    // check entire chain for revocation 
    chain.ChainPolicy.RevocationFlag = X509RevocationFlag.EntireChain;

    // check online and offline revocation lists
    chain.ChainPolicy.RevocationMode = X509RevocationMode.Online | 
                                           X509RevocationMode.Offline;

    // timeout for online revocation list 
    chain.ChainPolicy.UrlRetrievalTimeout = new TimeSpan(0, 0, 30);

    // no exceptions, check all properties
    chain.ChainPolicy.VerificationFlags = X509VerificationFlags.NoFlag;

    // modify time of verification
    chain.ChainPolicy.VerificationTime = new DateTime(1999, 1, 1);

    chain.Build(cert);
    if (chain.ChainStatus.Length != 0)
        Console.WriteLine(chain.ChainStatus[0].Status);
    }

然后再:

// override default certificate policy
ServicePointManager.ServerCertificateValidationCallback =
    new RemoteCertificateValidationCallback(VerifyServerCertificate);

我觉得我缺少真正明显的东西。 例如,我不需要回调-我只想说“建立SSL连接,这是值得信任的一个CA”。 但是我在上面的代码中看不到。

X509Chain似乎没有添加CA或信任根的add方法。 是否应该在回调之前设置CA? 但是我在上面的代码中看不到。

在Java中,将在加载要使用的特定CA后使用TrustManager (或TrustManagerFactory )完成(例如,请参阅直接对HTTPS请求在文件系统上使用PEM编码的CA Cert? )。

问题 :如何设置CA用于.Net或C#中的SSL连接?

以下代码将避免Windows证书存储,并使用文件系统上的CA来验证链。

函数的名称无关紧要。 下面, VerifyServerCertificate是与SslStream类中的RemoteCertificateValidationCallback相同的回调。 它也可以用于ServicePointManagerServerCertificateValidationCallback

static bool VerifyServerCertificate(object sender, X509Certificate certificate,
    X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
    try
    {
        String CA_FILE = "ca-cert.der";
        X509Certificate2 ca = new X509Certificate2(CA_FILE);

        X509Chain chain2 = new X509Chain();
        chain2.ChainPolicy.ExtraStore.Add(ca);

        // Check all properties
        chain2.ChainPolicy.VerificationFlags = X509VerificationFlags.NoFlag;

        // This setup does not have revocation information
        chain2.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck;

        // Build the chain
        chain2.Build(new X509Certificate2(certificate));

        // Are there any failures from building the chain?
        if (chain2.ChainStatus.Length == 0)
            return false;

        // If there is a status, verify the status is NoError
        bool result = chain2.ChainStatus[0].Status == X509ChainStatusFlags.NoError;
        Debug.Assert(result == true);

        return result;
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex);
    }

    return false;
}

我还没有弄清楚默认情况下如何使用该链(下面的chain2 ),因此不需要回调。 也就是说,将其安装在ssl套接字上,连接将“正常工作”。 而且我还没有弄清楚如何安装它,使其传递到回调中。 也就是说,我必须为回调的每次调用构建链。 我认为这些是.Net中的体系结构缺陷,但我可能缺少明显的东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM