X509Chain.Build()方法解释

11

我想验证证书链,我获取了一个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); 
    }

但是我有一些关于build方法的问题:

  1. 据我所知,该链也是从我的计算机商店构建的,而我希望它只从ExtraStore中构建,我该如何定义这种行为?
  2. 我看到在链构建之后它不包含根证书;我的问题是为什么,以及如何验证链是否具有根CA,因为这不是链元素的一部分。

如果有人能解释一下Build()方法的工作原理,我会非常感激。


你找到解决方案了吗? - ArielB
2个回答

4
在Build操作之后,您应该使用ChainStatus值。 MSDN参考在此处
X509Chain对象具有一个名为ChainStatus的全局错误状态,应用于证书验证。证书验证的规则很复杂,忽略一个或多个元素的错误状态会导致验证逻辑过于简单化。全局错误状态考虑了链中每个元素的状态。

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);

3
如果您看到第二个问题,提问者希望根证书成为信任链的一部分。因此,X509RevocationFlag.ExcludeRoot 是错误的。应该使用 X509RevocationFlag.EntireChain - Learner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接