2012-02-12 32 views
5

Me estoy conectando a un servicio web a través de HTTPS. He hecho todo lo que creo que es necesario para que funcione, pero al final me da un apretón de manos.¿Por qué recibo una falla de handshake (Java SSL)?

Descubrí que como nuevo usuario no puedo publicar más de 2 enlaces debido a la "protección contra correo no deseado", muchas gracias stackoverflow ... de todos modos aquí hay un enlace a una publicación pastebin con todos los enlaces detallados. .so cuando escribo "enlace # 1" aquí es una referencia a estos enlaces: http://pastebin.com/y4zGNRC7

  • verifiqué el mismo comportamiento utilizando HttpClient (GET en la URL del servicio) y, de hecho llamar el servicio web a través de un proxy CXF
  • Estoy configurando el almacén de claves y el almacén de confianza - Intenté tanto el modo "en código" (enlace # 1) como las propiedades del sistema - es decir, System.setProperty ("javax.net.ssl.keyStore", "mykeystore" .jks ");
  • depuración SSL está activado (javax.net.debug = todos)
  • depuración SSL deja escapar el contenido de ambas almacén de claves y almacén de confianza (es decir, se parece a Java "sabe acerca de ellos") - el enlace # 2
  • parece como hay un poco de la comunicación cliente-servidor en marcha, pero luego se bloquea por alguna razón el enlace # 3
  • he conectado correctamente al servidor utilizando los certificados de cliente y CA tanto en un navegador (Chrome) y usando openssl s_client
  • espectáculos de Wireshark menos conversación cliente-servidor desde Java (enlace n.º 4) y luego, por ejemplo, desde Chrome (enlace n.º 5)

Otra cosa extraña es que parece que estoy obteniendo el mismo comportamiento cuando configuro el almacén de claves y cuando no (la única diferencia es que cuando lo hago, los contenidos del almacén de claves se imprimen en la consola, pero eso es todo)

Traté de buscar en Google el problema y vi numerosos mensajes similares aquí en stackoverflow, pero nada ayudó. Traté de cambiar la versión del protocolo ("TLSv1", "SSLv3", incluso el extraño v2 Hola). Cualquier ayuda sería apreciada - tal vez hay algo fundamental que podría haber pasado por alto ... Me estoy desesperada aquí ... Gracias

PS Estoy corriendo Java 1.6 Actualización 30 en Fedora Core 15 (de 64 bits)

+1

Se puede publicar un StackTrace excepción? – home

+0

* "Me enteré de que a medida que un nuevo usuario que no puedo publicar más de 2 enlaces debido a la "protección antispam" - muchas gracias stackoverflow "*. Si utiliza este sitio mucho, se dará cuenta de que las medidas de protección contra correo no deseado de SO son BUENAS. –

+1

Y sobre el tema de los enlaces, se considera de mala calidad para publicar enlaces pastebin y similares porque se evaporan rápidamente haciendo que la pregunta sea ininteligible para los lectores futuros. –

Respuesta

4

El problema era que aunque el almacén de claves y el almacén de confianza estaban configurados, Java decidió no enviar el certificado del cliente al servidor.La razón de esto fue el hecho de que el servidor solicitó un certificado firmado por la autoridad de RootCA, pero el certificado del cliente está firmado por una autoridad de SubCA (emitida por RootCA).

Originalmente, el almacén de claves solo contenía el certificado del cliente y el almacén de confianza del certificado de SubCA. Luego traté de agregar el certificado SubCA al almacén de claves también, pero java simplemente lo ignoró.

Esto resuelve el misterio del fallo de hanshake, pero no es mi problema.

creé una pregunta específica para esa ... :-(suspiro why doesn't java send the client certificate during SSL handshake?

2

No proporciona suficiente información, pero supongo que su cliente truststore no está configurado correctamente. El almacén de confianza contiene los certificados de confianza que se utilizan para firmar otros certificados, y debe incluir los certificados raíz para las cadenas de certificaciones de servidor y cliente. El almacén de claves del cliente contiene el certificado SSL del cliente y la clave privada.

+0

Gracias por su respuesta Greg. Por favor dígame qué más información debo proporcionar. Traté de ser lo más completo posible, pero sé que podría haberme perdido algo. Cuando escribí, configuré tanto _truststore_ como _keystore_. Puse Xs en los registros en lugar de nombres de certificados reales y cosas así porque no quería publicarlos en línea. El almacén de claves contiene el certificado del cliente y la clave privada. El almacén de confianza contiene tanto el certificado de la CA que emitió el certificado como el certificado de CA raíz. El stacktrace no parece ser demasiado útil aquí (lo publiqué en un comentario anterior). –

+0

Parece que el cliente ** keystore ** se carga, pero el certificado del cliente no se está presentando en el servidor y es por eso que falla el handshake. El registro muestra una cadena de certificados de cliente vacía.No tengo ni idea de por qué, sin embargo :-( –

1

Creo que la tienda de confianza que no contiene la CA es el problema más probable. Se puede utilizar el Java keytool para importar el certificado para el sitio en el archivo cacerts hacer algo como:

keytool -keystore pathtocacerts -import -trustcacerts -v -alias aliasName -file root.crt 

El cacerts por defecto la contraseña del almacén de claves es changeit. El archivo cacerts generalmente está en el directorio jre/lib/security.

+0

Estoy bastante seguro de que el truststore contiene la CA. Cuando eso no funcionó, también importé el certificado raíz de CA en el almacén de confianza ... pero eso no pareció ayudar. –

+1

Tenga en cuenta que con la depuración SSL activada, los contenidos de truststore y keystore se imprimen en la consola. También el certificado del cliente y el certificado de CA (no el de la raíz) son suficientes para que esto funcione en un navegador. –

+0

Intenté comprobar el contenido de las tiendas con la herramienta de claves y todo parece estar bien. Incluso intenté configurar ambas tiendas a través de opciones de línea de comandos al inicio (es decir '-Djavax.net.ssl.keyStore =') en vano ... –

Cuestiones relacionadas