C#X509Certificate2。无需吊销测试即可验证

时间:2018-11-19 07:09:36

标签: c# certificate x509certificate2 verify certificate-revocation

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

有没有一种方法可以在不检查RevocationStatus的情况下使用Verify函数?没有互联网连接就无法检查RevocationStatus吗?还有其他功能可以在RevocationStatus之外检查链和证书吗?

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

我已经使用X509RevocationMode.Offline和IgnoreCertificateAuthorityRevocationUnknown。

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

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 元素证书有效:False 元素错误状态长度:1 元素信息: 元素扩展数:5

RevocationStatusUnknown Die Sperrfunktion konnte keineSperrprüfungfürdas Zertifikatdurchführen。

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

1 个答案:

答案 0 :(得分:0)

  

我已经使用X509RevocationMode.Offline和IgnoreCertificateAuthorityRevocationUnknown。

IgnoreCertificateAuthorityRevocationUnknown的意思是“由于这个原因,不要使chain.Build返回false。”

当然,您可以在调用chain.Build之后进行设置,而无需检查chain.Build的返回值。

如果要忽略撤销,请将ChainPolicy.RevocationMode设置为X509RevocationMode.NoCheck。如果要检查它是否已经缓存,如果不想缓存,则将其忽略,然后将模式设置为“脱机”并声明所有RevocationUnknown标志即可。

如果证书/链通过了所有未通过VerificationFlags值标记为忽略的有效性检查,则来自chain.Build的布尔返回为true。

最简短的“告诉我此证书是否未过期,具有可解决的链,该链的末端是我信任的东西,并且我不在乎吊销”

using (X509Chain ch = new X509Chain())
{
    ch.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck;

    return ch.Build(certificate);
}

机会性撤销

using (X509Chain ch = new X509Chain())
{
    ch.ChainPolicy.RevocationMode = X509RevocationMode.Offline;
    ch.ChainPolicy.VerificationFlags =
        X509VerificationFlags.IgnoreEndRevocationUnknown |
        X509VerificationFlags.IgnoreCertificateAuthorityRevocationUnknown |
        X509VerificationFlags.IgnoreRootRevocationUnknown;

    return ch.Build(certificate);
}