我使用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)
有,我要問的幾件事情:
- 我用openssl生成的認證密碼是什麼?我們怎麼知道?也許通過命令行openssl xxx?
- 我去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)。這是對的嗎?
- 有人知道解決方案嗎?
- 或者,任何人都知道如何從openssl命令行生成標準密鑰庫,直到可以在java應用程序中使用(偏離密碼)。因爲現在我可以從openssl和export keystore java生成認證,但是我不知道我使用的密碼是什麼以及我在java應用程序中如何使用。注意:如果keystore是直接從java生成的,我可以運行。現在的問題是,如果密鑰庫由java keytool從認證中生成,如openssl(和其他可能)。
任何幫助將不勝感激!謝謝
基本上,我可以運行的應用程序(見我的問題點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
從上方 我有導入所產生的密鑰繼續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
@Jef - *否,*這是不正確的,或者你的程序會工作;僅僅是因爲你的密鑰存儲區是有效的*格式*並不意味着它*包含了驗證服務器所必需的信息。特別是,您的聲明「當我執行keytool列表時,該條目已被信任」,這聽起來像是一個信任條目,而不是一個關鍵條目。 **信任條目將不起作用 - 沒有私鑰。**應用一些簡單的推理:您是否曾給'keytool'一個包含私鑰的文件?您希望如何在不提供私鑰的情況下執行服務器身份驗證? – erickson 2010-04-22 16:48:30