JSS SSLSocket Problema eligiendo el certificado del cliente
-
27-10-2019 - |
Pregunta
Este es un poste cruzado del Mozilla Crypto Dev ML. Esperando que alguien tenga algo de experiencia usando org.mozilla.jss
. Enlace: JSS - MDN
Estoy tratando de realizar dos solicitudes HTTPS separadas a un host remoto que usa dos enchufes de clientes y dos certificados de cliente diferentes respectivamente (Cert A y B del cliente). Mi programa de prueba es una versión modificada de Ssltest.java
Desde mi host, puedo hacer dos conexiones en dos enchufes diferentes al host remoto. Puedo recibir un 200 OK de regreso del servidor web remoto para ambas conexiones individuales.
Mi problema es que el certificado del cliente 'A' se esté utilizando para las conexiones 'A' y 'B'.
He estado usando este constructor:
public SSLSocket(java.lang.String host,int port,
java.net.InetAddress localAddr,
int localPort,
SSLCertificateApprovalCallback certApprovalCallback,
SSLClientCertificateSelectionCallback clientCertSelectionCallback)
También he implementado la interfaz SSLClientCertificateSelectionCallback
(fuente) para usar el constructor anterior y pasar el certificado de cliente correcto. Además, coloqué una línea en mi implementado SSLClientCertificateSelectionCallback
select()
función para registrar cuando se ejecuta la devolución de llamada.
Ejecutando mi aplicación y verificando el registro, el método select () solo se llama una vez durante la creación del primer SSLSocket (seleccionando el certificado del cliente 'A') y nunca en futuras instanciaciones de SSLSocket cuando se especifica el nombre del Cert B de Cliente B. De hecho, tengo que reiniciar mi aplicación para select()
ser ejecutado de nuevo.
¿Hay alguna forma de activar el código de devolución de llamada nativo? select()
¿Cuando el servidor remoto solicita un certificado?
Gracias,
Representantes
Solución
Parece que podría haber un almacenamiento en caché de la sesión. Dijiste que usas sslsocket. ¿Has intentado configurar el almacenamiento en caché de la sesión en falso? Por defecto, SSLSocket habilita el almacenamiento en caché de la sesión.
Por ejemplo, en la clase SSLSocket, está el método public void useCache(boolean b)
Si lo establece, pase un parámetro de false
Después de crear el socket, con suerte, eso impide que el servidor almacene en caché su primera sesión (supongo que está llamando a ambas conexiones del cliente desde un programa). De esa manera, debería solicitarle otra solicitud de certificado desde la segunda conexión como lo desea.