Registrarse para recibir una notificación de evento de finalización del protocolo de enlace SSLSocket

Según el documentación sobre SSLSocket:

Puede registrarse para recibir una notificación de evento de finalización del apretón de manos.

¿Por qué no te registrarías para esto? ¿El hecho de que SSLSocket.startHandshake() tenga éxito sin que ocurra una SSLException garantiza que los certificados sean confiables? ¿O obtiene un nivel adicional de seguridad al esperar a que se complete el apretón de manos?

preguntado el 03 de mayo de 12 a las 19:05

1 Respuestas

Hay 3 condiciones para iniciar el apretón de manos en un SSLSocket:

  • llamando a startHandshake que comienza explícitamente los apretones de manos, o
  • cualquier intento de leer o escribir datos de la aplicación en este socket provoca un protocolo de enlace implícito, o
  • una llamada a getSession intenta configurar una sesión si no hay una sesión válida actualmente y se realiza un protocolo de enlace implícito.

Cualquier falla en el protocolo de enlace generará una excepción (incluso cuando el certificado no es de confianza):

Si el protocolo de enlace falla por algún motivo, el SSLSocket se cierra y no se pueden realizar más comunicaciones.

A menudo, llamando startHandshake() explícitamente cuando no es necesario establecer la conexión, ya que el protocolo de enlace se inicia cuando comienza a leer desde el flujo de entrada (o escribir en el flujo de salida). Cualquier falla allí causaría una excepción y detendría el flujo de control normal. No necesita registrarse explícitamente para capturar la finalización del protocolo de enlace en esos casos: si puede leer/escribir desde las secuencias, ya está hecho.

La notificación de finalización del protocolo de enlace es útil principalmente si es un servidor que solicita una renegociación (llamando startHandshake() después de que se hayan intercambiado algunos datos de la aplicación). En este caso, es posible que desee esperar a que se complete el apretón de manos antes de continuar. Por ejemplo, si el servidor solicita un certificado de cliente después de recibir una solicitud HTTP para una ruta en particular, es posible que desee esperar a que el protocolo de enlace se complete correctamente para poder autorizar el certificado de cliente antes de enviar la respuesta. Esto es porque startHandshake() no detiene el flujo de datos de la aplicación:

Si ya se enviaron datos en la conexión, continúan fluyendo durante este protocolo de enlace.

contestado el 03 de mayo de 12 a las 20:05

Parece que el servidor debe almacenar en caché los datos que envía el cliente hasta que se complete el protocolo de enlace. Esto parece causar problemas porque el caché predeterminado del servidor web Apache es ~128K y un HTTP PUT de un archivo puede ser enorme... - Ryan

@Ryan No. El servidor no obtener los datos que el cliente envía hasta que se completa el protocolo de enlace. Hasta que se completa el protocolo de enlace, no hay conexión a través de la cual se puedan enviar datos. - user207421

@EJP No. La renegociación SSL ocurre simultáneamente con la transferencia de datos. Ver stackoverflow.com/questions/14281628/… y httpd.apache.org/docs/2.2/mod/mod_ssl.html#sslrenegbuffersize y w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.20 y... - Ryan

@Ryan Si y solo si ha habido un apretón de manos previo. Si no es así, el protocolo de enlace debe completarse antes de enviar cualquier dato. Me refiero a ese caso ('no hay conexión'). - user207421

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.