SpringBoot3使用RestTemplate请求接口忽略SSL证书的问题解决

 更新时间:2025年10月23日 09:27:00   作者:小猿、  
本文主要介绍了SpringBoot3使用RestTemplate请求接口忽略SSL证书的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

概述

我在项目中使用SpringBoot3版本+中RestTemplate请求接口时候报错:

PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to fin

注意:springBoot3版本+RestTemplate对应的是spring-web-6.+版本旧版本不适用以下解决方案,构建RestTemplateConfigl类可能会找不到对应方法!!!

错误原因

在使用 RestTemplate 调用 HTTPS 接口时,出现 PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 错误,通常是因为 Java 应用程序无法验证服务器的 SSL 证书。

具体原因如下:

  • 证书不受信任:Java 的默认信任库(cacerts)中没有包含服务器使用的 SSL 证书或中间证书。Java 使用这个信任库来验证服务器的证书链。
  • 自签名证书:如果服务器使用的是自签名证书,而不是由受信任的证书颁发机构(CA)签发的证书,Java 默认不会信任这种证书。
  • 证书链不完整:服务器的 SSL 证书链不完整,缺少中间证书,导致 Java 无法构建完整的证书路径。

解决方案

1. 将服务器证书添加到 Java 的信任库

如果服务器使用的是自签名证书或不受信任的证书,可以将该证书添加到 Java 的信任库中。

步骤:

获取服务器证书

  • 使用浏览器访问目标 HTTPS 接口,导出服务器的 SSL 证书。
  • 或者使用 openssl 命令获取证书:
openssl s_client -connect <服务器地址>:443 -showcerts

    将输出中的证书部分保存为 .crt 文件。

    将证书导入 Java 信任库

    • 找到 Java 的 cacerts 文件,通常位于 $JAVA_HOME/lib/security/cacerts
    • 使用 keytool 将证书导入信任库:
    keytool -import -trustcacerts -file <证书文件> -keystore $JAVA_HOME/lib/security/cacerts -alias <别名>

    默认密码是 changeit

    重启应用程序:确保应用程序重新加载信任库。

    2. 忽略 SSL 证书验证(不推荐)

    如果你在开发环境中,且不关心证书验证,可以临时忽略 SSL 证书验证。注意:这种方法不安全,不推荐在生产环境中使用。

    步骤:

    自定义 RestTemplate:

    • 创建一个自定义的 SSLContext,忽略证书验证。
    • 使用 NoopHostnameVerifier 忽略主机名验证。
    import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
    import org.apache.hc.client5.http.impl.classic.HttpClients;
    import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder;
    import org.apache.hc.client5.http.ssl.NoopHostnameVerifier;
    import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactoryBuilder;
    import org.apache.hc.client5.http.ssl.TrustAllStrategy;
    import org.apache.hc.core5.ssl.SSLContextBuilder;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.http.client.ClientHttpRequestFactory;
    import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
    import org.springframework.web.client.RestTemplate;
    
    import java.security.KeyManagementException;
    import java.security.KeyStoreException;
    import java.security.NoSuchAlgorithmException;
    
    
    @Configuration
    public class RestTemplateConfig {
    
        @Bean
        public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
            return new RestTemplate(factory);
        }
    
        @Bean
        public ClientHttpRequestFactory simpleClientHttpRequestFactory() throws Exception {
            HttpComponentsClientHttpRequestFactory factory = generateHttpRequestFactory();
            factory.setConnectTimeout(15000);
            factory.setConnectionRequestTimeout(5000);
            return factory;
        }
    
        /**
         * 构造跳过SSL ClientHttp工厂
         *
         * @return
         * @throws NoSuchAlgorithmException
         * @throws KeyManagementException
         * @throws KeyStoreException
         */
        public static HttpComponentsClientHttpRequestFactory generateHttpRequestFactory()
                throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException {
            CloseableHttpClient httpclient = HttpClients.custom()
                    .setConnectionManager(PoolingHttpClientConnectionManagerBuilder.create()
                            .setSSLSocketFactory(SSLConnectionSocketFactoryBuilder.create()
                                    .setSslContext(SSLContextBuilder.create()
                                            .loadTrustMaterial(TrustAllStrategy.INSTANCE)
                                            .build())
                                    .setHostnameVerifier(NoopHostnameVerifier.INSTANCE)
                                    .build())
                            .build())
                    .build();
            HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
            factory.setHttpClient(httpclient);
            return factory;
        }
    }

    使用自定义的 RestTemplate:

    在调用 HTTPS 接口时,使用上述方法创建的 RestTemplate

    3. 使用受信任的证书

    如果可能,建议使用由受信任的 CA 签发的证书,而不是自签名证书。这样可以避免证书验证问题。

    总结

    • 推荐方案:将服务器证书添加到 Java 的信任库中,确保证书链完整且受信任。
    • 临时方案:在开发环境中,可以临时忽略 SSL 证书验证,但不建议在生产环境中使用。
    • 最佳实践:使用受信任的 CA 签发的证书,确保 SSL/TLS 通信的安全性。

    到此这篇关于SpringBoot3使用RestTemplate请求接口忽略SSL证书的问题解决的文章就介绍到这了,更多相关SpringBoot3 RestTemplate忽略SSL证书内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    相关文章

    • java 微信随机红包算法代码实例

      java 微信随机红包算法代码实例

      这篇文章主要介绍了java 微信随机红包算法的相关资料,并附实例代码,需要的朋友可以参考下
      2016-10-10
    • 一文理清什么是BIO以及如何使用

      一文理清什么是BIO以及如何使用

      这篇文章主要介绍了什么是BIO以及如何使用,BIO英文全名是blockingIO,也叫做阻塞IO,是最容易理解、最容易实现的IO工作方式,本文就来通过一些简单的示例为大家讲讲BIO吧,需要的朋友可以参考下
      2023-10-10
    • springboot项目中引入本地依赖jar包并打包到lib文件夹中

      springboot项目中引入本地依赖jar包并打包到lib文件夹中

      这篇文章主要介绍了springboot项目中引入本地依赖jar包,如何打包到lib文件夹中,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
      2023-04-04
    • MyBatis编写嵌套子查询的动态SQL实践详解

      MyBatis编写嵌套子查询的动态SQL实践详解

      在Java生态中,MyBatis作为一款优秀的ORM框架,广泛应用于数据库操作,本文将深入探讨如何在MyBatis中编写嵌套子查询的动态SQL,并结合实际案例分析其应用场景与实现技巧
      2025-06-06
    • springmvc与mybatis集成配置实例详解

      springmvc与mybatis集成配置实例详解

      这篇文章主要介绍了springmvc与mybatis集成配置实例详解的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
      2016-09-09
    • 2023最新版本idea用maven新建web项目(亲测不报错)

      2023最新版本idea用maven新建web项目(亲测不报错)

      这篇文章主要给大家介绍了关于2023最新版本idea用maven新建web项目,Maven是当今Java开发中主流的依赖管理工具,文中介绍的步骤亲测不报错,需要的朋友可以参考下
      2023-07-07
    • Spring boot中限制 Mybatis SQL日志的大字段输出问题

      Spring boot中限制 Mybatis SQL日志的大字段输出问题

      文章介绍Springboot中MyBatis SQL日志因大字段输出导致日志膨胀及JVM内存问题,建议通过Logback或Log4j2自定义Converter/Filter实现参数截断或脱敏,或调整日志级别限制调试信息,本文给大家介绍Spring boot中限制Mybatis SQL日志的大字段输出问题,感兴趣的朋友一起看看吧
      2025-10-10
    • java报错:“错误:编码GBK 的不可映射字符”解决办法

      java报错:“错误:编码GBK 的不可映射字符”解决办法

      当Java源代码中包含中文字符时,我们在用javac编译时会出现“错误:编码GBK的不可映射字符”,这篇文章主要给大家介绍了关于java报错:“错误:编码GBK 的不可映射字符”的解决办法,需要的朋友可以参考下
      2024-08-08
    • Java并发编程之常用的多线程实现方式分析

      Java并发编程之常用的多线程实现方式分析

      这篇文章主要介绍了Java并发编程之常用的多线程实现方式,结合实例形式分析了java并发编程中多线程的相关原理、实现方法与操作注意事项,需要的朋友可以参考下
      2020-02-02
    • springboot读取bootstrap配置及knife4j版本兼容性问题及解决

      springboot读取bootstrap配置及knife4j版本兼容性问题及解决

      这篇文章主要介绍了springboot读取bootstrap配置及knife4j版本兼容性问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
      2024-06-06

    最新评论