| [//]: # " 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> |