2011-11-25 32 views
5

Me encuentro aquí con un problema con wsdls y la selección de múltiples certs en java. Una tarjeta inteligente, por ejemplo, tiene múltiples certificaciones para firmar, encriptar, identificar. Tengo un WSDL que genera el código para la conexión de autenticación de cliente pero por lo que puedo decir, darle el WSDL una ruta de acceso al almacén de claves mediante el establecimiento de la propiedad, como esteAutenticación de cliente WSDL y múltiples certificados

System.setProperty("javax.net.ssl.keyStore", 
    keyStore); 
    System.setProperty("javax.net.ssl.keyStorePassword", 
    keyStorePassword); 

estoy siguiendo este tutorial . Ahora, para múltiples certs en un almacén de claves, como en una tarjeta inteligente, esto presenta un problema porque no hay forma de especificar QUÉ certificado desea usar en esa tarjeta inteligente. Parece que wsdl selecciona el primer certificado en el almacén de claves, que podría ser el certificado incorrecto para autenticarse.

Mi pregunta es de 2 veces:

  1. ¿Hay una manera distinta de hacer una System.setProperty para decirle al WSDL cuyo certificado de usar? ¿Qué puedo hacer para especificar qué cert ya que la mayoría del código es generado por wsdl usando wsconsume?

  2. El System.setProperty() solo le permite especificar una ruta. ¿Hay alguna forma de especificar un objeto? La forma en que obtengo los certificados de la tarjeta inteligente es mediante el uso de la clase SunPKCS11 (como se encuentra en here). Sin embargo, esto me devuelve un objeto de almacén de claves, y hasta donde sé System.setProperty() quiere una ruta.

¡Gracias por su ayuda!

Respuesta

1

Finalmente encontré la respuesta a mi pregunta. Tenga en cuenta que estoy usando CXF.

Así que cuando llamo a wsdl2java en el wsdl, obtengo un montón de código generado. Hay dos piezas en particular que manejan una autorización apropiadamente llamada Authorization and AuthorizationService. En mi código, con el fin de llamar a estos enlaces, hago lo siguiente

AuthorizationService authSvc = new AuthorizationService(); 
Authorization authWs = authSvc.getAuthorizationPort(); 

En este punto, tendrá que construir su propia KeyManager y TrustManager mediante la creación de un nuevo almacén de claves del certificado elegido. Un buen lugar para empezar es this

Luego hay que construir TLSClientParameters

TLSClientParameters params = new TLSClientParameters(); 
params.setKeyManagers(keyManagers); 
params.setTrustManagers(trustManagers); 

A continuación, crear su HTTPConduit.

HTTPConduit conduit = (HTTPConduit) ClientProxy.getClient(authWs).getConduit(); 
conduit.setTlsClientParameters(params); 

Y luego puede utilizar su servicio web con el certificado que su usuario haya seleccionado.

Cuestiones relacionadas