2010-10-13 149 views
1

創建SSL服務器時,我得到以下異常:Default SSL context init failed: null。它似乎來自它找不到密鑰庫和信任庫的事實。我嘗試從jar文件中設置它們。該文件存在於jar中,但似乎無法找到該資源。默認SSL上下文初始化失敗:空

String keystore = TestFramework.class.getResource("/security/keystore.jks").getFile(); 
System.setProperty("javax.net.ssl.keyStore", keystore); 
System.setProperty("javax.net.ssl.keyStorePassword", password); 
String truststore = TestFramework.class.getResource("/security/truststore").getFile(); 
System.setProperty("javax.net.ssl.trustStore", truststore); 
System.setProperty("javax.net.ssl.trustStorePassword", "ebxmlrr"); 

我運行了一個ls命令來檢查文件是否存在。它存在。然後通過運行命令jar -tf myjar.jar | grep security來檢查keystore.jks是否存在,它是否存在。

security/ 
security/keystore.jks 
security/truststore 

我的應用程序在Tomcat下運行。

回答

6

不起作用的原因是這些系統屬性期望在實際文件系統上存在文件,而不是在存檔中。你會更好使用這些密鑰庫和trustore流創建自己的SSLContext

KeyStore keyStore = KeyStore.getInstance("jks"); 
keyStore.load(TestFramework.class.getResourceAsStream("/security/keystore.jks"), password.toCharArray()); 
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509"); 
keyManagerFactory.init(keyStore, password.toCharArray()); 

KeyStore trustStore = KeyStore.getInstance("jks"); 
trustStore.load(TestFramework.class.getResourceAsStream("/security/truststore"), "ebxmlrr".toCharArray()); 
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("SunX509"); 
trustManagerFactory.init(trustStore); 

SSLContext context = SSLContext.getInstance("SSL"); 
context.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), new SecureRandom()); 

... 

HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection(); 
urlConnection.setSSLSocketFactory(context.getSocketFactory()); 
+0

只是一個小評論,負載方法需要一個InputStream,而不是一個URL。謝謝您的幫助。 – Sydney 2010-10-14 17:07:58

+0

固定。這就是我在不編譯代碼的情況下調整代碼所得到的結果。 – laz 2010-10-15 03:02:42

相關問題