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.
"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
@ 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