You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot用RestTemplate调用微服务时遇PKIX路径构建失败SSL异常

解决RestTemplate调用HTTPS微服务的PKIX证书路径异常

这个异常的核心原因是:发起请求的SpringBoot应用的JVM信任存储中,没有包含目标微服务的SSL证书,导致SSL握手时无法验证证书合法性。以下是几种针对性的解决方案:

方案1:将证书导入JVM默认信任存储(全局生效)

适用于所有运行在该JVM上的应用,步骤如下:

  • 找到JVM信任存储文件路径:
    JDK8及以前:$JAVA_HOME/jre/lib/security/cacerts
    JDK9+:$JAVA_HOME/lib/security/cacerts
  • 执行keytool命令导入证书:
    keytool -import -alias custom-service-cert -file /本地证书路径/your-cert.crt -keystore /上述cacerts路径
    
  • 默认密码为changeit,按提示确认导入即可(修改系统文件需管理员权限)。

方案2:配置RestTemplate信任指定证书(仅当前应用生效,推荐)

编写自定义RestTemplate配置类,让应用仅信任目标证书,不影响其他应用:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

import javax.net.ssl.*;
import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;

@Configuration
public class SslRestTemplateConfig {

    @Bean
    public RestTemplate sslRestTemplate() throws Exception {
        // 加载本地证书文件
        CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
        FileInputStream certStream = new FileInputStream("/本地证书路径/your-cert.crt");
        X509Certificate cert = (X509Certificate) certFactory.generateCertificate(certStream);
        certStream.close();

        // 构建信任管理器
        KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
        keyStore.load(null, null);
        keyStore.setCertificateEntry("service-cert", cert);

        TrustManagerFactory tmFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        tmFactory.init(keyStore);
        TrustManager[] trustManagers = tmFactory.getTrustManagers();

        // 初始化SSL上下文
        SSLContext sslContext = SSLContext.getInstance("TLS");
        sslContext.init(null, trustManagers, null);

        // 配置RestTemplate请求工厂
        SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
        requestFactory.setSslContext(sslContext);

        return new RestTemplate(requestFactory);
    }
}

之后在业务代码中注入这个sslRestTemplate即可发起HTTPS请求。

方案3:临时禁用SSL证书验证(仅测试环境使用)

仅用于测试阶段快速验证逻辑,生产环境严禁使用,会带来严重安全风险:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

import javax.net.ssl.*;
import java.security.cert.X509Certificate;

@Configuration
public class NoVerifySslRestTemplateConfig {

    @Bean
    public RestTemplate noVerifyRestTemplate() throws Exception {
        // 信任所有证书的管理器
        TrustManager[] trustAllCerts = new TrustManager[]{
                new X509TrustManager() {
                    public X509Certificate[] getAcceptedIssuers() { return null; }
                    public void checkClientTrusted(X509Certificate[] certs, String authType) {}
                    public void checkServerTrusted(X509Certificate[] certs, String authType) {}
                }
        };

        // 初始化SSL上下文
        SSLContext sslContext = SSLContext.getInstance("TLS");
        sslContext.init(null, trustAllCerts, new java.security.SecureRandom());

        // 跳过主机名验证
        HostnameVerifier allHostsValid = (hostname, session) -> true;

        // 配置请求工厂
        SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
        requestFactory.setSslContext(sslContext);
        ((HttpsURLConnection) requestFactory.createRequest(new URI("https://localhost:8775")).getConnection())
                .setHostnameVerifier(allHostsValid);

        return new RestTemplate(requestFactory);
    }
}

注意事项

  • 确保你的证书包含目标服务的域名(测试环境使用localhost是合法的)
  • 生产环境优先选择方案1或方案2,绝对禁止使用方案3
  • 如果是自签名证书,必须通过上述方式让应用明确信任它

内容的提问来源于stack exchange,提问作者nidhi tiwari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 17:57:58