2012-06-21 19 views
11

decir que tengo dos aplicaciones Java que he escrito: Ping.jar y Pong.jar y que se despliegan y corrió en dos servidores separados (Ping.jar despliega a srv-01.myorg.com y Pong.jar despliega a srv-02.myorg.com), y estas dos aplicaciones necesitan comunicarse entre sí (2 vías) a través de SSL. Supongamos también que cada aplicación tiene su propio certificado SSL.SSL Certificado de Verificación en Java

  • ¿Cómo, un programador de Java, código Ping y Pong para verificar certificado SSL del otro? ¿Cada CA proporciona algún tipo de API RESTful con la que puedo comunicarme, digamos, HttpClient? ¿Java tiene su propia API de verificación de certificados? ¿Hay JAR de código abierto de terceros o servicios que pueda usar?

Me sorprendió lo poco que apareció cuando busqué este en línea.

+0

¿Qué servidores web está utilizando? La habilitación de SSL (en su caso mutual-ssl) suele ser un caso de configuración del servidor, no de codificación. – npe

+0

Bueno, digamos ambos escenarios: (1) una aplicación pura de Java que usa sockets sin procesar/NIO (como lo implica mi caso de uso anterior), y (2) Oracle GlassFish. En realidad estoy interesado en ambos casos de uso ahora. – IAmYourFaja

+0

Anuncio 1. Nunca lo intenté, esta podría ser una gran tarea comenzar de cero. Anuncio 2. Consulte [este enlace] (http://glassfish.java.net/javaee5/security/faq.html), especialmente dos preguntas sobre SSL y autenticación de certificado de cliente. Hay mucho más que eso, así que lea Glassfish sobre seguridad, pero como dije, todo se trata de configuración, no de codificación. – npe

Respuesta

21

Si se conecta utilizando las clases Java SE SSL/TLS (por ejemplo, SSLSocket o SSLEngine), está utilizando el Java Secure Socket Extension (JSSE).

Verificará el certificado de la parte remota según el SSLContext que se utilizó para crear este SSLSocket o SSLEngine.

Este SSLContext se inicializará con TrustManager que dictan cómo se debe establecer la confianza.

A menos que necesite una configuración específica, a menudo puede confiar en the default values: esto dependerá del algoritmo PKIX (RFC 3280) para verificar el certificado contra un conjunto de anclajes de confianza (en cacerts de forma predeterminada). cacerts, enviado con Oracle JRE, es un almacén de claves JKS al que puede agregar certificados adicionales. Puede agregar certificados explícitamente usando keytool por ejemplo.

También puede crear una X509TrustManager basado en un almacén de claves mediante programación personalizada (como se describe en this answer) y utilizarlo en una específica SSLContext que no afecta a la predeterminada.

Además de esto, si está utilizando su propio protocolo, deberá verificar que el certificado que ha obtenido coincide con el nombre de host que estaba buscando (consulte RFC 6125). Por lo general, puede buscar el nombre alternativo del sujeto en el X509Certificate que obtiene (obtenga el primer certificado de pares de la cadena del SSLSession); en su defecto, busque el RDN CN en el Nombre del tema distinguido.

+1

Usted también podría estar interesado en [esto] (http://stackoverflow.com/a/6341566/372643). – Bruno

0

No tiene que verificar manualmente los certificados de los demás.

Solo tiene que importar cada certificado de servidor en las cacerts de los demás, de esta forma ambos servidores de aplicaciones confiarán automáticamente entre sí.

+0

¿Qué pasa si ambos extremos están mintiendo? Proporcioné este ejemplo de Ping/Pong para ilustrar el concepto de intentar verificar un certificado en Java puro. ¡El hecho de que escribí Ping/Pong no debería implicar que puedan confiar el uno en el otro! Pensando de manera más abstracta: si Ping y Pong fueron escritos por diferentes tiendas de desarrollo y alojados en 2 redes totalmente separadas, ¿qué tendrían que hacer para verificar los certs de los demás? – IAmYourFaja

+0

Sí lo haces. SSL proporciona privacidad, integridad y autenticación de la identidad de pares. La aplicación debe verificar si la aplicación espera la identidad de los pares y si la aplicación debe hacer eso en la aplicación, si es necesario. Este es el paso de "autorización", y SSL no puede hacerlo por usted. – EJP

1

, usted puede obtener el certificado de pares o bien adjuntando un HandshakeCompletedListener a la SSLSocket y obtener el certificado del caso, o bien por conseguir el SSLSession del SSLSocket y obtener el certificado de pares de la sesión.

SSL proporciona privacidad, integridad y autenticación de la identidad del par. La aplicación debe verificar si la aplicación espera la identidad de los pares y si la aplicación debe hacer eso en la aplicación, si es necesario. Este es el paso de "autorización", y SSL no puede hacerlo por usted.

Cuestiones relacionadas