2010-07-08 43 views
0

我正在嘗試構建一個使用SSLSocket交換數據的簡單客戶機/服務器系統。 (JavaSE 6) 服務器必須擁有自己的證書,客戶端不需要證書。與JSSE(Javase6)和自簽名證書建立SSL連接

我以此開始 http://java.sun.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#CreateKeystore 爲服務器和自簽名證書生成密鑰。 概括起來:

Create a new keystore and self-signed certificate with corresponding public/private keys. 
keytool -genkeypair -alias mytest -keyalg RSA -validity 7 -keystore /scratch/stores/server.jks 

    Export and examine the self-signed certificate. 
keytool -export -alias mytest -keystore /scratch/stores/server.jks -rfc -file server.cer 

    Import the certificate into a new truststore. 
keytool -import -alias mytest -file server.cer -keystore /scratch/stores/client.jks 

然後在我的服務器代碼我

System.setProperty("javax.net.ssl.keyStore", "/scratch/stores/server.jks"); 
System.setProperty("javax.net.ssl.keyStorePassword", "123456"); 

SSLServerSocketFactory sf = sslContext.getServerSocketFactory(); 
SSLServerSocket sslServerSocket = (SSLServerSocket)sf.createServerSocket(port); 

Socket s = sslServerSocket.accept(); 

我基本上錯過了一些點,因爲我得到一個「javax.net.ssl.SSLException:沒有證書或密鑰對應於啓用的SSL密碼套件。「當我嘗試運行服務器時。

它可能是證書的問題嗎?在keytool中使用-validity時,證書會自簽名,所以如果我沒有錯,它應該可以工作。

閱讀文檔似乎設置屬性「javax.net.ssl.keyStore」足以讓SSLContext正確設置。任何建議?

回答