title: Unable to install SSL certificate for Java app
body: <p>Am bit similar situation as explained in <a href="https://stackoverflow.com/questions/11991284/how-to-bypass-certificate-checking-in-a-java-web-service-client">this</a> question. I also have a WSDL at a particular link. When I open that link I get the <code>There is a problem with this website's security certificate...</code> error in IE. When I click continue it opens up WSDL file.</p>
  
  <p>Now I am writing a client for this webservice in Java. And it throws following exception:</p>
  
  <pre><code>Exception in thread "main" com.sun.xml.internal.ws.wsdl.parser.InaccessibleWSDLException: 2 counts of InaccessibleWSDLException.
  
  java.io.IOException: Got java.security.cert.CertificateException: No subject alternative names matching IP address 172.17.245.196 found while opening stream from https://172.17.245.196/ews/Services.wsdl
  java.io.IOException: Got java.security.cert.CertificateException: No subject alternative names matching IP address 172.17.245.196 found while opening stream from https://172.17.245.196/ews/Services.wsdl?wsdl
      at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.tryWithMex(Unknown Source)
      at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.parse(Unknown Source)    
      at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.parse(Unknown Source)
      at com.sun.xml.internal.ws.client.WSServiceDelegate.parseWSDL(Unknown Source)
      at com.sun.xml.internal.ws.client.WSServiceDelegate.&lt;init&gt;(Unknown Source)
      at com.sun.xml.internal.ws.client.WSServiceDelegate.&lt;init&gt;(Unknown Source)
      at com.sun.xml.internal.ws.spi.ProviderImpl.createServiceDelegate(Unknown Source)
      at javax.xml.ws.Service.&lt;init&gt;(Unknown Source)
      at com.microsoft.schemas.exchange.services._2006.messages.ExchangeWebService.&lt;init&gt;(ExchangeWebService.java:58)
      at com.xyz.cms.EWSJavaAPI.ExchangeAuthenticator.getExchangeServicePort(ExchangeAuthenticator.java:32)
      at com.xyz.cms.test.ExchangeDevelopmentTest.main(ExchangeDevelopmentTest.java:31)
  </code></pre>
  
  <p>So I guess it is related to resolving certificates and since the guy on the said thread got similar exception, I am trying out the solution suggested there - downloading and adding the certificate to the private using <code>keytool.exe</code>, though I really dont think I have completely understood this certificate stuff and also <code>keytool</code>.</p>
  
  <p>So I </p>
  
  <ul>
  <li>Downloaded the certificate by visiting the link in browser and then copy pasted it in app directory in eclipse. </li>
  <li>Also I copy pasted <code>$JAVA_HOME/lib/security/cacerts</code> to my app directory. So by now my app hierarchy looks something like this in eclipse:
  <img src="https://i.stack.imgur.com/NIetV.png" alt="enter image description here"></li>
  <li>Then opened command prompt and navigated to the app directory. </li>
  <li>Finally executed the command (as suggested in that thread). It gave me following output. It gave me following output
  <img src="https://i.stack.imgur.com/sutMl.png" alt="enter image description here"></li>
  </ul>
  
  <p>However it is giving me exactly the same exception. What should I do?</p>
  
  <p><strong>Edit</strong></p>
  
  <p>Well this is my effort to write java client for Exchange Web Services. Their is ExchangeAuthenticator which manages web services authentication requests to the Exchange and ExchangeDevelopmentTest which contains main method to test functionality of above class. a Here is the code:</p>
  
  <p><strong>ExchangeAuthenticator</strong> </p>
  
  <pre><code>public class ExchangeAuthenticator {    
  /**
   * Obtains an authenticated ExchangeServicePortType with given credentials.
   *     
   */
      public ExchangeServicePortType getExchangeServicePort(String username, String password, String domain, URL wsdlURL) throws MalformedURLException {
          // Concatinate our domain and username for the UID needed in authentication.
          String uid = "domain" + "\\" + "uname";
  
          // Create an ExchangeWebService object that uses the supplied WSDL file, wsdlURL.
          ExchangeWebService exchangeWebService = new ExchangeWebService(wsdlURL, new QName("&lt;a href=\"http://schemas.microsoft.com/exchange/services/2006/messages\"&gt;http://schemas.microsoft.com/exchange/services/2006/messages&lt;/a&gt;", "ExchangeWebService"));
          ExchangeServicePortType port = exchangeWebService.getExchangeWebPort();
          // Supply your username and password when the ExchangeServicePortType is used for binding in the SOAP request.
          ((BindingProvider)port).getRequestContext().put(BindingProvider.USERNAME_PROPERTY, uid);
          ((BindingProvider)port).getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, password);
  
          return port;
      }
  }
  </code></pre>
  
  <p><strong>ExchangeDevelopmentTest</strong></p>
  
  <pre><code>public class ExchangeDevelopmentTest {    
      public static void main (String[] args) {
          ExchangeAuthenticator exchangeAuthenticator = new ExchangeAuthenticator();
  
          // Print statement so we can easily see where our statements start in the Java console.
          System.out.println("Let's get started!");
  
          try {
              // Create a URL object which points at the .wsdl we deployed in the previous step.
              URL wsdlURL = new URL("https://172.17.245.196/ews/Services.wsdl");
              //URL wsdlURL = new URL("&lt;a href=\"https://172.17.245.196/ews/Services.wsdl\"&gt;https://172.17.245.196/ews/Services.wsdl&lt;/a&gt;");
              // Call to the class we just created to return an ExchangeServicePortType with authentication credentials.
              ExchangeServicePortType port = exchangeAuthenticator.getExchangeServicePort("uname", "password@123", "domain", wsdlURL);
  
              // Prints out the default toString() for the ExchangeServicePortType.
              System.out.println(port.toString());
          } catch (MalformedURLException ex) {
              // Catch any errors that may occur.
              Logger.getLogger(ExchangeDevelopmentTest.class.getName()).log(Level.SEVERE, null, ex);
              System.out.println(ex.getMessage()+"\n"+ex.getStackTrace());
          }
      }
  }
  </code></pre>