SSL puede proporcionar sugerencias al cliente sobre qué certificado presentar. Este podría le permite usar un almacén de claves con múltiples identidades, pero, desafortunadamente, la mayoría de los servidores no usan esta característica de sugerencias. Por lo tanto, será más robusto si especifica el certificado del cliente para usar en cada conexión.
Aquí está el código de muestra para configurar un SSLContext
con almacenes de confianza e identidad especificados. Puede repetir estos pasos para crear múltiples contextos, uno para cada certificado de cliente que quiera usar. Cada SSLContext
probablemente usaría el mismo almacén de confianza, pero un almacén de identidad diferente (que contiene la entrada de clave de cliente único que se utilizará en ese contexto).
Inicialice los contextos que necesitará una vez y reutilice el correcto para cada conexión. Si está haciendo conexiones múltiples, esto le permitirá aprovechar las sesiones 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);
Más tarde, puede crear una toma directa:
SSLSocketFactory factory = ctx.getSocketFactory();
Socket socket = factory.createSocket(host, port);
O, si está utilizando la clase URL
, se puede especificar el SSLSocketFactory
utilizar al realizar las solicitudes HTTPS:
Java 6 tiene alguna API adicional que hace que sea más fácil configurar sockets según sus preferencias para suites de cifrado, etc.
"Java 6 tiene alguna API adicional que hace que sea más fácil configurar sockets de acuerdo con sus preferencias para suites de cifrado" ¿Puede indicarme más documentación/discusión sobre estas configuraciones? – Tazzy531
@ Tazzy531 - Se agregó Java 6 ['SSLParameters',] (http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/api/javax/net/ssl/class-use/SSLParameters. html) que puede establecer en un 'SSLEngine' o un nuevo' SSLSocket' en una sola operación. – erickson