2009-05-20 25 views
6

En mi aplicación Java, necesito conectarme al mismo host usando SSL, pero usando un certificado diferente cada vez. La razón por la que necesito usar certificados diferentes es que el sitio remoto usa una propiedad de identificación de usuario incrustada en el certificado para identificar al cliente.Uso de múltiples certificados de cliente SSL en Java con el mismo host

Esta es una aplicación de servidor que se ejecuta en 3 sistemas operativos diferentes, y necesito poder cambiar los certificados sin reiniciar el proceso.

Another user sugirió importar varios certificados en el mismo almacén de claves. No estoy seguro de que eso me ayude, a menos que haya una forma de decirle a Java qué certificado usar en el almacén de claves.

Respuesta

11

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.

+0

"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

+0

@ 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

0

Existe una solución here para elegir dinámicamente el certificado de cliente utilizado para la Autenticación SSL de un Cliente de Axis.

Cuestiones relacionadas