X509Chain.Build()方法说明

RRR*_*RRR 5 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); 
    }
Run Code Online (Sandbox Code Playgroud)

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

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

如果有人可以向我解释该Build()方法的工作原理,我将非常感激。

Met*_*Man 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);
Run Code Online (Sandbox Code Playgroud)

  • 如果您看到第二个问题,则提问者希望根证书成为信任链的一部分。所以“X509ReplicationFlag.ExcludeRoot”是错误的。应使用“X509ReplicationFlag.EntireChain”。 (3认同)