我必須在非瀏覽器應用程序中驗證應在IOS,Android和Linux上運行的HttpRequests
和websocket
連接的幾個SSL證書。 當通過HTTPS
發生連接時,我收到一個X509Certificate2
對象數組,其中最底層的是服務器證書,最頂層的是根CA(希望)。作爲一個例子,當我連接到https://google.com
我接收3 X509Certificate2
具有以下SubjectName.Name
:如何在Mono和多個平臺上使用X509Certificate2正確驗證SSL證書
- 0:
"CN=google.com, O=Google Inc, L=Mountain View, S=California, C=US"
- 1:
"CN=Google Internet Authority G2, O=Google Inc, C=US"
- 2:
"CN=GeoTrust Global CA, O=GeoTrust Inc., C=US"
我現在需要驗證具有給定信息的證書驗證和以下驗證:
- 鏈方面的信任驗證
- 主機名驗證
- 證書撤銷驗證
我試過和不被理解和失敗:
當我調用X509Certificate2.Verify()
方法對每個證書它每次都獨立返回false
。我也不明白爲什麼它可以返回任何其他東西,然後false
因爲驗證獨立發生。相反,只要我理解了理論,就應該檢查完整的鏈,即所有證書。
然後我用了X509Chain
類:
foreach (X509Certificate2 cert in allthreecerts)
{
X509Chain chain = new X509Chain();
X509ChainPolicy chainPolicy = new X509ChainPolicy()
{
RevocationMode = X509RevocationMode.Offline,
RevocationFlag = X509RevocationFlag.EntireChain
};
chain.ChainPolicy = chainPolicy;
if (!chain.Build(cert))
{
foreach (X509ChainElement chainElement in chain.ChainElements)
{
foreach (X509ChainStatus chainStatus in chainElement.ChainElementStatus)
{
Debug.WriteLine(chainStatus.StatusInformation);
}
}
}
}
此打印出RevocationStatusUnknown
和OfflineRevocation
爲每個證書。
再一次,我不明白爲什麼這應該工作,因爲一個鏈獨立建立每個證書。不應該將父證書作爲子證書頒發給所有根CA?
我認爲我需要某種方式,但不知道如何。
爲了驗證證書吊銷,所有客戶端都需要提供證書吊銷列表。我在哪裏可以得到這樣的清單,並在哪裏加載它並告訴鏈條使用這個本地清單?
同樣的問題是信任鏈驗證,因爲上次認證應該是根認證,並且必須是客戶端可信根CA之一。因此,我必須加載,例如,隨Firefox附帶的所有根CA,並檢查根CA是否是其中之一?什麼是最好的方式來做到這一點?
[更新] 我在google.com
示例中複製粘貼錯誤,我粘貼了兩個相同的證書主題名稱。
'RevocationMode = X509RevocationMode.Offline' - 將其切換爲'Online'。客戶端必須具有本地CRL/OCSP高速緩存才能在脫機模式下成功驗證撤銷。 – Crypt32
那麼這就是關鍵。我正在實施「客戶」。那麼如何提供這樣的CRL。這是我問的問題。 – zlZimon
CRL從在線資源中檢索。 CRL位置在CRL分發點證書擴展中指定。或者在「管理信息訪問」擴展中的「在線證書狀態協議」部分。 – Crypt32