2014-02-07 58 views
6

我正在使用SSL握手連接到一個URL。 爲此,我生成了一個.csr文件並對其進行了簽名。 簽訂後我才造就了my.jks文件有3項我們應該將KeyStore和TrustStore指向相同的.jks文件嗎?

  1. 簽名客戶端證書
  2. 私鑰
  3. CA

我用碼頭作爲服務器,我已經專門設置keystore和truststore到這樣的jks文件

-Djavax.net.ssl.keyStore=/home/keystore/my.jks 
-Djavax.net.ssl.keyStorePassword=changeit 
-Djavax.net.ssl.trustStore=/home/keystore/my.jks 
-Djavax.net.ssl.trustStorePassword=changeit 

它工作正常。但是這是否正確嗎? 我以爲密鑰庫應該包含客戶端證書和私鑰,而信任庫應該包含CA.但是,當我嘗試這樣做,然後我得到以下錯誤。

「javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException:PKIX路徑建設失敗: sun.security.provider.certpath.SunCertPathBuilderException:無法找到 有效證明路徑請求的目標「

請對此提出建議。

+0

也許將此問題遷移到http://security.stackexchange.com/? – BadSkillz

+0

從您的描述中不清楚究竟是什麼導致該異常。在啓動過程中嗎?在連接到URL時?多一點上下文是必要的。 – laz

+0

@laz是的,它正在建立連接。 –

回答

3

不。信任庫僅包含公共數據:您信任的CA的公共證書。 KeyStore包含一個私鑰和它的證書:您的數字身份。他們甚至可能被不同的人控制。不要混淆他們的功能。

+0

所以,你的意思是說我們應該將CA保存在Truststore中,並且我們需要將密鑰和私鑰保存在Keystore中?是對的嗎? –

+0

我並不熱衷於這樣的遊戲,所以你的意思是說。這就是我*說。* – EJP

+0

當我做你說什麼,然後我得到「握手例外」。這在我的問題中提到。對此有何建議? –

0

對於你的問題的第一部分,我認爲this answer涵蓋了很多。總之,是的,你可以指向同一個文件,不,這不是最佳實踐。至於出現的錯誤,有很多原因可能發生,但是您可以嘗試將CA從JAVA_HOME/jre/lib/security添加到cacerts文件。這使它可用於所有JAVA應用程序。

+0

要清楚的是,@布魯諾的答案你實際上並不支持你的答案是'是'。 – EJP

+0

他的回答的最後一部分:在某些情況下,他們可以是同一家商店,但使用不同商店通常更好(尤其是基於文件的商店)。告訴我你可以將兩者都放在一個文件中,但這不是最佳做法。 – BadSkillz

0

如果您想自簽署證書(僅當您將使用它爲服務器內通信,無需任何個人/敏感信息的交換):使用-certreq

1)生成CSR

keytool -certreq -alias keyAlias -keystore locationPk -storepass yourpass -file myowncertrequest.csr

2)使用上面的CSR生成證書:

keytool -gencert -infile myowncertrequest.csr -alias keyAlias -keystore locationPk -storepass yourpass -outfile myownsignedcert.cer

3)導入到一個「單獨的」信任存儲

keytool -import -trustcacerts -alias myown -file myownsignedcert.cer -keystore intra_server_truststore -storepass goodpassword

這將創建一個將只有你自己的領域內和一些基本的身份驗證和數據交換中使用自定義的信任庫這一點。但是,如果將服務暴露給外部世界,請使用適當的CA來簽署這些證書。

相關問題