18
18
import com .ning .http .client .AsyncHttpClient ;
19
19
import com .ning .http .client .AsyncHttpClientConfig .Builder ;
20
20
import com .ning .http .client .Response ;
21
+
21
22
import org .eclipse .jetty .server .Request ;
22
23
import org .eclipse .jetty .server .Server ;
23
24
import org .eclipse .jetty .server .handler .AbstractHandler ;
34
35
import javax .net .ssl .SSLContext ;
35
36
import javax .net .ssl .SSLHandshakeException ;
36
37
import javax .net .ssl .TrustManager ;
38
+ import javax .net .ssl .TrustManagerFactory ;
37
39
import javax .net .ssl .X509TrustManager ;
38
40
import javax .servlet .ServletException ;
39
41
import javax .servlet .http .HttpServletRequest ;
40
42
import javax .servlet .http .HttpServletResponse ;
43
+
41
44
import java .io .File ;
42
45
import java .io .IOException ;
43
46
import java .io .InputStream ;
44
47
import java .net .ConnectException ;
45
48
import java .net .ServerSocket ;
46
49
import java .net .URL ;
50
+ import java .security .GeneralSecurityException ;
47
51
import java .security .KeyStore ;
48
52
import java .security .SecureRandom ;
49
53
import java .security .cert .CertificateException ;
@@ -207,7 +211,7 @@ public void setUpGlobal() throws Exception {
207
211
208
212
@ Test (groups = { "standalone" , "default_provider" })
209
213
public void zeroCopyPostTest () throws Throwable {
210
- final AsyncHttpClient client = getAsyncHttpClient (new Builder ().setSSLContext (createSSLContext ()).build ());
214
+ final AsyncHttpClient client = getAsyncHttpClient (new Builder ().setSSLContext (createSSLContext (new AtomicBoolean ( true ) )).build ());
211
215
try {
212
216
ClassLoader cl = getClass ().getClassLoader ();
213
217
// override system properties
@@ -226,7 +230,7 @@ public void zeroCopyPostTest() throws Throwable {
226
230
227
231
@ Test (groups = { "standalone" , "default_provider" })
228
232
public void multipleSSLRequestsTest () throws Throwable {
229
- final AsyncHttpClient c = getAsyncHttpClient (new Builder ().setSSLContext (createSSLContext ()).build ());
233
+ final AsyncHttpClient c = getAsyncHttpClient (new Builder ().setSSLContext (createSSLContext (new AtomicBoolean ( true ) )).build ());
230
234
try {
231
235
String body = "hello there" ;
232
236
@@ -246,7 +250,7 @@ public void multipleSSLRequestsTest() throws Throwable {
246
250
247
251
@ Test (groups = { "standalone" , "default_provider" })
248
252
public void multipleSSLWithoutCacheTest () throws Throwable {
249
- final AsyncHttpClient c = getAsyncHttpClient (new Builder ().setSSLContext (createSSLContext ()).setAllowSslConnectionPool (false ).build ());
253
+ final AsyncHttpClient c = getAsyncHttpClient (new Builder ().setSSLContext (createSSLContext (new AtomicBoolean ( true ) )).setAllowSslConnectionPool (false ).build ());
250
254
try {
251
255
String body = "hello there" ;
252
256
c .preparePost (getTargetUrl ()).setBody (body ).setHeader ("Content-Type" , "text/html" ).execute ();
@@ -262,55 +266,72 @@ public void multipleSSLWithoutCacheTest() throws Throwable {
262
266
}
263
267
264
268
@ Test (groups = { "standalone" , "default_provider" })
265
- public void reconnectsAfterFailedCertificationPath () throws Throwable {
266
- final AsyncHttpClient c = getAsyncHttpClient (new Builder ().setSSLContext (createSSLContext ()).build ());
269
+ public void reconnectsAfterFailedCertificationPath () throws Exception {
270
+
271
+ AtomicBoolean trust = new AtomicBoolean (false );
272
+ AsyncHttpClient c = getAsyncHttpClient (new Builder ().setSSLContext (createSSLContext (trust )).build ());
267
273
try {
268
- final String body = "hello there" ;
274
+ String body = "hello there" ;
269
275
270
- TRUST_SERVER_CERT .set (false );
276
+ // first request fails because server certificate is rejected
277
+ Throwable cause = null ;
271
278
try {
272
- // first request fails because server certificate is rejected
273
- try {
274
- c .preparePost (getTargetUrl ()).setBody (body ).setHeader ("Content-Type" , "text/html" ).execute ().get (TIMEOUT , TimeUnit .SECONDS );
275
- } catch (final ExecutionException e ) {
276
- Throwable cause = e .getCause ();
277
- if (cause instanceof ConnectException ) {
278
- assertNotNull (cause .getCause ());
279
- assertTrue (cause .getCause () instanceof SSLHandshakeException );
280
- } else {
281
- assertTrue (cause instanceof SSLHandshakeException );
282
- }
279
+ c .preparePost (getTargetUrl ()).setBody (body ).setHeader ("Content-Type" , "text/html" ).execute ().get (TIMEOUT , TimeUnit .SECONDS );
280
+ } catch (final ExecutionException e ) {
281
+ cause = e .getCause ();
282
+ if (cause instanceof ConnectException ) {
283
+ //assertNotNull(cause.getCause());
284
+ assertTrue (cause .getCause () instanceof SSLHandshakeException , "Expected an SSLHandshakeException, got a " + cause .getCause ());
285
+ } else {
286
+ assertTrue (cause instanceof IOException , "Expected an IOException, got a " + cause );
283
287
}
288
+ } catch (Exception e ) {
289
+ System .err .println ("WTF" + e .getMessage ());
290
+ }
291
+ assertNotNull (cause );
284
292
285
- TRUST_SERVER_CERT .set (true );
286
-
287
- // second request should succeed
288
- final Response response = c .preparePost (getTargetUrl ()).setBody (body ).setHeader ("Content-Type" , "text/html" ).execute ().get (TIMEOUT , TimeUnit .SECONDS );
293
+ // second request should succeed
294
+ trust .set (true );
295
+ Response response = c .preparePost (getTargetUrl ()).setBody (body ).setHeader ("Content-Type" , "text/html" ).execute ().get (TIMEOUT , TimeUnit .SECONDS );
289
296
290
- assertEquals (response .getResponseBody (), body );
291
- } finally {
292
- TRUST_SERVER_CERT .set (true );
293
- }
297
+ assertEquals (response .getResponseBody (), body );
294
298
} finally {
295
299
c .close ();
296
300
}
297
301
}
298
302
299
- private static SSLContext createSSLContext () {
303
+ private static KeyManager [] createKeyManagers () throws GeneralSecurityException , IOException {
304
+ InputStream keyStoreStream = Thread .currentThread ().getContextClassLoader ().getResourceAsStream ("ssltest-cacerts.jks" );
305
+ char [] keyStorePassword = "changeit" .toCharArray ();
306
+ KeyStore ks = KeyStore .getInstance ("JKS" );
307
+ ks .load (keyStoreStream , keyStorePassword );
308
+ assert (ks .size () > 0 );
309
+
310
+ // Set up key manager factory to use our key store
311
+ char [] certificatePassword = "changeit" .toCharArray ();
312
+ KeyManagerFactory kmf = KeyManagerFactory .getInstance ("SunX509" );
313
+ kmf .init (ks , certificatePassword );
314
+
315
+ // Initialize the SSLContext to work with our key managers.
316
+ return kmf .getKeyManagers ();
317
+ }
318
+
319
+ private static TrustManager [] createTrustManagers () throws GeneralSecurityException , IOException {
320
+ InputStream keyStoreStream = Thread .currentThread ().getContextClassLoader ().getResourceAsStream ("ssltest-keystore.jks" );
321
+ char [] keyStorePassword = "changeit" .toCharArray ();
322
+ KeyStore ks = KeyStore .getInstance ("JKS" );
323
+ ks .load (keyStoreStream , keyStorePassword );
324
+ assert (ks .size () > 0 );
325
+
326
+ TrustManagerFactory tmf = TrustManagerFactory .getInstance (TrustManagerFactory .getDefaultAlgorithm ());
327
+ tmf .init (ks );
328
+ return tmf .getTrustManagers ();
329
+ }
330
+
331
+ public static SSLContext createSSLContext (AtomicBoolean trust ) {
300
332
try {
301
- InputStream keyStoreStream = BasicHttpsTest .class .getResourceAsStream ("ssltest-cacerts.jks" );
302
- char [] keyStorePassword = "changeit" .toCharArray ();
303
- KeyStore ks = KeyStore .getInstance ("JKS" );
304
- ks .load (keyStoreStream , keyStorePassword );
305
-
306
- // Set up key manager factory to use our key store
307
- char [] certificatePassword = "changeit" .toCharArray ();
308
- KeyManagerFactory kmf = KeyManagerFactory .getInstance ("SunX509" );
309
- kmf .init (ks , certificatePassword );
310
-
311
- // Initialize the SSLContext to work with our key managers.
312
- KeyManager [] keyManagers = kmf .getKeyManagers ();
313
- TrustManager [] trustManagers = new TrustManager [] { DUMMY_TRUST_MANAGER };
333
+ KeyManager [] keyManagers = createKeyManagers ();
334
+ TrustManager [] trustManagers = new TrustManager [] { dummyTrustManager (trust , (X509TrustManager ) createTrustManagers ()[0 ]) };
314
335
SecureRandom secureRandom = new SecureRandom ();
315
336
316
337
SSLContext sslContext = SSLContext .getInstance ("TLS" );
@@ -322,20 +343,39 @@ private static SSLContext createSSLContext() {
322
343
}
323
344
}
324
345
325
- private static final AtomicBoolean TRUST_SERVER_CERT = new AtomicBoolean (true );
326
- private static final TrustManager DUMMY_TRUST_MANAGER = new X509TrustManager () {
327
- public X509Certificate [] getAcceptedIssuers () {
328
- return new X509Certificate [0 ];
346
+ public static class DummyTrustManager implements X509TrustManager {
347
+
348
+ private final X509TrustManager tm ;
349
+ private final AtomicBoolean trust ;
350
+
351
+ public DummyTrustManager (final AtomicBoolean trust , final X509TrustManager tm ) {
352
+ this .trust = trust ;
353
+ this .tm = tm ;
329
354
}
330
355
331
- public void checkClientTrusted (X509Certificate [] chain , String authType ) throws CertificateException {
356
+ @ Override
357
+ public void checkClientTrusted (X509Certificate [] chain , String authType )
358
+ throws CertificateException {
359
+ tm .checkClientTrusted (chain , authType );
332
360
}
333
361
334
- public void checkServerTrusted (X509Certificate [] chain , String authType ) throws CertificateException {
335
- if (!TRUST_SERVER_CERT .get ()) {
362
+ @ Override
363
+ public void checkServerTrusted (X509Certificate [] chain , String authType )
364
+ throws CertificateException {
365
+ if (!trust .get ()) {
336
366
throw new CertificateException ("Server certificate not trusted." );
337
367
}
368
+ tm .checkServerTrusted (chain , authType );
338
369
}
339
- };
340
370
371
+ @ Override
372
+ public X509Certificate [] getAcceptedIssuers () {
373
+ return tm .getAcceptedIssuers ();
374
+ }
375
+ }
376
+
377
+ private static TrustManager dummyTrustManager (final AtomicBoolean trust , final X509TrustManager tm ) {
378
+ return new DummyTrustManager (trust , tm );
379
+
380
+ }
341
381
}
0 commit comments