|
23 | 23 | import java.io.IOException;
|
24 | 24 | import java.io.InputStream;
|
25 | 25 | import java.lang.reflect.Method;
|
| 26 | +import java.security.KeyStore; |
26 | 27 | import java.security.cert.CertificateException;
|
27 | 28 | import java.security.cert.X509Certificate;
|
| 29 | +import java.util.ArrayList; |
| 30 | +import java.util.Arrays; |
| 31 | +import java.util.List; |
28 | 32 |
|
29 |
| -import javax.net.ssl.SSLContext; |
| 33 | +import javax.net.ssl.*; |
30 | 34 |
|
31 | 35 | import org.apache.commons.codec.binary.Base64;
|
32 | 36 | import org.apache.http.Header;
|
|
47 | 51 | import org.apache.http.conn.HttpClientConnectionManager;
|
48 | 52 | import org.apache.http.conn.socket.ConnectionSocketFactory;
|
49 | 53 | import org.apache.http.conn.socket.PlainConnectionSocketFactory;
|
| 54 | +import org.apache.http.conn.ssl.DefaultHostnameVerifier; |
50 | 55 | import org.apache.http.conn.ssl.NoopHostnameVerifier;
|
51 | 56 | import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
|
52 |
| -import org.apache.http.conn.ssl.TrustStrategy; |
53 | 57 | import org.apache.http.impl.auth.BasicScheme;
|
54 | 58 | import org.apache.http.impl.client.BasicAuthCache;
|
55 | 59 | import org.apache.http.impl.client.BasicCredentialsProvider;
|
56 | 60 | import org.apache.http.impl.client.CloseableHttpClient;
|
57 | 61 | import org.apache.http.impl.client.HttpClients;
|
58 | 62 | import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
|
59 |
| -import org.apache.http.ssl.SSLContextBuilder; |
60 | 63 |
|
61 | 64 | import com.aliyun.oss.ClientConfiguration;
|
62 | 65 | import com.aliyun.oss.ClientErrorCode;
|
@@ -232,23 +235,49 @@ protected CloseableHttpClient createHttpClient(HttpClientConnectionManager conne
|
232 | 235 | }
|
233 | 236 |
|
234 | 237 | protected HttpClientConnectionManager createHttpClientConnectionManager() {
|
235 |
| - SSLContext sslContext = null; |
| 238 | + SSLConnectionSocketFactory sslSocketFactory = null; |
236 | 239 | try {
|
237 |
| - sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() { |
| 240 | + List<TrustManager> trustManagerList = new ArrayList<TrustManager>(); |
| 241 | + X509TrustManager[] trustManagers = config.getX509TrustManagers(); |
238 | 242 |
|
239 |
| - @Override |
240 |
| - public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException { |
241 |
| - return true; |
| 243 | + if (null != trustManagers) { |
| 244 | + trustManagerList.addAll(Arrays.asList(trustManagers)); |
| 245 | + } |
| 246 | + |
| 247 | + // get trustManager using default certification from jdk |
| 248 | + TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); |
| 249 | + tmf.init((KeyStore) null); |
| 250 | + trustManagerList.addAll(Arrays.asList(tmf.getTrustManagers())); |
| 251 | + |
| 252 | + final List<X509TrustManager> finalTrustManagerList = new ArrayList<X509TrustManager>(); |
| 253 | + for (TrustManager tm : trustManagerList) { |
| 254 | + if (tm instanceof X509TrustManager) { |
| 255 | + finalTrustManagerList.add((X509TrustManager) tm); |
242 | 256 | }
|
| 257 | + } |
| 258 | + CompositeX509TrustManager compositeX509TrustManager = new CompositeX509TrustManager(finalTrustManagerList); |
| 259 | + compositeX509TrustManager.setVerifySSL(config.isVerifySSLEnable()); |
| 260 | + KeyManager[] keyManagers = null; |
| 261 | + if (config.getKeyManagers() != null) { |
| 262 | + keyManagers = config.getKeyManagers(); |
| 263 | + } |
243 | 264 |
|
244 |
| - }).build(); |
| 265 | + SSLContext sslContext = SSLContext.getInstance("TLS"); |
| 266 | + sslContext.init(keyManagers, new TrustManager[]{compositeX509TrustManager}, config.getSecureRandom()); |
245 | 267 |
|
| 268 | + HostnameVerifier hostnameVerifier = null; |
| 269 | + if (!config.isVerifySSLEnable()) { |
| 270 | + hostnameVerifier = new NoopHostnameVerifier(); |
| 271 | + } else if (config.getHostnameVerifier() != null) { |
| 272 | + hostnameVerifier = config.getHostnameVerifier(); |
| 273 | + } else { |
| 274 | + hostnameVerifier = new DefaultHostnameVerifier(); |
| 275 | + } |
| 276 | + sslSocketFactory = new SSLConnectionSocketFactory(sslContext, hostnameVerifier); |
246 | 277 | } catch (Exception e) {
|
247 | 278 | throw new ClientException(e.getMessage());
|
248 | 279 | }
|
249 | 280 |
|
250 |
| - SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContext, |
251 |
| - NoopHostnameVerifier.INSTANCE); |
252 | 281 | Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory> create()
|
253 | 282 | .register(Protocol.HTTP.toString(), PlainConnectionSocketFactory.getSocketFactory())
|
254 | 283 | .register(Protocol.HTTPS.toString(), sslSocketFactory).build();
|
@@ -314,4 +343,53 @@ private static Method getClassMethd(Class<?> clazz, String methodName) {
|
314 | 343 | } catch (Exception e) {
|
315 | 344 | }
|
316 | 345 | }
|
| 346 | + |
| 347 | + private class CompositeX509TrustManager implements X509TrustManager { |
| 348 | + |
| 349 | + private final List<X509TrustManager> trustManagers; |
| 350 | + private boolean verifySSL = true; |
| 351 | + |
| 352 | + public boolean isVerifySSL() { |
| 353 | + return this.verifySSL; |
| 354 | + } |
| 355 | + |
| 356 | + public void setVerifySSL(boolean verifySSL) { |
| 357 | + this.verifySSL = verifySSL; |
| 358 | + } |
| 359 | + |
| 360 | + public CompositeX509TrustManager(List<X509TrustManager> trustManagers) { |
| 361 | + this.trustManagers = trustManagers; |
| 362 | + } |
| 363 | + |
| 364 | + @Override |
| 365 | + public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { |
| 366 | + // do nothing |
| 367 | + } |
| 368 | + |
| 369 | + @Override |
| 370 | + public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { |
| 371 | + if (!verifySSL) { |
| 372 | + return; |
| 373 | + } |
| 374 | + for (X509TrustManager trustManager : trustManagers) { |
| 375 | + try { |
| 376 | + trustManager.checkServerTrusted(chain, authType); |
| 377 | + return; // someone trusts them. success! |
| 378 | + } catch (CertificateException e) { |
| 379 | + // maybe someone else will trust them |
| 380 | + } |
| 381 | + } |
| 382 | + throw new CertificateException("None of the TrustManagers trust this certificate chain"); |
| 383 | + } |
| 384 | + |
| 385 | + @Override |
| 386 | + public X509Certificate[] getAcceptedIssuers() { |
| 387 | + List<X509Certificate> certificates = new ArrayList<X509Certificate>(); |
| 388 | + for (X509TrustManager trustManager : trustManagers) { |
| 389 | + certificates.addAll(Arrays.asList(trustManager.getAcceptedIssuers())); |
| 390 | + } |
| 391 | + X509Certificate[] certificatesArray = new X509Certificate[certificates.size()]; |
| 392 | + return certificates.toArray(certificatesArray); |
| 393 | + } |
| 394 | + } |
317 | 395 | }
|
0 commit comments