SSLHandshakeException: No hay nombres alternativos de sujeto presentes

Invoco el servicio web HTTPS SOAP a través del código Java. Ya importé el certificado autofirmado en jre cacerts keystore. Ahora estoy obteniendo:

com.sun.xml.internal.ws.com.client.ClientTransportException: HTTP transport error: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative names present 

El nombre de host de la URL del servicio no coincide con el de la CN proporcionada en cert. Leí sobre una solución para definir un verificador de nombre de host personalizado aquí . Pero no puedo hacer dónde debo implementar la solución en mi código.

 public SOAPMessage invokeWS(WSBean bean) throws Exception { SOAPMessage response=null; try{ /** Create a service and add at least one port to it. **/ String targetNameSpace = bean.getTargetNameSpace(); String endpointUrl = bean.getEndpointUrl(); QName serviceName = new QName(targetNameSpace, bean.getServiceName()); QName portName = new QName(targetNameSpace, bean.getPortName()); String SOAPAction = bean.getSOAPAction(); HashMap map = bean.getParameters(); Service service = Service.create(serviceName); service.addPort(portName, SOAPBinding.SOAP11HTTP_BINDING, endpointUrl); /** Create a Dispatch instance from a service. **/ Dispatch dispatch = service.createDispatch(portName, SOAPMessage.class, Service.Mode.MESSAGE); // The soapActionUri is set here. otherwise we get a error on .net based // services. dispatch.getRequestContext().put(Dispatch.SOAPACTION_USE_PROPERTY, new Boolean(true)); dispatch.getRequestContext().put(Dispatch.SOAPACTION_URI_PROPERTY, SOAPAction); /** Create SOAPMessage request. **/ // compose a request message MessageFactory messageFactory = MessageFactory.newInstance(); SOAPMessage message = messageFactory.createMessage(); // Create objects for the message parts SOAPPart soapPart = message.getSOAPPart(); SOAPEnvelope envelope = soapPart.getEnvelope(); SOAPBody body = envelope.getBody(); SOAPElement bodyElement = body.addChildElement(bean.getInputMethod(), bean.getPrefix(), bean.getTargetNameSpace()); ...more code to form soap body goes here // Print request message.writeTo(System.out); // Save the message message.saveChanges(); response = (SOAPMessage)dispatch.invoke(message); } catch (Exception e) { log.error("Error in invokeSiebelWS :"+e); } return response; } 

Ignore el parámetro WSBean ya que los espacios de nombres y otros atributos wsdl provienen de este bean. Y si esta excepción se puede resolver con algunas soluciones diferentes, los pls sugieren.

Gracias, Bruno por darme información sobre el nombre común y el nombre alternativo del sujeto. Como descubrimos que el certificado se generó con CN con el nombre DNS de la red y solicitamos la regeneración del nuevo certificado con la entrada del nombre alternativo del sujeto, es decir, san = ip: 10.0.0.1. cual es la solución real

Pero, logramos encontrar una solución con la que podamos ejecutar en la fase de desarrollo. Simplemente agregue un bloque estático en la clase desde la que estamos haciendo la conexión ssl.

 static { HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { public boolean verify(String hostname, SSLSession session) { // ip address of the service URL(like.23.28.244.244) if (hostname.equals("23.28.244.244")) return true; return false; } }); } 

Si está utilizando Java 8, hay una manera mucho más simple de lograr el mismo resultado:

 static { HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> hostname.equals("127.0.0.1")); } 

A diferencia de algunos navegadores, Java sigue estrictamente la especificación HTTPS cuando se trata de la verificación de la identidad del servidor (RFC 2818, sección 3.1) y las direcciones IP.

Cuando se utiliza un nombre de host, es posible recurrir al nombre común en el DN del sujeto del certificado del servidor, en lugar de utilizar el nombre alternativo del sujeto.

Cuando se usa una dirección IP, debe haber una entrada de Nombre Alternativo del Sujeto (de tipo dirección IP, no nombre DNS) en el certificado.

Encontrará más detalles sobre la especificación y cómo generar dicho certificado en esta respuesta .