Sch*_*dtA 2 c# certificate verify certificate-revocation x509certificate2
我尝试使用 X509Certificate2.Verify() 函数来检查证书链是否有效。\nVerify 函数返回 false,ChainElementStatus 返回“ReitationStatusUnknown”。
\n\n有没有一种方法可以使用Verify功能而不检查RevitationStatus?在没有互联网连接的情况下无法检查撤销状态吗?是否有其他函数可以在没有 ReplicationStatus 的情况下检查链和证书?
\n\n一个肮脏的解决方案是检查 RevitationStatus 是否是 element.ChainElementStatus 中的唯一元素。
\n\n我已经使用 X509RevocableMode.Offline 和 IgnoreCertificateAuthorityReplicationUnknown。
\n\n代码来自:X509Certificate2.Verify() 方法对于有效证书始终返回 false
\n\nX509Chain ch = new X509Chain();\n\nch.Build(certificate);\n\nch.ChainPolicy.RevocationMode = X509RevocationMode.Offline;\nch.ChainPolicy.VerificationFlags = X509VerificationFlags.IgnoreCertificateAuthorityRevocationUnknown;\n\nConsole.WriteLine("Chain Information");\nConsole.WriteLine("Chain revocation flag: {0}", ch.ChainPolicy.RevocationFlag);\n\nConsole.WriteLine("Chain revocation mode: {0}", ch.ChainPolicy.RevocationMode);\nConsole.WriteLine("Chain verification flag: {0}", ch.ChainPolicy.VerificationFlags);\nConsole.WriteLine("Chain verification time: {0}", ch.ChainPolicy.VerificationTime);\nConsole.WriteLine("Chain status length: {0}", ch.ChainStatus.Length);\nConsole.WriteLine("Chain application policy count: {0}", ch.ChainPolicy.ApplicationPolicy.Count);\nConsole.WriteLine("Chain certificate policy count: {0} {1}", ch.ChainPolicy.CertificatePolicy.Count, Environment.NewLine);\n\n//Output chain element information.\nConsole.WriteLine("Chain Element Information");\nConsole.WriteLine("Number of chain elements: {0}", ch.ChainElements.Count);\nConsole.WriteLine("Chain elements synchronized? {0} {1}", ch.ChainElements.IsSynchronized, Environment.NewLine);\n\nforeach (X509ChainElement element in ch.ChainElements)\n{\nConsole.WriteLine("Element issuer name: {0}", element.Certificate.Issuer);\nConsole.WriteLine("Element certificate valid until: {0}", element.Certificate.NotAfter);\nConsole.WriteLine("Element certificate is valid: {0}", element.Certificate.Verify());\nConsole.WriteLine("Element error status length: {0}", element.ChainElementStatus.Length);\nConsole.WriteLine("Element information: {0}", element.Information);\nConsole.WriteLine("Number of element extensions: {0}{1}", element.Certificate.Extensions.Count, Environment.NewLine);\n\n if (ch.ChainStatus.Length >= 1)\n {\n for (int index = 0; index < element.ChainElementStatus.Length; index++)\n {\n Console.WriteLine(element.ChainElementStatus[index].Status);\n Console.WriteLine(element.ChainElementStatus[index].StatusInformation);\n }\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n结果:
\n\n链信息\n链吊销标志: ExcludeRoot\n链吊销模式: 离线\n链验证标志: IgnoreCertificateAuthorityReplicationUnknown\n链验证时间: 19.11.2018 07:53:31\n链状态长度: 1\n链申请策略计数: 0\n链证书策略计数:0
\n\n链元素信息\n链元素数量:2\n链元素已同步?错误的
\n\n元素颁发者名称: CN=TestRootCA\n元素证书有效期至: 01.01.2019 00:00:00\n元素证书有效: False\n元素错误状态长度: 1\n元素信息: \n元素扩展数量: 5
\n\nReplicationStatusUnknown\n与 Sperrpr\xc3\xbcfung f\xc3\xbcr das Zertifikat durchf\xc3\xbchren 相关的 Sperrfunktion。
\n\n元素颁发者名称: CN=TestRootCA\n元素证书有效期至: 01.01.2019 00:00:00\n元素证书有效: True\n元素错误状态长度: 0\n元素信息: \n元素扩展数量: 2
\n我已经使用 X509RevocableMode.Offline 和 IgnoreCertificateAuthorityReplicationUnknown。
IgnoreCertificateAuthorityReplicationUnknown 的意思是“不要因此而chain.Build返回”。false
当然,你是在调用chain.Build之后设置的,并且没有检查chain.Build的返回值。
如果您想忽略吊销,请设置ChainPolicy.RevocationMode为X509RevocationMode.NoCheck。如果您希望检查它是否已缓存,如果没有缓存则忽略它,则将模式设置为 Offline 并断言所有 ReplicationUnknown 标志即可执行此操作。
如果证书/链通过了所有未通过 VerificationFlags 值标记为忽略的有效性检查,则 chain.Build 的布尔返回值为 true。
所以最短的“告诉我这个证书是否没有过期,有一个可解析的链,链的终点是我信任的,我不关心吊销”是
using (X509Chain ch = new X509Chain())
{
ch.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck;
return ch.Build(certificate);
}
Run Code Online (Sandbox Code Playgroud)
机会主义撤销将是
using (X509Chain ch = new X509Chain())
{
ch.ChainPolicy.RevocationMode = X509RevocationMode.Offline;
ch.ChainPolicy.VerificationFlags =
X509VerificationFlags.IgnoreEndRevocationUnknown |
X509VerificationFlags.IgnoreCertificateAuthorityRevocationUnknown |
X509VerificationFlags.IgnoreRootRevocationUnknown;
return ch.Build(certificate);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3045 次 |
| 最近记录: |