【问题标题】:X509Chain.Build() method explanationX509Chain.Build() 方法说明
【发布时间】:2011-12-24 08:20:08
【问题描述】:

我想验证证书链,我得到了一个 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,因为这不是链元素的一部分。

如果有人能向我解释Build() 方法的工作原理,我将不胜感激。

【问题讨论】:

  • 您找到解决方案了吗?

标签: c# certificate x509certificate2


【解决方案1】:

试试这个代码sn-p out:

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

【讨论】:

  • 如果您看到第二个问题,提问者希望根证书成为信任链的一部分。所以X509RevocationFlag.ExcludeRoot 是错误的。应该使用X509RevocationFlag.EntireChain
【解决方案2】:

您应该在构建操作之后使用 ChainStatus 值。 MSDN参考here

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

【讨论】:

    猜你喜欢
    • 2020-10-31
    • 2013-11-10
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    • 2011-06-22
    • 2012-09-06
    相关资源
    最近更新 更多