创建一个配置为信任所有HTTPS连接的RestTemplate实例,不验证服务器的SSL证书。这个示例主要用于测试或开发环境,对接第三方接口时一直提示SSL证书校验异常,可通过下面的方法绕过校验:
这个配置类使用背景:可参考博客:
springboot 使用restTemplate 发送https请求 忽略ssl证书
https://jsonll.blog.csdn.net/article/details/129191580?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-1-129191580-blog-83038086.235%5Ev43%5Epc_blog_bottom_relevance_base2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-1-129191580-blog-83038086.235%5Ev43%5Epc_blog_bottom_relevance_base2&utm_relevant_index=2
public class RestTemplateUtilTool { public static RestTemplate restTemplateHttps() { RestTemplate restTemplateTool = null; try { TrustStrategy acceptingTrustStrategy = (chain, authType) -> true; SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, acceptingTrustStrategy).build(); SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE); HttpClientBuilder clientBuilder = HttpClients.custom(); CloseableHttpClient httpClient = clientBuilder.setSSLSocketFactory(sslsf).build(); HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(); requestFactory.setHttpClient(httpClient); restTemplateTool = new RestTemplate(requestFactory); } catch (Exception e) { e.printStackTrace(); } return restTemplateTool; }
这个RestTemplateUtil
类中的restTemplateHttps
方法是为了创建一个配置为信任所有HTTPS连接的RestTemplate
实例。让我为你逐步解释它都在做什么:
-
定义变量:
RestTemplate restTemplate = null;
: 初始化一个RestTemplate
变量,并将其设置为null。
-
设置信任所有证书的TrustStrategy:
TrustStrategy acceptingTrustStrategy = (chain, authType) -> true;
: 这是一个Lambda表达式,它定义了一个TrustStrategy
,该策略简单地返回true
,表示它信任所有证书,无论它们是否有效或来自受信任的颁发机构。
-
创建SSL上下文:
- 使用
SSLContexts.custom().loadTrustMaterial(null, acceptingTrustStrategy).build();
,基于前面定义的信任策略,创建一个SSLContext
实例。
- 使用
-
创建SSL连接套接字工厂:
- 使用
SSLConnectionSocketFactory
,它使用前面创建的SSLContext
和一个NoopHostnameVerifier
(不执行任何主机名验证)。这意味着HTTPS连接不会检查主机名是否与证书中的主机名匹配。
- 使用
-
配置HttpClientBuilder:
- 使用
HttpClients.custom()
创建一个HttpClientBuilder
实例。 - 使用
setSSLSocketFactory(sslsf)
将之前创建的SSLConnectionSocketFactory
设置为HTTP客户端的SSL套接字工厂。 - 使用
build()
方法构建CloseableHttpClient
实例。
- 使用
-
配置RestTemplate的HTTP请求工厂:
- 创建一个
HttpComponentsClientHttpRequestFactory
实例。 - 使用
setHttpClient(httpClient)
方法将之前创建的CloseableHttpClient
实例设置为请求工厂的HTTP客户端。
- 创建一个
-
创建RestTemplate实例:
- 使用配置好的
HttpComponentsClientHttpRequestFactory
实例来创建一个新的RestTemplate
实例。
- 使用配置好的
-
异常处理:
- 如果在上面的任何步骤中发生异常,它都会被捕获并打印到标准错误输出(
e.printStackTrace()
)。
- 如果在上面的任何步骤中发生异常,它都会被捕获并打印到标准错误输出(
-
返回RestTemplate实例:
- 最后,方法返回配置好的
RestTemplate
实例。如果发生异常,它将返回null(这通常不是一个好主意,因为调用者可能会在没有检查null的情况下使用这个值,从而导致NullPointerException
)。
- 最后,方法返回配置好的
注意:这种方法应该谨慎使用,因为它会使你的应用程序容易受到中间人攻击(MITM)。在生产环境中,你应该始终验证服务器的SSL证书。这个示例主要用于测试或开发环境,其中你可能需要绕过SSL证书验证。
可见链接:
RestTemplete 忽略安全证书
https://blog.csdn.net/nmjhehe/article/details/83038086?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1-83038086-blog-117602595.235^v43^pc_blog_bottom_relevance_base2&spm=1001.2101.3001.4242.2&utm_relevant_index=4![](https://images.cnblogs.com/cnblogs_com/isme-zjh/1665628/t_200309175526zhifubao.png?a=1583807649478)
您的资助是我最大的动力!
金额随意,欢迎来赏!