首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# X 509认证2.验证不撤销测试

C# X 509认证2.验证不撤销测试
EN

Stack Overflow用户
提问于 2018-11-19 07:09:35
回答 1查看 2.4K关注 0票数 2

我尝试使用X509Certificate2.Verify()函数来检查证书链是否有效。验证函数返回false,ChainElementStatus返回"RevocationStatusUnknown“。

是否有一种不用对RevocationStatus进行检查而使用验证函数的方法?没有互联网连接就不能检查RevocationStatus?是否还有其他函数来检查RevocationStatus的链和证书?

一个肮脏的解决方案是检查RevocationStatus是否是element.ChainElementStatus中的唯一元素。

我已经使用了X509RevocationMode.Offline和IgnoreCertificateAuthorityRevocationUnknown。

代码来自:X509Certificate2.Verify() method always return false for the valid certificate

代码语言:javascript
复制
X509Chain ch = new X509Chain();

ch.Build(certificate);

ch.ChainPolicy.RevocationMode = X509RevocationMode.Offline;
ch.ChainPolicy.VerificationFlags = X509VerificationFlags.IgnoreCertificateAuthorityRevocationUnknown;

Console.WriteLine("Chain Information");
Console.WriteLine("Chain revocation flag: {0}", ch.ChainPolicy.RevocationFlag);

Console.WriteLine("Chain revocation mode: {0}", ch.ChainPolicy.RevocationMode);
Console.WriteLine("Chain verification flag: {0}", ch.ChainPolicy.VerificationFlags);
Console.WriteLine("Chain verification time: {0}", ch.ChainPolicy.VerificationTime);
Console.WriteLine("Chain status length: {0}", ch.ChainStatus.Length);
Console.WriteLine("Chain application policy count: {0}", ch.ChainPolicy.ApplicationPolicy.Count);
Console.WriteLine("Chain certificate policy count: {0} {1}", ch.ChainPolicy.CertificatePolicy.Count, Environment.NewLine);

//Output chain element information.
Console.WriteLine("Chain Element Information");
Console.WriteLine("Number of chain elements: {0}", ch.ChainElements.Count);
Console.WriteLine("Chain elements synchronized? {0} {1}", ch.ChainElements.IsSynchronized, Environment.NewLine);

foreach (X509ChainElement element in ch.ChainElements)
{
Console.WriteLine("Element issuer name: {0}", element.Certificate.Issuer);
Console.WriteLine("Element certificate valid until: {0}", element.Certificate.NotAfter);
Console.WriteLine("Element certificate is valid: {0}", element.Certificate.Verify());
Console.WriteLine("Element error status length: {0}", element.ChainElementStatus.Length);
Console.WriteLine("Element information: {0}", element.Information);
Console.WriteLine("Number of element extensions: {0}{1}", element.Certificate.Extensions.Count, Environment.NewLine);

    if (ch.ChainStatus.Length >= 1)
    {
        for (int index = 0; index < element.ChainElementStatus.Length; index++)
        {
            Console.WriteLine(element.ChainElementStatus[index].Status);
            Console.WriteLine(element.ChainElementStatus[index].StatusInformation);
        }
    }
}

结果:

链信息链撤销标志: ExcludeRoot链撤销模式:脱机链验证标志: IgnoreCertificateAuthorityRevocationUnknown链验证时间: 19.11.2018 07:53:31链状态长度:1链应用程序策略计数:0链证书策略计数:0

链元信息链元数:2个链元同步?错误

元素颁发者名称: CN=TestRootCA元素证书有效期为: 01.01.2019 00:00:00 :00元素证书有效: False元素错误状态长度:1元素信息:元素扩展名:5

RevocationStatusUnknown Die konnte keine Sperrprüfungür das Zertifikat durchführen。

元素颁发者名称: CN=TestRootCA元素证书有效期为: 01.01.2019 00:00:00 :00元素证书有效:真元素错误状态长度:0元素信息:元素扩展名:2

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-19 16:03:19

我已经使用了X509RevocationMode.Offline和IgnoreCertificateAuthorityRevocationUnknown。

IgnoreCertificateAuthorityRevocationUnknown的意思是“不要为此原因使chain.Build返回false”。

当然,您在调用chain.Build之后设置了它,并且没有检查来自chain.Build的返回值。

如果要忽略吊销,请将ChainPolicy.RevocationMode设置为X509RevocationMode.NoCheck。如果希望检查它是否已经缓存,如果不缓存,则忽略它,然后将模式设置为脱机并断言所有RevocationUnknown标志。

如果证书/链通过了所有未通过VerificationFlags值标记为忽略的有效性检查,则从VerificationFlags返回的布尔值为真。

所以最短的“告诉我如果这个证书没有过期,有一个可解决的链,链的终端是我信任的东西,我不关心撤销”是

代码语言:javascript
复制
using (X509Chain ch = new X509Chain())
{
    ch.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck;

    return ch.Build(certificate);
}

机会主义撤销

代码语言:javascript
复制
using (X509Chain ch = new X509Chain())
{
    ch.ChainPolicy.RevocationMode = X509RevocationMode.Offline;
    ch.ChainPolicy.VerificationFlags =
        X509VerificationFlags.IgnoreEndRevocationUnknown |
        X509VerificationFlags.IgnoreCertificateAuthorityRevocationUnknown |
        X509VerificationFlags.IgnoreRootRevocationUnknown;

    return ch.Build(certificate);
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53369841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档