我在使用客户端证书验证HttpWebRequest
时遇到问题。 (未发送客户端证书)。经过一番调查,这似乎是因为证书没有通过验证。
要缩小问题的范围,我正在使用this example from MSDN(它有问题,请参阅此问题的结尾。另请确保您引用了System.Security
)。它告诉我验证失败,因为它无法检查证书的撤销状态(这是有道理的,我们的CA没有启用OCSP)证书将用于脱机部署,因此它永远无法检查无论如何撤销。因此,我想禁用撤销检查。
我修改了以下示例
''~ line 29
ch.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck
ch.ChainPolicy.VerificationFlags =
X509VerificationFlags.IgnoreCertificateAuthorityRevocationUnknown Or
X509VerificationFlags.IgnoreCtlSignerRevocationUnknown Or
X509VerificationFlags.IgnoreEndRevocationUnknown Or
X509VerificationFlags.IgnoreRootRevocationUnknown
ch.Build(certificate)
Console.WriteLine("Chain Information")
Console.WriteLine("Chain revocation flag: {0}", ch.ChainPolicy.RevocationFlag)
...
遗憾的是,我的证书仍未通过验证
Element issuer name: [Obfuscated]
Element certificate valid until: 20/11/2013 17:50:01
Element certificate is valid: False
Element error status length: 0
Element information:
Number of element extensions: 8
请注意,如果没有上面指定的标志,我会得到error status length: 1
64. The revocation function was unable to check revocation for the certificate.
*****
所以,显然标志正在影响某些东西(我不再收到错误),但证书没有通过验证。有人可以解释原因吗?要么我有另一个没有被报告的错误,要么我完全以错误的方式解决这个问题。
* NB: MSDN示例〜第57行中存在一个小错误.for循环应检查element.ChainElementStatus.Length > 0
然后检查For index = 0 To element.ChainElementStatus.Length - 1
。否则,证书仍会失败,但无论使用哪个标志,都不会显示任何原因