2017-01-23 91 views
0

我創建這樣的證書請求:X509Chain.Build()成功撤銷證書。 C#

certreq -new req.inf req-Revoked.req 
certreq -submit -attrib "SAN:[email protected]&[email protected]" -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。但是,由於證書被撤銷,它應該是假的!我仔細檢查了證書是否被吊銷,並且序列號在服務器管理器中列在撤銷證書下。我仔細檢查了CURL分發點URL在服務器和證書請求上是否匹配。 (他們是LDAP網址)。 CertUtil將中間.cer文件視爲已撤銷。但上面的C#代碼沒有。

這一切都在原始CA過期之前就起作用了,並且IT使用新的證書重建了我的測試機器。我已經使用新的CA重新生成了證書,並且每個單元測試都再次運行,除了處理撤銷的單元之外。已過期的證書按預期工作,但未撤銷證書。

我不知道下一步該做什麼,並且希望得到一些幫助。謝謝!

+0

我也通過服務器管理器發佈了CURL。 – ChopperCharles

回答

0

原來問題是一個名爲Tumbleweed的應用程序。它安裝在服務器上,並攔截了所有吊銷請求。禁用Tumbleweed服務完全解決了我的問題。

Charles。

0

鏈只是一個證書列表,從您提供的證書開始,一直到根證書。它是由任何可以找到的證書構成的 - 即使它們已經過時,無效或被撤銷。

你想要做的是驗證鏈。使用chain.ChainStatus。

MSDN docs: X509Chain對象具有全局錯誤狀態,稱爲ChainStatus,應用於證書驗證。管理證書驗證的規則很複雜,並且很容易通過忽略所涉及的一個或多個元素的錯誤狀態來簡化驗證邏輯。全局錯誤狀態會考慮鏈中每個元素的狀態。