title: SSLHandshakeException: No subject alternative names present
body: <p>I am invoking HTTPS SOAP web service through java code. I have already imported self-signed certificate in jre cacerts keystore. Now I am getting :</p>
  
  <pre><code>com.sun.xml.internal.ws.com.client.ClientTransportException: HTTP transport error: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative names present
  </code></pre>
  
  <p>The hostname of the service URL is not matching that of the CN provided in cert. I read about a workaround of defining a custom Hostname verifier <a href="http://docs.oracle.com/cd/E17904_01/web.1111/e13734/proxy.htm">here</a>. But i cant able to make where I should implement the workaround in my code.</p>
  
  <pre><code>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&lt;String, String&gt; 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;
  }
  </code></pre>
  
  <p>Please ignore WSBean parameter as the namespaces and other wsdl attributes are coming from this bean. And if this exception can solved with some different workarounds, pls do suggest.</p>