基於信息here和here,我確定了以下內容:
- 理想的情況下,我們應該檢查證書吊銷,然而,這是不平凡的,似乎是不值得
- 在最低限度我們可以檢查證書是最新的並且鏈是可信的
- 如果我們希望我們也可以驗證應用程序特定的東西,例如證書是否自簽名等
舉個簡單的例子,我們可以使用單聲道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
)。
據我所見,這是一個很好的基本解決方案。
這裏有一個體面的解釋:http://stackoverflow.com/questions/7331666/c-sharp-how-can-i-validate-a-root-ca-cert-certificate-x509-chain。基本上,使用X509Chain,把你所有的證書放進去,然後建立連鎖。如果需要,您甚至可以選擇禁用某些驗證步驟。 – mbarthelemy
謝謝。我正在添加我的最終解決方案作爲答案。 – TheNextman