1

我遇到了 SslStream.AuthenticateAsClient 需要“很长时间”(约 15 秒)的问题。这是一个已知问题,并在此MSDN 博客文章中进行了说明。

它提供了两种可能的解决方案

总而言之,这种行为是设计使然。我们有以下选择: 1) 在本地安装根 CA 证书,这样我们就不需要去 Internet 获取受信任的根 CA 证书列表。2) 通过 GPO 禁用自动根证书更新功能,这样我们无论如何都不会上网。

有人告诉我,从安全角度来看,选项 2 不是一个好主意,所以我需要执行选项 1。

问题是我不知道如何获得根 CA 证书。一旦我拥有它,我可能会弄清楚如何使用 certutil 来安装它。

我可以在这个函数中打破我的执行

private static bool CertificateValidationCallback(
            object oSender,
            X509Certificate oCertificate,
            X509Chain oChain,
            SslPolicyErrors oSslPolicyErrors)
        {

        }

所以我想我的问题是:

如何获得根 CA 证书?我需要什么信息才能得到它?我从哪里得到这些信息?

4

1 回答 1

0

X509 标准的授权信息访问扩展包含根 CA 证书的位置信息 (URL),但它是一个可选字段。

https://www.rfc-editor.org/rfc/rfc5280#section-4.2.2.1

var cert = new X509Certificate2(certData);
var authInfoExtnsions = from ext in cert.Extensions.Cast<X509Extension>()
                        where ext.Oid.Value == "1.3.6.1.5.5.7.1.1"
                        select ext;
foreach (var authInfoExtnsion in authInfoExtnsions)
{
    Console.WriteLine(Encoding.UTF8.GetString(authInfoExtnsion.RawData));
}

authInfoExtnsion.RawData是一个复杂的 ASN.1 结构(您可以在 X509 标准中找到详细信息),此代码不会为您提供根 CA 证书的 URL。您需要解析并获取 URL。正如我所说的权威信息访问是一个可选的扩展,但如果它存在,你会注意到根 Ca 证书的 URL 可以在控制台中读取。

于 2013-01-18T16:56:34.310 回答