X509Chain.Build()方法说明

时间:2011-11-08 10:36:59

标签: c# certificate x509certificate2

我想验证证书链,我得到一个X509Certificate2集合,并且必须验证所有证书是否构建了一个链。

通常,为了验证证书链,我应该从叶证书中获取数字签名并检查它是否由根证书签名 - 在.NET中我找不到从X509Certificate2对象中提取签名的方法。

因此,我想到以下列方式使用X509Chain.Build()方法:

   void ValidateChain(X509Certificate2Collection collection, X509Certificate2 leaf)
    {
        X509Chain x509Chain = new X509Chain();
        x509Chain.ChainPolicy.ExtraStore.AddRange(collection);
        bool isValid = x509Chain.Build(leaf); 
    }

但我对构建方法有一些疑问:

  1. 据我了解,该链也是从我的计算机商店构建的,我希望它仅由ExtraStore构建,我该如何定义这种行为?
  2. 我看到链条建成后它不包含根证书;我的问题是为什么,如何验证链是否具有根CA,因为这不是链元素的一部分。
  3. 如果有人能向我解释Build()方法的工作原理,我将非常感激。

2 个答案:

答案 0 :(得分:2)

您应该在Build操作后使用ChainStatus值。 MSDN:

  

X509Chain对象具有名为ChainStatus的全局错误状态,应该用于证书验证。管理证书验证的规则很复杂,通过忽略所涉及的一个或多个元素的错误状态,很容易过度简化验证逻辑。全局错误状态考虑了链中每个元素的状态。

答案 1 :(得分:0)

尝试使用此代码段:

bool chainIsValid = false;

var chain = new X509Chain();
chain.ChainPolicy.RevocationFlag = X509RevocationFlag.ExcludeRoot;
chain.ChainPolicy.RevocationMode = X509RevocationMode.Online;
chain.ChainPolicy.UrlRetrievalTimeout = new TimeSpan(0, 1, 0);
chain.ChainPolicy.VerificationFlags = X509VerificationFlags.NoFlag;

chainIsValid = chain.Build(certificate);