2012-07-19 145 views
4

我正在C#中開發一個應用程序,它將通過HTTP和SSL與服務器進行通信。有什麼方法可以讓程序信任服務器提供的證書?此證書將與軟件一起分發,以便它可以識別服務器而不涉及外部CA.手動信任C#中的SSL證書#

說明:我希望我的客戶端應用程序信任已在客戶端進行硬編碼的單個證書,以便它只會信任我自己的服務器。

+0

您是否想要信任每個證書(繞過證書的證書,也就是使用您自己的CA的未完全簽名的證書)或某些特定證書? – 2012-07-19 12:03:18

+0

這個問題 - http://stackoverflow.com/questions/7485313/check-self-signed-certificate-ssl-c - 應該可以幫助你開始? – 2012-07-19 12:03:27

+0

@ J.Steen這就是我想過的,並添加了我的評論 - 也許他想要驗證特定的.. – 2012-07-19 12:04:10

回答

1

您可以使用BouncyCastle。

  1. 使用FromX509Certificate(X509Certificate)功能
  2. 負載從服務器證書分爲公元前公共密鑰加載了CA證書到BC usign DotNetUtilities類。
  3. 的服務器證書公鑰

這樣你檢查證書的簽名呼叫Verify。哪一種方法最安全?並且還可以在不更新客戶端的情況下更新服務器證書。 (只要CA是有效的偏離方向)的

來源驗證此:http://www.bouncycastle.org/viewcvs/viewcvs.cgi/csharp/crypto/src/x509/X509Certificate.cs?view=markup線:540

+0

所以我仍然需要一個適當的CA證書? – 2012-07-19 16:10:59

+0

沒有任何證書在客戶端用於驗證服務器證書的證書進行驗證。所以一個自制的CA就足夠了。 – albertjan 2012-07-19 16:30:43

0

在我看來,我不認爲你可以做到這一點,相信你有足夠的安全通道。如果我錯了,有人會糾正我,但SSL中的CA信任鏈不僅僅用於驗證指紋是否是特定值(或證書的其他部分)。它證明客戶端正在與正確的服務器通信(由於共享CA密鑰)。 This illustration是一個很好的參考。跳過第3步,將不允許服務器向客戶端證明其身份(拋出證書驗證)。

so that it will only ever trust my own server

SSL保證這通過使用共享的CA證書(如Verisign等)。也許我不明白你爲什麼要選擇不是因爲它的意圖使用SSL。

編輯: 作爲the_ajp指出在他的回答中,有庫(比如充氣城堡),將做證書鏈的全面覈查。這些可以手動調用。

+0

第4步「證明服務器身份」只是比較comonname和dnsname而已。 – albertjan 2012-07-19 14:28:45

+0

@the_ajp是的,抱歉,看着那張圖很困惑。我的意思是第3步。我編輯了我的答案。 – 2012-07-19 15:29:03

+0

這就是我在我的回答中描述的步驟:) – albertjan 2012-07-19 16:08:03