title: Using HTTPS with REST in Java
body: <p>I have a REST server made in Grizzly that uses HTTPS and works wonderfully with Firefox.  Here's the code:</p>
  
  <pre><code>//Build a new Servlet Adapter.
  ServletAdapter adapter=new ServletAdapter();
  adapter.addInitParameter("com.sun.jersey.config.property.packages", "My.services");
  adapter.addInitParameter(ResourceConfig.PROPERTY_CONTAINER_REQUEST_FILTERS, SecurityFilter.class.getName());
  adapter.setContextPath("/");
  adapter.setServletInstance(new ServletContainer());
  
  //Configure SSL (See instructions at the top of this file on how these files are generated.)
  SSLConfig ssl=new SSLConfig();
  String keystoreFile=Main.class.getResource("resources/keystore_server.jks").toURI().getPath();
  System.out.printf("Using keystore at: %s.",keystoreFile);
  ssl.setKeyStoreFile(keystoreFile);
  ssl.setKeyStorePass("asdfgh");
  
  //Build the web server.
  GrizzlyWebServer webServer=new GrizzlyWebServer(getPort(9999),".",true);
  
  //Add the servlet.
  webServer.addGrizzlyAdapter(adapter, new String[]{"/"});
  
  //Set SSL
  webServer.setSSLConfig(ssl);
  
  //Start it up.
  System.out.println(String.format("Jersey app started with WADL available at "
    + "%sapplication.wadl\n",
          "https://localhost:9999/"));
  webServer.start();
  </code></pre>
  
  <p>Now, I try to reach it in Java:</p>
  
  <pre><code>SSLContext ctx=null;
  try {
      ctx = SSLContext.getInstance("SSL");
  } catch (NoSuchAlgorithmException e1) {
      e1.printStackTrace();
  }
  ClientConfig config=new DefaultClientConfig();
  config.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES, new HTTPSProperties(null,ctx));
  WebResource service=Client.create(new DefaultClientConfig()).resource("https://localhost:9999/");
  
  //Attempt to view the user's page.
  try{
      service
          .path("user/"+username)
          .get(String.class);
  }
  </code></pre>
  
  <p>And get:</p>
  
  <pre><code>com.sun.jersey.api.client.ClientHandlerException: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
   at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:128)
   at com.sun.jersey.api.client.Client.handle(Client.java:453)
   at com.sun.jersey.api.client.WebResource.handle(WebResource.java:557)
   at com.sun.jersey.api.client.WebResource.get(WebResource.java:179)
  </code></pre>
  
  <p>From examples that I've found on the web, it seems like I would need to setup a Truststore then setup some sort of TrustManager.  This seems like a lot of code and setup work for my simple little project.  Is there an easier way to just say..I trust this cert and point to a .cert file?</p>