2017-06-02 92 views
0

我目前正致力於使用HTTPS優化相互驗證的客戶端/服務器應用程序之間的通信。我目前正在將驗證邏輯構建到C#客戶端中,以幫助識別TLS連接失敗時的配置問題。在驗證連接時,我驗證服務器提供的根CA證書安裝在客戶端,相應的存儲區中並且有效。我正在使用X509Store來拉動X509Certificate2,並使用X509Chain進行驗證。使用C#,如何以編程方式確定Windows證書存儲區中的證書是否已被禁用

我的問題是即使證書已通過MMC禁用,證書也會報告爲有效。因此,儘管鏈式報告是有效的,但TLS連接將失敗。

Certificate Properties

這是一個不太可能的情況下,只有一個我想通過報告類似處理「無法連接,因爲根CA被禁用。」

任何人都可以指向一個.NET或Win32調用的方向來確定證書的「證書目的」值嗎?或者閱讀證書的「證書狀態」?

Certificate Status

我通過什麼在System.Security.Cryptography命名空間MSDN上市閱讀,並開始尋找到的CryptoAPI和CNG,但至今沒有發現任何東西。

謝謝!

回答

0

該對話框沒有「禁用」證書,因此「出於所有目的」禁用了該證書。這意味着它爲了EKU驗證的目的而被視爲具有空的增強型密鑰用法擴展。

通常情況下,根證書(或中間CA證書)不會有EKU擴展名,所以如果使用任何ApplicationPolicy值進行鏈構建,它將會匹配。一旦你將其設置爲禁用的所有目的,你會得到一個鏈錯誤X509ChainStatusFlags.NotValidForUsage

如果你想建立的東西用於驗證TLS你檢查服務器身份驗證或客戶端身份驗證EKUs(取決於你檢查什麼):

// Server EKU or Client EKU 
Oid eku = forServer ? new Oid("1.3.6.1.5.5.7.3.1") : new Oid("1.3.6.1.5.5.7.3.2"); 

// Test if it's valid for that purpose 
chain.ChainPolicy.ApplicationPolicy.Add(eku); 

如果您想爲「Disable」一根CA,將證書的副本添加到不允許的存儲區(在UI中稱爲「不可信證書」)。這將導致鏈式生產X509ChainStatusFlags.ExplicitDistrust

+0

傑出!感謝您的詳細解釋。由於我正在檢查根CA,而不是SSL證書本身,所以它沒有EKU擴展名(完全如您所說)。然而,將「Key Usage」(2.5.29.15)的oid添加到ApplicationPolicy中就像一個魅力。 –

+0

我會說這是不可行的解決方案。事實上,並非所有瀏覽器都要求完整鏈對指定用途有效,並且僅在葉證書僅具有期望的用途時才檢查。如果你想通過屬性獲得根CA證書使用 - 請檢查它。因爲在中級CA級別禁止使用時可能會出現這種情況。結果,根CA可以,但代碼將失敗,而連接正常工作。 – Crypt32

+0

@ crypt32 EKU必須是一個合適的子集。如果中間塊阻止EKU,葉子不能擁有它。他說他用於檢查的關鍵用法是無關緊要的,因爲它要求從EKU設置它的OID永遠不會打,但是當沒有EKU存在時將被允許。 – bartonjs

相關問題