2010-05-26 17 views
6

¿Cómo realizo una solicitud HTTP y la firmo con un certificado X.509 usando Java?¿Cómo firmo una solicitud HTTP con un certificado X.509 en Java?

Normalmente programo en C#. Ahora, lo que me gustaría hacer es algo similar a la siguiente, sólo en Java:

private HttpWebRequest CreateRequest(Uri uri, X509Certificate2 cert) 
{ 
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri); 
    request.ClientCertificates.Add(cert); 
    /* ... */ 
    return request; 
} 

En Java He creado una instancia java.security.cert.X509Certificate pero no puedo encontrar la manera de asociar a una petición HTTP. Puedo crear una solicitud HTTP usando una instancia de java.net.URL, pero parece que no puedo asociar mi certificado con esa instancia (y no estoy seguro de si usar java.net.URL es apropiado).

+0

¿Alguno de estas sugerencias funcionan? – jasonmp85

Respuesta

1

Recomendaría la biblioteca de código abierto HttpClient de Apache Commons. Cubre este caso de uso y muchos otros.

+0

404 No encontrado ... – Tomas

+1

Reparado. ¡Espero eso ayude! –

2

No soy un programador de C#, pero supongo que el código realiza una llamada utilizando HTTPS/TLS y proporciona un certificado de cliente para la autenticación. Aka, no estás preguntando cómo usar WS-Security, ¿verdad?

En ese caso, creo que las respuestas here y here le serán útiles. Debe usar una utilidad openssl para importar su certificado a un almacén de claves de cliente p12. Si su servidor utiliza una CA no estándar o un certificado autofirmado, también deberá configurar un almacén de confianza del cliente con esos certificados.

En este punto, mira las preguntas que he vinculado: tendrás que especificar una gran cantidad de argumentos de JVM. Finalmente, intente hacer su llamada nuevamente (usando objetos Java estándar o httpclient). El cliente debe aceptar el certificado del servidor si su almacén de confianza es correcto y el servidor debe solicitar un certificado del cliente. Si su almacén de claves está configurado correctamente, el cliente se autenticará con el certificado de cliente X.509 y estará listo.

1

Parece que está intentando usar HTTPS con autenticación de certificado de cliente. Supongo que su servidor está configurado para solicitar esto (porque el servidor solo puede solicitar el certificado del cliente).

En Java, java.security.cert.X509Certificate es realmente solo el certificado (un certificado de clave pública, sin la clave privada). Lo que necesita del lado del cliente es configurar la clave privada con él. Suponiendo que su clave privada y certificado están en un almacén de claves (para simplificar, supongo que solo hay un certificado adecuado con su clave privada, tal vez con otros certificados de la cadena, en ese almacén de claves), y que está usando el almacén de confianza predeterminado:

KeyStore ks = ... 
/* load the keystore */ 

KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); 
kmf.init(ks, password); 

SSLContext sslContext = SSLContext.getInstance("TLS"); 
sslContext.init(kmf.getKeyManagers(), null, null); 

URL url = new URL("https://example/"); 
HttpsURLConnection connection = (HttpsURLConnection)url.openConnection(); 

connection.setSSLSocketFactory(sslContext.getSSLSocketFactory()); 

Otras bibliotecas le permiten establecer la SSLContext o la KeyStore de forma ligeramente diferente, pero los principios deben ser los mismos.

(También puede utilizar las propiedades del sistema javax.net.ssl.keyStore si es apropiado.)

Cuestiones relacionadas