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证书内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    相关文章

    • SpringBoot项目如何修改Tomcat版本号

      SpringBoot项目如何修改Tomcat版本号

      本文介绍了Spring Boot项目默认使用内嵌Tomcat Servlet容器打包部署,通过添加指定版本的Tomcat GA依赖,可以修改默认版本号,对于jar包和war包形式的部署,无需排除内置Tomcat,此经验为个人见解,仅供参考
      2026-04-04
    • SpringCloud Stream 快速入门实例教程

      SpringCloud Stream 快速入门实例教程

      本文介绍了Spring Cloud Stream(SCS)组件在分布式系统中的作用,以及如何集成到Spring Boot项目中,通过SCS,可以统一管理不同的消息队列中间件,并提供了更高级的抽象,感兴趣的朋友跟随小编一起看看吧
      2025-11-11
    • SpringBoot中的bean管理示例详解

      SpringBoot中的bean管理示例详解

      这篇文章主要介绍了SpringBoot中的bean管理,本文结合示例代码给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
      2023-06-06
    • spring mvc 使用kaptcha配置生成验证码实例

      spring mvc 使用kaptcha配置生成验证码实例

      本篇文章主要介绍了spring mvc 使用kaptcha生成验证码实例,详细的介绍了使用Kaptcha 生成验证码的步骤,有兴趣的可以了解一下
      2017-04-04
    • java设计模式-装饰者模式详解

      java设计模式-装饰者模式详解

      这篇文章主要介绍了Java设计模式之装饰者模式详解和代码实例,Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案,需要的朋友可以参考下
      2021-07-07
    • Spring MVC简介_动力节点Java学院整理

      Spring MVC简介_动力节点Java学院整理

      Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。今天先从写一个Spring MVC的HelloWorld开始,让我们看看如何搭建起一个Spring mvc的环境并运行程序,感兴趣的朋友一起学习吧
      2017-08-08
    • Mybatis查询Sql结果未映射到对应得实体类上的问题解决

      Mybatis查询Sql结果未映射到对应得实体类上的问题解决

      使用mybatis查询表数据得时候,发现对应得实体类字段好多都是null,本文主要介绍了Mybatis查询Sql结果未映射到对应得实体类上的问题解决,具有一定的参考价值,感兴趣的可以了解一下
      2024-02-02
    • 详解如何在Spring Boot项目使用参数校验

      详解如何在Spring Boot项目使用参数校验

      本篇文章主要介绍了如何在Spring Boot项目使用参数校验,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
      2017-06-06
    • Spring Boot 非web应用程序的实现

      Spring Boot 非web应用程序的实现

      SpringBoot框架中,要创建一个非Web应用程序(纯 Java 程序),有两种方式,下面就来介绍一下,感兴趣的可以来了解一下
      2025-03-03
    • JAVA异常分类和处理解析

      JAVA异常分类和处理解析

      这篇文章主要介绍了JAVA异常分类和处理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
      2019-08-08

    最新评论