2010-04-21 114 views
20

我使用openssl生成認證密鑰。這是我的命令:Java密鑰庫是否可以導入由OpenSSL生成的密鑰對?

openssl genrsa -des3 -out enc_key.pem 1024

我導出爲CER文件,然後用java的keytool我導入到Java密鑰庫(JKS)。

keystore聽起來不錯。我可以從我的Java應用程序加載密鑰庫。

問題是,當客戶端連接到服務器(在這種情況下是FTP服務器,而不是Web服務器,我使用Apache米娜)時,出現異常:

javax.net.ssl.SSLHandshakeException: SSL handshake failed. at org.apache.mina.filter.ssl.SslFilter.messageReceived(SslFilter.java:433) at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:434) at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$5(DefaultIoFilterChain.java:429)

...

Caused by: javax.net.ssl.SSLHandshakeException: no cipher suites in common at com.sun.net.ssl.internal.ssl.Handshaker.checkThrown(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLEngineImpl.checkTaskThrown(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLEngineImpl.writeAppRecord(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLEngineImpl.wrap(Unknown Source) at javax.net.ssl.SSLEngine.wrap(Unknown Source)

...

Caused by: javax.net.ssl.SSLHandshakeException: no cipher suites in common at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLEngineImpl.fatal(Unknown Source)

有,我要問的幾件事情:

  1. 我用openssl生成的認證密碼是什麼?我們怎麼知道?也許通過命令行openssl xxx?
  2. 我去http://java.sun.com/j2se/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#AppA。我把SSL_RSA_xxx設置爲啓用密碼套件,但仍然無法工作(我把SSL_RSA,因爲它使用ssl implisit和genrsa,只是我認爲genrsa是生成RSA)。這是對的嗎?
  3. 有人知道解決方案嗎?
  4. 或者,任何人都知道如何從openssl命令行生成標準密鑰庫,直到可以在java應用程序中使用(偏離密碼)。因爲現在我可以從openssl和export keystore java生成認證,但是我不知道我使用的密碼是什麼以及我在java應用程序中如何使用。注意:如果keystore是直接從java生成的,我可以運行。現在的問題是,如果密鑰庫由java keytool從認證中生成,如openssl(和其他可能)。

任何幫助將不勝感激!謝謝

回答

45

你爲什麼使用OpenSSL來生成密鑰對?爲什麼不使用keytool

genrsa工具只是生成一個私鑰。你如何創建相應的證書?你如何將私鑰導入你的Java密鑰庫? (我問,因爲keytool只能從現有的密鑰存儲區導入私鑰,並且只能從Java 6開始導入。)

我懷疑你的問題是你的密鑰存儲區不包含密鑰項(私鑰對應證書)。當您使用keytool列出密鑰庫內容時,有多少個條目?他們是關鍵條目還是可信條目?


服務器需要訪問私鑰才能驗證自己。要導入私鑰,請使用Java 6的增強keytool

創建密鑰,並與OpenSSL的證書後,使用OpenSSL創建一個PKCS#12密鑰存儲:

openssl pkcs12 -export -in cert.pem -inkey key.pem > server.p12 

那麼這個存儲轉換爲Java密鑰存儲:

keytool -importkeystore -srckeystore server.p12 -destkeystore server.jks -srcstoretype pkcs12 

現在在您的SSL啓用服務器中使用server.jks,其中包含證書的私鑰。

+0

基本上,我可以運行的應用程序(見我的問題點4)通過Java keytool的(是的,就像你說的,這是正確的,我已經做到了)生成的密鑰庫。如果我直接從java keytool生成密鑰庫(jks),然後我的應用程序(FTPS服務器)只使用該密鑰庫,那麼效果很好。沒有問題。 你爲什麼我使用OpenSSL生成密鑰對的問題是,因爲目前客戶有許可認證(VeriSign公司),所以我必須先使用OpenSSL進行測試。順便說一句,密鑰工具可以從證書X509導入(通過執行命令:OpenSSL的REQ -x509 -key key.pem -in req.pem -out cert.pem -days 365) – Jef 2010-04-22 02:29:40

+0

從上方 我有導入所產生的密鑰繼續openssl到java密鑰庫(jks),並且java應用程序表示密鑰庫已經有效(我嘗試另一個密鑰,java可以驗證其有效的密鑰庫)。 問題是,當我運行經由密鑰庫(來自OpenSSL的證書由Java keytool的進口產生)的應用程序,該應用拋出上述異常。 密鑰庫包含一個關鍵條目(它在httpd的SSL),當我做密鑰工具列表,該條目已被信任。我執行此命令: keytool -import -v -trustcacerts -alias服務器別名-file cert.pem -keystore cacerts.jks -keypass x -storepass x – Jef 2010-04-22 02:36:27

+0

@Jef - *否,*這是不正確的,或者你的程序會工作;僅僅是因爲你的密鑰存儲區是有效的*格式*並不意味着它*包含了驗證服務器所必需的信息。特別是,您的聲明「當我執行keytool列表時,該條目已被信任」,這聽起來像是一個信任條目,而不是一個關鍵條目。 **信任條目將不起作用 - 沒有私鑰。**應用一些簡單的推理:您是否曾給'keytool'一個包含私鑰的文件?您希望如何在不提供私鑰的情況下執行服務器身份驗證? – erickson 2010-04-22 16:48:30