| [//]: # " Copyright (c) 2015, 2018 Oracle and/or its affiliates. All rights reserved. " |
| [//]: # " " |
| [//]: # " This program and the accompanying materials are made available under the " |
| [//]: # " terms of the Eclipse Distribution License v. 1.0, which is available at " |
| [//]: # " http://www.eclipse.org/org/documents/edl-v10.php. " |
| [//]: # " " |
| [//]: # " SPDX-License-Identifier: BSD-3-Clause " |
| |
| HTTPS Client/Server Example - Grizzly |
| ===================================== |
| |
| This example demonstrates how to develop RESTful HTTPS Server using |
| Grizzly and how to implement HTTPS Client using Jersey with server |
| authentication. |
| |
| Contents |
| -------- |
| |
| ### Server side |
| |
| This example consists of just one resource - RootResource, which is |
| basically copy of HelloWorld Resource from corresponding sample with |
| little improvement. |
| |
| Other classes are used to start Grizzly embedded server and set up its |
| authentication and authorization mechanism and keystore and truststore. |
| |
| ### Client side |
| |
| Client side is implemented as a test case, see class |
| **org.glassfish.jersey.examples.httpsclientservergrizzly.MainTest**, and |
| its method `testSSLWithAuth` (others are just tests for invalid |
| authorization). First thing you have to do if you want to communicate |
| with service via https is set up **SSLContext** which is basically |
| providing keystore and truststore. Keystore is used for storing own keys |
| and truststore is used for storing certificates to which you have |
| decided to trust. For more informations see [\[1\]](#JSSERefGuide). |
| |
| To set **SSLContext** on Jersey client you have to set it as a property |
| to the client instance: |
| |
| Client client = ClientFactory.newClient(); |
| client.configuration().setProperty(ClientProperties.SSL_CONTEXT, context); |
| |
| ### Certificates setup |
| |
| **These steps are not required to run this example. Pre-generated |
| keystore and truststore files are already present.** |
| |
| We needed set up few things to get this example working: |
| |
| - generate client and server keys |
| - generate client and server certificates |
| - import certificates to corresponding truststores |
| |
| Client certificate is needed too because we're going to use server-side |
| certificate authentication as well (yes, after this Http Basic |
| authentication seems to be kind of redundant but there are some usecases |
| where you might want to use them both). |
| Generate client key and store it into keystore:\ |
| |
| keytool -genkey -keystore ./keystore_client -alias clientKey -dname "CN=Client, OU=Jersey, O=Oracle Corporation, L=Prague, ST=Czech Republic, C=CZ" |
| |
| Generate client certificate (this will generate self-signed certificate; |
| if you have certification authority and want generate certificate |
| request, use keytool -certreq): |
| |
| keytool -export -alias clientKey -rfc -keystore ./keystore_client > ./client.cert |
| |
| Import client certificate to servers truststore: |
| |
| keytool -import -alias clientCert -file ./client.cert -keystore ./truststore_server |
| |
| These steps are similar for server side: |
| |
| keytool -genkey -keystore ./keystore_server -alias serverKey -dname "CN=localhost, OU=Jersey, O=Oracle Corporation, L=Prague, ST=Czech Republic, C=CZ" |
| keytool -export -alias serverKey -rfc -keystore ./keystore_server > ./server.cert |
| keytool -import -alias serverCert -file ./server.cert -keystore ./truststore_client |
| |
| Running the Example |
| ------------------- |
| |
| Run the example as follows: |
| |
| test |
| |
| > mvn clean test |
| |
| run |
| |
| > mvn compile exec:java |
| |
| From a web browser, visit:\ |
| **This won't work! \*** |
| |
| > `https://localhost:8463` |
| |
| **\[\*\]** Your web browser needs have and use generated client keys. Or |
| you have to disable server side client authentication - set NeedClientAuth to false: |
| **new SSLEngineConfigurator(sslContext).setClientMode(false).setNeedClientAuth(false)** in *Server.java*. |
| |
| Then ignore any security warning (self-signed certificates aren't trusted in general) |
| and login with username "user" and password "password". Text "JERSEY |
| HTTPS EXAMPLE" should appear. |
| |
| Mozila Firefox and Internet Explorer don't allow users to display any |
| content provided on behalf of any self-signed certificate so you have to |
| use some other browser which allows this (for example Safari or Opera). |
| |
| References |
| ---------- |
| |
| \[1\] |
| <http://download.oracle.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html> |