2013-12-03 96 views
3

我們的應用程序當前使用openssl(http://www.openssl.org/docs/crypto/X509_verify_cert.html)在非託管代碼中驗證服務器證書。我們正在將其轉換爲託管代碼。我將X509證書編入托管端,但如何在C#中驗證該證書?驗證Mono(OS X信任根)上的x509證書

a)是否有一種簡單的方法來針對當前安裝的受信任的根驗證該證書?

b)如果不是,手動過程是什麼驗證?它是否記錄在某處?

我已經探索了Mono.Security.X509中的類,它使我可以使用證書和存儲的工具,但是我無法連接點。


編輯我在下面添加了我的最終解決方案。我希望進一步的反饋意見。

+1

這裏有一個體面的解釋:http://stackoverflow.com/questions/7331666/c-sharp-how-can-i-validate-a-root-ca-cert-certificate-x509-chain。基本上,使用X509Chain,把你所有的證書放進去,然後建立連鎖。如果需要,您甚至可以選擇禁用某些驗證步驟。 – mbarthelemy

+0

謝謝。我正在添加我的最終解決方案作爲答案。 – TheNextman

回答

5

基於信息herehere,我確定了以下內容:

  • 理想的情況下,我們應該檢查證書吊銷,然而,這是不平凡的,似乎是不值得
  • 在最低限度我們可以檢查證書是最新的並且鏈是可信的
  • 如果我們希望我們也可以驗證應用程序特定的東西,例如證書是否自簽名等

舉個簡單的例子,我們可以使用單聲道X509Chain建立一個證書鏈並驗證它針對用戶的信賴根:

var x509 = new Mono.Security.X509.X509Certificate(certificateBytes); 
var chain = new Mono.Security.X509.X509Chain(); 
bool certificateStatus = chain.Build(x509); 

從檢查單源,我可以看到,這個檢查的信任證書鏈以及證書上的日期。但是,證書吊銷尚未實施。

我們還檢查證書上的名稱是否與用戶連接到的主機的名稱相匹配。在.NET框架爲我們提供了一種簡單的方法來獲取信息:

var x5092 = new System.Security.Cryptography.X509Certificates.X509Certificate2(certificateBytes); 
string hostName = x5092.GetNameInfo(System.Security.Cryptography.X509Certificates.X509NameType.DnsName, false); 
bool hostNameMatch = string.Compare(hostName, this.Server, true) == 0; 

證書也可以有應檢查替代名稱,但使用X509NameType.DnsAlternativeName似乎並沒有要在單聲道實現(這是硬編碼返回string.Empty)。

據我所見,這是一個很好的基本解決方案。