2011-09-29 79 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()会退给你默认背景下,你不能修改,所以你必须创建一个新的,初始化它,然后设置此背景为默认值。

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

相关问题