2011-06-21 74 views
1

我環顧四周,沒有看到任何問題完全解答了我想要的問題,但如果這是重複的,請將問題指向我,然後我將繼續前進。使用Java創建SSL連接

現在我正試圖編寫一個Java服務器,它將接收來自SSLServerSocket的數據,現在只需將其打印出來。我最終希望這些數據來自Android,但現在它甚至在開始監聽數據之前拋出一個SSLException

代碼:

System.setProperty("javax.net.ssl.keyStore","C:\\ProgramFiles\\jre6\\bin\\server.jks"); 
System.setProperty("javax.net.ssl.keyStorePassword","password"); 
SSLServerSocketFactory factory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault(); 
ServerSocket ss = factory.createServerSocket(6543); 
Socket s = ss.accept(); 

有更多的代碼後對其進行處理,但它被掛斷了,並拋出異常那裏,所以我不知道張貼它會幫助任何的,但如果它會,只是評論它。

我創建了以下在Ubuntu OpenSSL的教程證書,並在轉移,並使用創建了密鑰庫:

keytool -import -file "C:\Documents and Settings\matt\Desktop\server.crt" -keystore server.jks 

我可以很容易地承認,我不完全理解這個作品是如何一大截,所以任何幫助,將不勝感激。另外,我想我會把它放在這個問題的範圍之外,因爲我覺得這是一個非常大的問題,但我也希望能夠在如果可能的情況下連接客戶端。對不起,所有的幫助提前,所有的麻煩和感謝。

編輯:

我跟着教程是在這裏:再次 http://www.akadia.com/services/ssh_test_certificate.html

謝謝!

編輯:

例外是扔是:

javax.net.ssl.SSLException: No available certificate or key corresponds to the SSL cipher suites which are enabled 

我想谷歌的例外,大多數東西都描述瞭如何創建一個密鑰(這我的印象是一個教程,我已經有)。我將繼續篩選這些搜索結果。

謝謝!

+0

可以運行[您套接字對象] .getEnabledCipherSuites()和[您套接字對象] .getSupportedCipherSuites - 然後粘貼輸出在你的問題(與你的證書是密碼一起創建 - 例如RC4-128等)? – jefflunt

回答

3

當您創建這樣一個密鑰,你只把證書在您的密鑰庫:

keytool -import -file "server.crt" -keystore server.jks 

你需要的是有一個私鑰+證書。

如果您已經擁有由證書頒發機構頒發的證書,您可以從其他地方導入它們,或者如果僅限於有限使用,則可以創建自簽名證書。

如果您使用OpenSSL創建的證書是自簽名的(或者來自您自己使用的迷你CA,例如CA.pl),那麼轉換可能不值得。您也可以直接使用keytool生成自簽名證書。見"Generating Your Key Pair" example官方keytool文檔中:

keytool -genkeypair -dname "cn=Mark Jones, ou=JavaSoft, o=Sun, c=US" 
    -alias business -keypass kpi135 -keystore /working/mykeystore 
    -storepass ab987c -validity 180 

請確保您使用cn=your.fqdn.host.name(或cn=localhost如果它僅用於本地測試)。 (我認爲隨Java 7提供的keytool也支持主題替代名稱,這樣會更好。)

如果您已經擁有要在PKCS#12格式中重新使用的私鑰+證書(通常爲.p12文件),您可以使用this question中描述的方法導入它。

如果您使用OpenSSL製作的內容採用PEM格式,則可能更容易將它們與OpenSSL捆綁在PKCS#12文件中,然後像上面那樣導入它們。這可以用這個來完成:

openssl pkcs12 -export -in cert.pem -inkey key.pem -out creds.p12 
+0

謝謝,我將致力於實施這些。看起來這可能會涵蓋我需要的一切。 – Matt

+0

我忘記說了:您不一定需要將PKCS#12文件轉換爲JKS格式,因爲它可以在Java中使用:如果這更方便,可以直接使用它們的PKCS12存儲類型(請參閱'javax.net.ssl.keyStoreType')。 – Bruno