1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package org.apache.hc.client5.http.examples;
28
29 import java.security.cert.CertificateException;
30 import java.security.cert.X509Certificate;
31 import java.util.concurrent.Future;
32
33 import javax.net.ssl.SSLContext;
34 import javax.net.ssl.SSLSession;
35
36 import org.apache.hc.client5.http.async.methods.SimpleHttpRequest;
37 import org.apache.hc.client5.http.async.methods.SimpleHttpResponse;
38 import org.apache.hc.client5.http.async.methods.SimpleRequestBuilder;
39 import org.apache.hc.client5.http.async.methods.SimpleRequestProducer;
40 import org.apache.hc.client5.http.async.methods.SimpleResponseConsumer;
41 import org.apache.hc.client5.http.impl.async.CloseableHttpAsyncClient;
42 import org.apache.hc.client5.http.impl.async.HttpAsyncClients;
43 import org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManager;
44 import org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManagerBuilder;
45 import org.apache.hc.client5.http.protocol.HttpClientContext;
46 import org.apache.hc.client5.http.ssl.ClientTlsStrategyBuilder;
47 import org.apache.hc.core5.concurrent.FutureCallback;
48 import org.apache.hc.core5.http.HttpHost;
49 import org.apache.hc.core5.http.message.StatusLine;
50 import org.apache.hc.core5.http.nio.ssl.TlsStrategy;
51 import org.apache.hc.core5.io.CloseMode;
52 import org.apache.hc.core5.ssl.SSLContexts;
53 import org.apache.hc.core5.ssl.TrustStrategy;
54
55
56
57
58
59 public class AsyncClientCustomSSL {
60
61 public static void main(final String[] args) throws Exception {
62
63 final SSLContext sslcontext = SSLContexts.custom()
64 .loadTrustMaterial(new TrustStrategy() {
65
66 @Override
67 public boolean isTrusted(
68 final X509Certificate[] chain,
69 final String authType) throws CertificateException {
70 final X509Certificate cert = chain[0];
71 return "CN=httpbin.org".equalsIgnoreCase(cert.getSubjectDN().getName());
72 }
73
74 })
75 .build();
76 final TlsStrategy tlsStrategy = ClientTlsStrategyBuilder.create()
77 .setSslContext(sslcontext)
78
79
80
81
82
83
84
85
86
87
88
89
90 .build();
91
92 final PoolingAsyncClientConnectionManager cm = PoolingAsyncClientConnectionManagerBuilder.create()
93 .setTlsStrategy(tlsStrategy)
94 .build();
95 try (final CloseableHttpAsyncClient client = HttpAsyncClients.custom()
96 .setConnectionManager(cm)
97 .build()) {
98
99 client.start();
100
101 final HttpHost target = new HttpHost("https", "httpbin.org");
102 final HttpClientContext clientContext = HttpClientContext.create();
103
104 final SimpleHttpRequest request = SimpleRequestBuilder.get()
105 .setHttpHost(target)
106 .setPath("/")
107 .build();
108
109 System.out.println("Executing request " + request);
110 final Future<SimpleHttpResponse> future = client.execute(
111 SimpleRequestProducer.create(request),
112 SimpleResponseConsumer.create(),
113 clientContext,
114 new FutureCallback<SimpleHttpResponse>() {
115
116 @Override
117 public void completed(final SimpleHttpResponse response) {
118 System.out.println(request + "->" + new StatusLine(response));
119 final SSLSession sslSession = clientContext.getSSLSession();
120 if (sslSession != null) {
121 System.out.println("SSL protocol " + sslSession.getProtocol());
122 System.out.println("SSL cipher suite " + sslSession.getCipherSuite());
123 }
124 System.out.println(response.getBody());
125 }
126
127 @Override
128 public void failed(final Exception ex) {
129 System.out.println(request + "->" + ex);
130 }
131
132 @Override
133 public void cancelled() {
134 System.out.println(request + " cancelled");
135 }
136
137 });
138 future.get();
139
140 System.out.println("Shutting down");
141 client.close(CloseMode.GRACEFUL);
142 }
143 }
144
145 }