2011-09-29 41 views
7

我有一個運行在weblogic服務器上的Java應用程序。該應用程序有哪些使用SSL連接到外部Web服務的兩個不同的模塊 - 假設模塊A和模塊B.在同一個JVM上設置多個信任庫

模塊A - 內置於軸 - 使用信任一個 Moudle乙 - 內置於Spring-WS - 使用信任B.

模塊A已經存在。模塊B正在引入。

我需要能夠基於哪個模塊被調用,在JVM中動態設置信任庫。

由於一些限制,我沒有選項 - 創建自定義密鑰管理器。 - 使用一個信任庫

我試圖使用System.setProperty im模塊B代碼庫來設置信任庫。然而,它只有在模塊B首先被調用時才起作用。例如 - 說 我有一個全新的重啓JVM 然後我調用模塊A - 它在JVM中設置它自己的信任庫 然後我調用模塊B - 它失敗 - 它沒有在JVM中設置它自己的信任庫,儘管我已經使用System.setProperty方法。

我錯過了什麼,或者它只是說System.setProperty不會覆蓋現有的設置值。如果是這樣,我的選擇是什麼。

+0

爲什麼你需要兩個信任庫?信任庫只告訴你可以信任哪些CA來驗證對等體。爲什麼每個模塊會有所不同? – EJP

+0

請檢查這一點,它可能會幫助你:http://stackoverflow.com/questions/1793979/registering-multiple-keystores-in-jvm/ – Raz

回答

14

您可以在運行時動態加載可信密鑰存儲區。

// load your key store as a stream and initialize a KeyStore 
InputStream trustStream = ...  
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());  

// if your store is password protected then declare it (it can be null however) 
char[] trustPassword = ... 

// load the stream to your store 
trustStore.load(trustStream, trustPassword); 

// initialize a trust manager factory with the trusted store 
TrustManagerFactory trustFactory = 
    TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());  
trustFactory.init(trustStore); 

// get the trust managers from the factory 
TrustManager[] trustManagers = trustFactory.getTrustManagers(); 

// initialize an ssl context to use these managers and set as default 
SSLContext sslContext = SSLContext.getInstance("SSL"); 
sslContext.init(null, trustManagers, null); 
SSLContext.setDefault(sslContext); 

當心,因爲SSLContext.getDefault()會退給你默認背景下,你不能修改,所以你必須創建一個新的,初始化它,然後設置此背景爲默認值。

底線是你可以如果你想使用任意數量的信任商店。

相關問題