title: Accessing secure restful web services using jersey client
body: <p>I have created web services based on Jersey (auto generated via Netbeans).</p>
  
  <p>I have also created a user names “testClient” with password “secret” and created User group “Users” and used file Realm using glassfish 3.0.1 admin console.</p>
  
  <p>I have also mapped web.xml and sun-web.xml accordingly.</p>
  
  <p>My web services are secured successfully; as I access the web site I receive a security warning and then I am prompt to give username and password to access any content of the website. It is working fine when accessed via web browser.</p>
  
  <p>Now I have written a simple client based on jersey and tried to access the web services offered by the 1st project; the client code is here</p>
  
  <p>Auto generated Jersey client code</p>
  
  
  
  <pre class="lang-java prettyprint-override"><code>public class JerseyClient {
      private WebResource webResource;
      private Client client;
      private static final String BASE_URI = "https://localhost:9028/testsecurity2/resources";
  
      public JerseyClient() {
          com.sun.jersey.api.client.config.ClientConfig config = new com.sun.jersey.api.client.config.DefaultClientConfig(); // SSL configuration
          // SSL configuration
          config.getProperties().put(com.sun.jersey.client.urlconnection.HTTPSProperties.PROPERTY_HTTPS_PROPERTIES, new com.sun.jersey.client.urlconnection.HTTPSProperties(getHostnameVerifier(), getSSLContext()));
          client = Client.create(config);
          webResource = client.resource(BASE_URI).path("manufacturers");
      }
  
      public &lt;T&gt; T get_XML(Class&lt;T&gt; responseType) throws UniformInterfaceException {
          return webResource.accept(javax.ws.rs.core.MediaType.APPLICATION_XML).get(responseType);
      }
  
      public &lt;T&gt; T get_JSON(Class&lt;T&gt; responseType) throws UniformInterfaceException {
          return webResource.accept(javax.ws.rs.core.MediaType.APPLICATION_JSON).get(responseType);
      }
  
      public void close() {
          client.destroy();
      }
  
      public void setUsernamePassword(String username, String password) {
          client.addFilter(new com.sun.jersey.api.client.filter.HTTPBasicAuthFilter(username, password));
      }
  
      private HostnameVerifier getHostnameVerifier() {
          return new HostnameVerifier() {
  
              @Override
              public boolean verify(String hostname, javax.net.ssl.SSLSession sslSession) {
                  return true;
              }
          };
      }
  
      private SSLContext getSSLContext() {
          javax.net.ssl.TrustManager x509 = new javax.net.ssl.X509TrustManager() {
  
              @Override
              public void checkClientTrusted(java.security.cert.X509Certificate[] arg0, String arg1) throws java.security.cert.CertificateException {
                  return;
              }
  
              @Override
              public void checkServerTrusted(java.security.cert.X509Certificate[] arg0, String arg1) throws java.security.cert.CertificateException {
                  return;
              }
  
              @Override
              public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                  return null;
              }
          };
          SSLContext ctx = null;
          try {
              ctx = SSLContext.getInstance("SSL");
              ctx.init(null, new javax.net.ssl.TrustManager[]{x509}, null);
          } catch (java.security.GeneralSecurityException ex) {
          }
          return ctx;
      }
  
  }
  </code></pre>
  
  <p>Code in Main Method; uses auto generated code</p>
  
  <pre class="lang-java prettyprint-override"><code>JerseyClient client = new JerseyClient();
  client.setUsernamePassword("testClient", "secret");
  Object response = client.get_XML(String.class);
  // do whatever with response
  client.close();
  </code></pre>
  
  <p>Results:</p>
  
  <pre class="lang-java prettyprint-override"><code>Exception in thread "main" com.sun.jersey.api.client.ClientHandlerException: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
          at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:128)
          at com.sun.jersey.api.client.filter.HTTPBasicAuthFilter.handle(HTTPBasicAuthFilter.java:78)
          at com.sun.jersey.api.client.Client.handle(Client.java:457)
          at com.sun.jersey.api.client.WebResource.handle(WebResource.java:557)
          at com.sun.jersey.api.client.WebResource.access$300(WebResource.java:69)
          at com.sun.jersey.api.client.WebResource$Builder.get(WebResource.java:451)
          at clients.JerseyClient.get_XML(JerseyClient.java:23)
          at clients.NewMain1.main(NewMain1.java:20)
  Caused by: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
          at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:808)
          at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1112)
          at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1139)
          at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1123)
          at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:434)
          at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166)
          at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1049)
          at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:373)
          at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:318)
          at com.sun.jersey.client.urlconnection.URLConnectionClientHandler._invoke(URLConnectionClientHandler.java:215)
          at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:126)
          ... 7 more
  Caused by: java.io.EOFException: SSL peer shut down incorrectly
          at com.sun.net.ssl.internal.ssl.InputRecord.read(InputRecord.java:333)
          at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:789)
          ... 17 more
  Java Result: 1
  </code></pre>
  
  <p>I also want to inform that these are two different projects running on different servers both are glassfish 3.0.1. I also tried to run client and services on the same server but all in vain. I am stuck; kindly help me.</p>
  
  <p>Cheers!</p>