我遇到了SslStream.AuthenticateAsClient需要“长时间”(~15s)的问题。这是一个已知问题,在MSDN blog post中进行了解释。
它提供了两种可能的解决方案
总结一下,这种行为是设计的。我们的选择是:1) 在本地安装根CA证书,这样我们就不需要去了 Internet用于受信任的根CA证书列表。 2)禁用 自动根证书通过GPO更新功能,所以我们不去 互联网无论如何。
从安全角度来看,我被告知选项2不是一个好主意,所以我需要做选项1.
问题是我不知道如何获得根CA证书。一旦我拥有它,我可能会弄清楚如何使用certutil来安装它。
我可以在这个函数中破坏我的执行
private static bool CertificateValidationCallback(
object oSender,
X509Certificate oCertificate,
X509Chain oChain,
SslPolicyErrors oSslPolicyErrors)
{
}
所以我想我的问题是:
如何获得根CA证书? 我需要哪些信息才能获得它? 我从哪里获得这些信息?
答案 0 :(得分:0)
授权信息X509标准的访问扩展包含根CA证书的位置信息(URL),但它是一个可选字段。
http://tools.ietf.org/html/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。正如我所说,授权信息访问是一个可选扩展,但如果它存在,您会注意到可以在控制台中读取Root Ca Certficate的URL。