【SSL证书校验】Java Client 忽略对服务端的SSL证书校验

背景

在某些特殊的项目中虽然使用了HTTPS,但其证书管理又不是采用常规模式,如服务端用了个自签名的证书。

很多组织的内部项目因为各种原因采用了这种方式。(先不深挖这种模式的利弊)

这种情况下,大多数HTTP客户端工具或框架都默认禁止此类证书。

为了让客户端忽略SSL证书校验,需要额外的客户端代码设置。

实现方式

本文针对两种Java常见HTTP客户端请求方式,提供实现样例。

HttpClient(org.apache.http.client)

简单直接的方式

Java代码

 

  1. SSLContext sslContext = SSLContextBuilder.create()  

  2.     .loadTrustMaterial((chain, authType) -> true)  

  3.     .build();  

  4.   

  5. HttpClient httpClient = HttpClients.custom()  

  6.     .setSSLContext(sslContext)  

  7.     .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)  

  8.     .build();  

复杂的方式——更多自定义配置

HttpClient只是个Interface,这里可自定义的内容非常多。

如,我们可以通过工具类 HttpClientBuilder 来设置各种细节,最终构建出一个 HttpClient。

此处仅提供一些简单的示例。真实项目中需具体问题具体分析,设置合适的策略。

Java代码

 

  1. SSLContext sslContext = new SSLContextBuilder()  

  2.     .loadTrustMaterial(null, (chain, authType) -> true)  

  3.     .build();  

  4.   

  5. SSLConnectionSocketFactory sslConnectionSocketFactory =  

  6.     new SSLConnectionSocketFactory(  

  7.         sslContext,  

  8.         // 添加你想支持的协议  

  9.         new String[]{"SSLv2Hello", "SSLv3", "TLSv1", "TLSv1.2"},  

  10.         null,  

  11.         NoopHostnameVerifier.INSTANCE);  

  12. // 或其它重载方法,如:  

  13. // new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE)  

  14.   

  15. Registry socketFactoryRegistry =  

  16.     RegistryBuilder.create()  

  17.         .register("http", PlainConnectionSocketFactory.INSTANCE)  

  18.         .register("https", sslConnectionSocketFactory)  

  19.         .build();  

  20.   

  21. PoolingHttpClientConnectionManager connectionManager =  

  22.     new PoolingHttpClientConnectionManager(socketFactoryRegistry);  

  23.   

  24. HttpClient httpClient = HttpClients.custom()  

  25.     .setConnectionManager(connectionManager)  

  26.     .build();  

RestTemplate(org.springframework.web.client)

步骤1:参照前文所述的HttpClient,创建一个HttpClient实例

步骤2:创建RestTemplate实例

Java代码

 

  1. // httpClient 是步骤1中创建的  

  2. HttpComponentsClientHttpRequestFactory requestFactory =  

  3.     new HttpComponentsClientHttpRequestFactory(httpClient);  

  4.   

  5. RestTemplate restTemplate = new RestTemplate(requestFactory);  

发布了219 篇原创文章 · 获赞 3 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/hchaoh/article/details/103906487
今日推荐