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