3838import com .sun .net .httpserver .HttpsServer ;
3939
4040import org .apache .hc .core5 .http .HttpHost ;
41+ import org .apache .hc .core5 .ssl .SSLContextBuilder ;
4142import org .junit .AfterClass ;
4243import org .junit .BeforeClass ;
4344
4445import javax .net .ssl .KeyManagerFactory ;
4546import javax .net .ssl .SSLContext ;
46- import javax .net .ssl .SSLHandshakeException ;
47+ import javax .net .ssl .SSLException ;
4748import javax .net .ssl .TrustManagerFactory ;
4849
4950import java .io .IOException ;
5051import java .io .InputStream ;
5152import java .net .InetAddress ;
5253import java .net .InetSocketAddress ;
53- import java .nio .file .Files ;
54- import java .nio .file .Paths ;
5554import java .security .AccessController ;
56- import java .security .KeyFactory ;
5755import java .security .KeyStore ;
5856import java .security .PrivilegedAction ;
59- import java .security .cert .Certificate ;
60- import java .security .cert .CertificateFactory ;
61- import java .security .spec .PKCS8EncodedKeySpec ;
57+ import java .security .SecureRandom ;
6258
6359import static org .hamcrest .Matchers .instanceOf ;
6460import static org .junit .Assert .assertEquals ;
@@ -75,7 +71,7 @@ public class RestClientBuilderIntegTests extends RestClientTestCase {
7571 @ BeforeClass
7672 public static void startHttpServer () throws Exception {
7773 httpsServer = HttpsServer .create (new InetSocketAddress (InetAddress .getLoopbackAddress (), 0 ), 0 );
78- httpsServer .setHttpsConfigurator (new HttpsConfigurator (getSslContext ()));
74+ httpsServer .setHttpsConfigurator (new HttpsConfigurator (getSslContext (true )));
7975 httpsServer .createContext ("/" , new ResponseHandler ());
8076 httpsServer .start ();
8177 }
@@ -103,11 +99,11 @@ public void testBuilderUsesDefaultSSLContext() throws Exception {
10399 client .performRequest (new Request ("GET" , "/" ));
104100 fail ("connection should have been rejected due to SSL handshake" );
105101 } catch (Exception e ) {
106- assertThat (e , instanceOf (SSLHandshakeException .class ));
102+ assertThat (e . getCause () , instanceOf (SSLException .class ));
107103 }
108104 }
109105
110- SSLContext .setDefault (getSslContext ());
106+ SSLContext .setDefault (getSslContext (false ));
111107 try (RestClient client = buildRestClient ()) {
112108 Response response = client .performRequest (new Request ("GET" , "/" ));
113109 assertEquals (200 , response .getStatusLine ().getStatusCode ());
@@ -122,34 +118,37 @@ private RestClient buildRestClient() {
122118 return RestClient .builder (new HttpHost ("https" , address .getHostString (), address .getPort ())).build ();
123119 }
124120
125- private static SSLContext getSslContext () throws Exception {
126- SSLContext sslContext = SSLContext .getInstance (getProtocol ());
121+ private static SSLContext getSslContext (boolean server ) throws Exception {
122+ SSLContext sslContext ;
123+ char [] password = "password" .toCharArray ();
124+ SecureRandom secureRandom = SecureRandom .getInstance ("DEFAULT" , "BCFIPS" );
125+ String fileExtension = ".jks" ;
126+
127127 try (
128- InputStream certFile = RestClientBuilderIntegTests .class .getResourceAsStream ("/test.crt" );
129- InputStream keyStoreFile = RestClientBuilderIntegTests .class .getResourceAsStream ("/test_truststore.jks" )
128+ InputStream trustStoreFile = RestClientBuilderIntegTests .class .getResourceAsStream ("/test_truststore" + fileExtension );
129+ InputStream keyStoreFile = RestClientBuilderIntegTests .class .getResourceAsStream ("/testks" + fileExtension )
130130 ) {
131- // Build a keystore of default type programmatically since we can't use JKS keystores to
132- // init a KeyManagerFactory in FIPS 140 JVMs.
133- KeyStore keyStore = KeyStore .getInstance (KeyStore .getDefaultType ());
134- keyStore .load (null , "password" .toCharArray ());
135- CertificateFactory certFactory = CertificateFactory .getInstance ("X.509" );
136- PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec (
137- Files .readAllBytes (Paths .get (RestClientBuilderIntegTests .class .getResource ("/test.der" ).toURI ()))
138- );
139- KeyFactory keyFactory = KeyFactory .getInstance ("RSA" );
140- keyStore .setKeyEntry (
141- "mykey" ,
142- keyFactory .generatePrivate (privateKeySpec ),
143- "password" .toCharArray (),
144- new Certificate [] { certFactory .generateCertificate (certFile ) }
145- );
146- KeyManagerFactory kmf = KeyManagerFactory .getInstance (KeyManagerFactory .getDefaultAlgorithm ());
147- kmf .init (keyStore , "password" .toCharArray ());
131+ KeyStore keyStore = KeyStore .getInstance ("JKS" );
132+ keyStore .load (keyStoreFile , password );
133+ KeyManagerFactory kmf = KeyManagerFactory .getInstance ("PKIX" , "BCJSSE" );
134+ kmf .init (keyStore , password );
135+
148136 KeyStore trustStore = KeyStore .getInstance ("JKS" );
149- trustStore .load (keyStoreFile , " password" . toCharArray () );
150- TrustManagerFactory tmf = TrustManagerFactory .getInstance (TrustManagerFactory . getDefaultAlgorithm () );
137+ trustStore .load (trustStoreFile , password );
138+ TrustManagerFactory tmf = TrustManagerFactory .getInstance ("PKIX" , "BCJSSE" );
151139 tmf .init (trustStore );
152- sslContext .init (kmf .getKeyManagers (), tmf .getTrustManagers (), null );
140+
141+ SSLContextBuilder sslContextBuilder = SSLContextBuilder .create ()
142+ .setProvider ("BCJSSE" )
143+ .setProtocol (getProtocol ())
144+ .setSecureRandom (secureRandom );
145+
146+ if (server ) {
147+ sslContextBuilder .loadKeyMaterial (keyStore , password );
148+ }
149+ sslContextBuilder .loadTrustMaterial (trustStore , null );
150+ sslContext = sslContextBuilder .build ();
151+
153152 }
154153 return sslContext ;
155154 }
0 commit comments