0

我创建一个这样的证书请求:

certreq -new req.inf req-Revoked.req
certreq -submit -attrib "SAN:email=ttesting@Test.Domain&upn=1234567890@Test.Domain" -config Win2K8-64\Test-Win2K8-64-CA req-Revoked.req testerCert-Revoked.cer
certreq -accept testerCert-Revoked.cer
CertUtil -f -p testerCert -exportPFX -user My Testing.Tester.T.1234567890 testerCert-Revoked.pfx
CertUtil -delstore -user My Testing.Tester.T.1234567890

然后我通过以下方式撤销它:

CertUtil -revoke <SerialNumber_from_above_Cert>

然后我执行这段代码:

X509Certificate2 certificate = GetCertificate("testerCert-Revoked.pfx", "password"); // helper method loads the pfx from a file
X509Chain chain = new X509Chain();
chain.ChainPolicy.RevocationFlag = X509RevocationFlag.ExcludeRoot;
chain.ChainPolicy.RevocationMode = X509RevocationMode.Online;
chain.ChainPolicy.VerificationTime = DateTime.Now;
chain.ChainPolicy.UrlRetrievalTimeout = new TimeSpan(0, 0, 0);
chain.ChainPolicy.VerificationFlags = X509VerificationFlags.NoFlag;

if (!chain.Build(certificate))
{
  errorBuffer.Append("Could not build X.509 certificate chain:\r\n");
  foreach (X509ChainStatus status in chain.ChainStatus)
  {
    errorBuffer.AppendFormat("  - {0}\r\n", status.StatusInformation);
  }
  throw new CryptographicException(errorBuffer.ToString());
}

chain.Build() 总是返回 true。但是既然证书被吊销了,那应该是False!我仔细检查了证书是否已被吊销,并且序列号是否列在服务器管理器中的吊销证书下。我已经仔细检查了服务器上的 CURL 分发点 url 和证书请求是否匹配。(它们是 LDAP 网址)。CertUtil 将中间 .cer 文件视为已撤销。但上面的 C# 代码没有。

这一切都在原始 CA 过期之前有效,IT 使用新证书重建了我的测试机器。我已经使用新的 CA 重新生成了证书,并且每个单元测试都再次工作,除了那些处理撤销的单元测试。过期的证书按预期工作,但未撤销的证书。

我不知道下一步该怎么做才能让这段代码再次工作,并希望得到一些帮助。谢谢!

4

2 回答 2

1

原来问题出在一个名为 Tumbleweed 的应用程序上。它安装在服务器上,并正在拦截所有撤销请求。禁用 Tumbleweed 服务完全解决了我的问题。

查尔斯。

于 2017-07-13T22:09:50.123 回答
-1

该链只是一个证书列表,从您提供的证书开始,一直到根证书。它建立在任何可以找到的证书之上——即使它们已经过时、无效或被撤销。

您要做的是验证链。为此使用chain.ChainStatus。

来自MSDN 文档:X509Chain 对象有一个名为 ChainStatus 的全局错误状态,应该用于证书验证。管理证书验证的规则很复杂,很容易通过忽略所涉及的一个或多个元素的错误状态来过度简化验证逻辑。全局错误状态考虑了链中每个元素的状态。

于 2017-07-12T21:50:12.537 回答