2009-05-20 17 views
6

Nella mia applicazione Java, ho bisogno di connettermi allo stesso host usando SSL, ma usando un certificato diverso ogni volta. Il motivo per cui è necessario utilizzare certificati diversi è che il sito remoto utilizza una proprietà ID utente incorporata nel certificato per identificare il client.Utilizzo di più certificati client SSL in Java con lo stesso host

Questa è un'applicazione server che funziona su 3 diversi sistemi operativi, e devo essere in grado di cambiare i certificati senza riavviare il processo.

Another user ha suggerito di importare più certificati nello stesso keystore. Non sono sicuro che ciò mi aiuti, a meno che non ci sia un modo per dire a Java quale certificato nel keystore usare.

risposta

11

SSL può fornire suggerimenti al client su quale certificato presentare. Questo potrebbe consentire di utilizzare un archivio chiavi con più identità al suo interno, ma, sfortunatamente, la maggior parte dei server non utilizza questa funzione di suggerimento. Quindi, sarà più robusto se si specifica il certificato client da utilizzare per ciascuna connessione.

Ecco un codice di esempio per impostare uno SSLContext con gli archivi identità e attendibilità specificati. È possibile ripetere questi passaggi per creare più contesti, uno per ogni certificato client che si desidera utilizzare. Ogni SSLContext probabilmente utilizzerà lo stesso archivio di fiducia, ma un diverso archivio identità (contenente la voce della chiave del singolo client da utilizzare in quel contesto).

Inizializza i contesti di cui avrai bisogno una volta e riutilizzare quello corretto per ciascuna connessione. Se stai effettuando più connessioni, questo ti permetterà di sfruttare le sessioni SSL.

KeyManagerFactory kmf = 
    KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
kmf.init(identityStore, password); 
TrustManagerFactory tmf = 
    TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
tmf.init(trustStore); 
SSLContext ctx = SSLContext.getInstance("TLS"); 
ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); 

Successivamente, è possibile creare un socket direttamente:

SSLSocketFactory factory = ctx.getSocketFactory(); 
Socket socket = factory.createSocket(host, port); 

Oppure, se si utilizza la classe URL, è possibile specificare il SSLSocketFactory da utilizzare quando si effettuano le richieste HTTPS:

Java 6 ha alcune API aggiuntive che semplificano la configurazione dei socket in base alle preferenze per le suite di crittografia, ecc.

+0

"Java 6 ha alcune API aggiuntive che semplificano la configurazione dei socket in base alle preferenze per le suite di crittografia" È possibile indicarmi ulteriore documentazione/discussione su queste configurazioni? – Tazzy531

+0

@ Tazzy531 - Java 6 ha aggiunto ['SSLParameters',] (http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/api/javax/net/ssl/class-use/SSLParameters. html) che puoi impostare su un 'SSLEngine' o un nuovo' SSLSocket' in una singola operazione. – erickson

0

Esiste una soluzione here per la scelta dinamica del certificato client utilizzato per l'autenticazione SSL da un client Axis.