2011-09-29 9 views
7

Ho un'applicazione Java in esecuzione su un server weblogic. L'applicazione ha due moduli distinti che usano SSL per connettersi a servizi Web esterni - diciamo modulo A e modulo B.Impostazione di più truststore sulla stessa JVM

Modulo A - Asse incorporato - Utilizza truststore A Moudle B - Costruito su Spring-ws - Utilizza truststore B.

Il modulo A è esistente. Il modulo B è stato introdotto.

Devo essere in grado di impostare il truststore dinamicamente nella JVM in base al modulo richiamato.

A causa di alcuni vincoli, non ho l'opzione - per creare un gestore chiavi personalizzato. - utilizzare un truststore

Ho provato a utilizzare System.setProperty nel modulo B codebase per impostare il truststore. Tuttavia funziona solo se il modulo B è stato richiamato per primo. Per esempio - Say Ho un nuovo riavvio della JVM quindi invoco il modulo A - è impostato su truststore nella JVM quindi invoco il modulo B - Fallisce - non imposta il proprio truststore nella JVM anche se Ho usato il metodo System.setProperty.

Mi manca qualcosa o è solo che System.setProperty non sovrascrive i valori impostati esistenti. Se sì, quali sono le mie opzioni qui.

+0

Perché sono necessari due trust? Un truststore indica solo le CA di cui ci si può fidare per autenticare il peer. Perché dovrebbe essere diverso per modulo? – EJP

+0

Si prega di controllare questo, potrebbe aiutarti: http://stackoverflow.com/questions/1793979/registering-multiple-keystores-in-jvm/ – Raz

risposta

14

È possibile caricare dinamicamente archivi di chiavi affidabili in fase di esecuzione.

// 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); 

attenzione, perché SSLContext.getDefault() darebbe indietro il predefinita contesto che si Non è possibile modificare, quindi bisogna crearne uno nuovo, inizializzare quindi impostare questo nuova contesto come predefinito.

La linea di fondo è che si può utilizzare qualsiasi numero di negozi di fiducia se si desidera.