Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# X509Chain.Build()方法说明_C#_Certificate_X509certificate2 - Fatal编程技术网

C# X509Chain.Build()方法说明

C# X509Chain.Build()方法说明,c#,certificate,x509certificate2,C#,Certificate,X509certificate2,我想验证证书链,我得到一个X509Certificate2集合,并且必须验证是否所有证书都构建了一个链 通常,为了验证证书链,我应该从叶证书中获取数字签名,并检查它是否由根证书签名-,但在.NET中,我找不到从X509Certificate2对象提取签名的方法 因此,我考虑按以下方式使用X509Chain.Build()方法: void ValidateChain(X509Certificate2Collection collection, X509Certificate2 leaf)

我想验证证书链,我得到一个
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); 
    }
但我对构建方法有一些疑问:

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

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

    请尝试以下代码片段:

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

    您应该在生成操作之后使用CHAINESTATUS值。MSDN:

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


    如果您看到第二个问题,提问者希望根证书成为信任链的一部分。因此
    X509RevocationFlag.ExcludeRoot
    是错误的<代码>X509RevocationFlag。应使用EntireChain
    。找到解决方案了吗?