2012-11-16 30 views
2

我必須調用一個需要SSL與客戶端身份驗證的服務。 我有一個p12客戶端證書(私有和公共)和一個公共遠程服務器證書。SSL與證書在Java中工作,但不在C#

Java客戶端: 遠程證書位於jks中,服務正常工作。

C#: 我嘗試用相同的P12進行身份驗證並加載PEM到LocalComputer個人文件夾(從使用keytool的JKS出口),但我有一個例外:

The remote certificate is invalid according to the validation procedure. 

我檢查的細節服務器證書,發現該鏈不能完成;我認爲是因爲證書頒發者的範圍不包含簽名權。

如果這是正確的,爲什麼java正在工作?
如果這不正確,爲什麼C#不工作?
如何強制C#將服務器上的證書視爲有效?
在Windows中,我必須始終通過證書管理單元和LocalComputer等,或者我可以將信任嵌入到我的客戶端應用程序中?

更新:

我已經改變了標題,並刪除了網絡服務標籤,因爲它不是一個Web服務的具體問題,但SSL代替;所以:
標題爲:WS調用與客戶端證書在Java中工作,但不是在C#
標題是現在:SSL在Java工作的證書,但不是在C#

現在,我有我的C#系統通過調用Java應用程序工作,但我不太喜歡它。
我在各種環境中使用相同系統上的相同證書集測試應用程序,並聲明違反信任鏈不允許我的c#客戶端通過SSL連接,但java會忽略它。

所以我的最後一個問題是:在設置SSL連接時,java是否忽略了整個信任鏈的完整性?

+0

我認爲java和C#中的可信證書是不同的。 Java使用自己的證書存儲,它可能需要證書。而C#可能會錯過它。 – gkuzmin

+2

除非Java代碼本身已禁用信任管理(它不應該這樣做),否則Java應該像C#一樣驗證遠程證書。請注意,JRE使用自己的信任存儲區,這可能與C#使用的Windows存儲區不同。您可以驗證服務器配置是否正確。另外,Java 7也可能使用SNI,當您的C#客戶端可能不會(在這種情況下,它會返回一個不同的證書):例如,您可以通過查看與Wireshark的握手來查看。 – Bruno

回答

-1

有發生通常是因爲下面的任一爲真:

  • 證書是自簽名的,而不是作爲受信任的證書。
  • 證書已過期。
  • 證書由您的計算機上未安裝的根證書籤名。
  • 探測到撤銷清單,但無法找到/使​​用。

嘗試獲取有關服務器證書的一些信息,看看是否需要在客戶端上安裝任何特定證書才能使其工作。

+1

證書由根證書籤名,但此根證書不是CA.我如何告訴C#接受它呢?爲什麼java可以避免這種檢查? –