Tengo un escenario de comunicación de servidor de cliente en JBOSS y navegador como cliente (JAVA PROGRAM). Inicialmente, cuando se realiza la conexión, el cliente envía su certificado al servidor. El servidor extrae la clave pública del cliente del certificado y, por lo tanto, la comunicación continuará.
Ahora mi pregunta es
¿Cómo enviar el certificado (.cer) del Cliente al Servidor?
¿Cómo recibir el certificado y extraer su clave pública en el Servidor?Reading Client Certificate en Servlet
Respuesta
¿Cómo enviar el certificado (.cer) del Cliente al Servidor?
El certificado del cliente (.cer, .crt, .pem) y su clave privada correspondiente (.key) se deben empaquetar primero en el contenedor PKCS # 12 (.p12, .pfx) o JKS (.jks) (keystore) También debe tener el certificado de CA del servidor empaquetado como JKS (almacén de confianza).
Ejemplo usando HttpClient 3.x:
HttpClient client = new HttpClient();
// truststore
KeyStore trustStore = KeyStore.getInstance("JKS", "SUN");
trustStore.load(TestSupertype.class.getResourceAsStream("/client-truststore.jks"), "amber%".toCharArray());
String alg = KeyManagerFactory.getDefaultAlgorithm();
TrustManagerFactory fac = TrustManagerFactory.getInstance(alg);
fac.init(trustStore);
// keystore
KeyStore keystore = KeyStore.getInstance("PKCS12", "SunJSSE");
keystore.load(X509Test.class.getResourceAsStream("/etomcat_client.p12"), "etomcat".toCharArray());
String keyAlg = KeyManagerFactory.getDefaultAlgorithm();
KeyManagerFactory keyFac = KeyManagerFactory.getInstance(keyAlg);
keyFac.init(keystore, "etomcat".toCharArray());
// context
SSLContext ctx = SSLContext.getInstance("TLS", "SunJSSE");
ctx.init(keyFac.getKeyManagers(), fac.getTrustManagers(), new SecureRandom());
SslContextedSecureProtocolSocketFactory secureProtocolSocketFactory = new SslContextedSecureProtocolSocketFactory(ctx);
Protocol.registerProtocol("https", new Protocol("https", (ProtocolSocketFactory) secureProtocolSocketFactory, 8443));
// test get
HttpMethod get = new GetMethod("https://127.0.0.1:8443/etomcat_x509");
client.executeMethod(get);
// get response body and do what you need with it
byte[] responseBody = get.getResponseBody();
Es posible ejemplo de trabajo en this project ver X509Test
clase.
Con HttpClient 4.x configuración y la sintaxis sería ligeramente diferente:
HttpClient httpclient = new DefaultHttpClient();
// truststore
KeyStore ts = KeyStore.getInstance("JKS", "SUN");
ts.load(PostService.class.getResourceAsStream("/truststore.jks"), "amber%".toCharArray());
// if you remove me, you've got 'javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated' on missing truststore
if(0 == ts.size()) throw new IOException("Error loading truststore");
// tmf
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ts);
// keystore
KeyStore ks = KeyStore.getInstance("PKCS12", "SunJSSE");
ks.load(PostService.class.getResourceAsStream("/" + certName), certPwd.toCharArray());
// if you remove me, you've got 'javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated' on missing keystore
if(0 == ks.size()) throw new IOException("Error loading keystore");
// kmf
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(ks, certPwd.toCharArray());
// SSL
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
// socket
SSLSocketFactory socketFactory = new SSLSocketFactory(ctx, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
Scheme sch = new Scheme("https", 8443, socketFactory);
httpclient.getConnectionManager().getSchemeRegistry().register(sch);
// request
HttpMethod get = new GetMethod("https://localhost:8443/foo");
client.executeMethod(get);
IOUtils.copy(get.getResponseBodyAsStream(), System.out);
Como recibir el certificado y extraer su clave pública en el servidor?
Su servidor debe estar configurado para requerir la autenticación de certificado de cliente X.509. Luego, durante el protocolo SSL, el servlet container recibirá el certificado, lo comprobará contra trustore y lo proporcionará a la aplicación como un atributo de solicitud. En caso habitual con certificado único que podría utilizar este método en el entorno de servlet para extraer el certificado:
protected X509Certificate extractCertificate(HttpServletRequest req) {
X509Certificate[] certs = (X509Certificate[]) req.getAttribute("javax.servlet.request.X509Certificate");
if (null != certs && certs.length > 0) {
return certs[0];
}
throw new RuntimeException("No X.509 client certificate found in request");
}
- 1. Secure ASP.NET MVC application with SSL and client certificate authentication
- 2. Mutual Client Authentication Obtenga el certificado en el servlet
- 3. reading windows font
- 4. FileStream.Seek vs. Buffered Reading
- 5. Python Recursive Data Reading
- 6. PHP SSL Certificate Fingerprint
- 7. Reading HTTP Request Headers personalizados
- 8. WCF Certificate Chain, verifique programáticamente
- 9. Java JAX-WS Service con WCF Client
- 10. HowTo Unit Client Client Code
- 11. connect: SSL_connect returned = 1 errno = 0 state = SSLv3 read server certificate B: certificate verify failed (OpenSSL :: SSL :: SSLError)
- 12. iPhone - reading Setting.bundle devuelve valores erróneos
- 13. .Net SqlConnection, Server Authentication y Certificate Pinning
- 14. Comprensión de IO.select when reading socket en Ruby
- 15. Python help reading csv file failed by line-endings
- 16. HTTP Tunnel Servlet (Java)
- 17. Generic Soap Client en Java
- 18. SSL HandShake en Java Client
- 19. Jersey Client en Android - NullPointerException
- 20. java.lang.NoClassDefFoundError: org/apache/http/client/HttpClient
- 21. ExecutorService en Java Servlet
- 22. Spring @Autowired en Servlet
- 23. System.exit en el servlet
- 24. Llamando al Servlet Post desde otro Servlet
- 25. Reading Atom feed of gmail account from C#
- 26. JSP excepción servlet
- 27. Selenium 2 Webdriver y IE 9 Security Certificate
- 28. ¿Qué software está enviando User-Agent "Test Certificate Info"?
- 29. ¿Cuáles son los beneficios de Windows Certificate Store?
- 30. Renovación de producción Push SSL Certificate - APNS de Apple
estoy viniendo desde una perspectiva .Net y buscando el equivalente Java del ASP.Net 'Page.Request. ClientCertificate.Certificate' es el atributo 'javax.servlet.request.X509Certificate' en' HttpServletRequest' equivalente a eso? - si alguien sabe ...? –