Java HTTPS请求失败排查与证书导入的全过程

 更新时间:2025年08月03日 10:43:52   作者:XMYX-0  
在实际项目部署中,我们可能会遇到 Java 应用调用某个 HTTPS 接口失败,特别是涉及公司网关或 WAF 防护设备时,问题常常集中在 SSL/TLS 证书验证失败上,本文记录一次完整的排查过程,并给出相关知识点补充,需要的朋友可以参考下

引言

在实际项目部署中,我们可能会遇到 Java 应用调用某个 HTTPS 接口失败,特别是涉及公司网关(如 www.test.com)或 WAF 防护设备时,问题常常集中在 SSL/TLS 证书验证失败上。本文记录一次完整的排查过程,并给出相关知识点补充。

问题背景

Java 应用通过 java.net.HttpURLConnection 或 RestTemplate 等方式请求接口 https://www.test.com,却出现如下异常:

javax.net.ssl.SSLHandshakeException: 
sun.security.validator.ValidatorException: PKIX path building failed: 
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

问题初步分析

该错误表明 Java 无法信任目标服务的 HTTPS 证书。常见原因有:

  • 服务端证书是自签名(Self-signed)
  • 服务端证书链不完整
  • Java SDK 默认的 cacerts 信任库中缺少对应根证书或中间证书

特别注意:Java 不使用系统证书库,而是依赖其内置的 cacerts 信任库。

排查过程

查看目标地址证书

openssl s_client -connect www.test.com:443 -showcerts

可以看到目标返回了一整套证书链,包括:

  • 服务器证书(.crt)
  • 中间证书(可能有多个)
  • 根证书(部分环境不提供)

导入证书

你可能收到运维/安全团队提供的证书文件,如:

www.test.com_public.crt
www.test.com_chain.crt
www.test.com.key

我们只需要 .crt 文件,通常导入 www.test.com_chain.crt 即可。

导入命令如下(以 JDK 默认 cacerts 为例):

keytool -importcert \
  -trustcacerts \
  -alias test-gateway \
  -file www.test.com_chain.crt \
  -keystore $JAVA_HOME/lib/security/cacerts \
  -storepass changeit

验证证书是否导入成功

keytool -list -keystore $JAVA_HOME/lib/security/cacerts -storepass changeit | grep duola

输出示例:

test-gateway, Jul 31, 2025, trustedCertEntry,

重启应用

# 这是走默认的cacerts信任库
java -jar my-test-project-0.0.1-SNAPSHOT.jar
# 下边是指定我们导入的信任库
java -Djavax.net.ssl.trustStore=$JAVA_HOME/lib/security/cacerts -Djavax.net.ssl.trustStorePassword=changeit -jar my-test-project-0.0.1-SNAPSHOT.jar

此时如果请求成功,即可初步判定问题解决。

进一步验证:是否真的是证书问题?

如果你怀疑是 WAF、CDN 等中间设备阻断,可以用两种方式验证:

1. 浏览器访问

浏览器访问 https://www.test.com 是否提示 “证书不受信任”?如果没有,一般说明服务器证书链是完整的,但 Java 环境中仍然缺少相应的中间证书。

2. 抓包工具验证(如 Charles、Wireshark)

查看 TLS 握手过程是否被中断或中间设备返回自定义证书。

补充知识点

Java 中默认信任库在哪里?

  • 路径:$JAVA_HOME/lib/security/cacerts
  • 默认密码:changeit

如果要删除已导入证书?

keytool -delete -alias test-gateway -keystore $JAVA_HOME/lib/security/cacerts -storepass changeit

可否使用浏览器导出证书?

可以。在浏览器中点击锁图标 → 查看证书 → 导出为 .crt 文件,然后再导入 Java 信任库。

总结

这次排查证明:

Java HTTPS 请求失败,通常不是网络或 WAF 问题,而是 Java 缺少可信证书链中的中间证书

解决方法也非常明确:

  1. 获取目标服务的完整证书链
  2. 将链中缺失的证书导入 Java 的 cacerts 信任库
  3. 重启应用验证是否成功

如果你在实际部署中也遇到类似问题,不妨从证书入手,按图索骥逐步排查。

生产上解决

证书等级提升,开始是从阿里云上够买个人免费版证书,提升证书等级就行了

以上就是Java HTTPS请求失败排查与证书导入的全过程的详细内容,更多关于Java HTTPS请求失败与证书导入的资料请关注脚本之家其它相关文章!

相关文章

  • Java中的Map接口实现类HashMap和LinkedHashMap详解

    Java中的Map接口实现类HashMap和LinkedHashMap详解

    这篇文章主要介绍了Java中的Map接口实现类HashMap和LinkedHashMap详解,我们常会看到这样的一种集合,IP地址与主机名,等,这种一一对应的关系,就叫做映射,Java提供了专门的集合类用来存放这种对象关系的对象,需要的朋友可以参考下
    2024-01-01
  • HashMap 和 HashSet的区别

    HashMap 和 HashSet的区别

    本文主要介绍HashMap 和 HashSet的区别,这里整理了详细的资料来说名两者的区别,并说明如何使用该方法,有需要的小伙伴可以参考下
    2016-09-09
  • java线程的基础实例解析

    java线程的基础实例解析

    java中线程的基本方法的熟练使用是精通多线程编程的必经之路,线程相关的基本方法有wait,notify,notifyAll,sleep,join,yield等,本文浅要的介绍一下它们的使用方式
    2021-06-06
  • java实现人民币大小写转换方法分享

    java实现人民币大小写转换方法分享

    本文介绍java人民币数字大小写转换方法,代码中有注释,大家直接看代码吧
    2014-01-01
  • Java动态代理分析及理解

    Java动态代理分析及理解

    这篇文章主要介绍了Java动态代理分析及理解的相关资料,需要的朋友可以参考下
    2017-05-05
  • springboot security之前后端分离配置方式

    springboot security之前后端分离配置方式

    这篇文章主要介绍了springboot security之前后端分离配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • Spring Data JPA带条件分页查询实现原理

    Spring Data JPA带条件分页查询实现原理

    这篇文章主要介绍了Spring Data JPA带条件分页查询实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • 浅谈servlet中的request与response

    浅谈servlet中的request与response

    下面小编就为大家带来一篇浅谈servlet中的request与response。小编觉得挺不错的,现在就分享给大家,也给大家做个参加。一起跟随小编过来看看吧
    2016-07-07
  • Java反射的定义和用法详解

    Java反射的定义和用法详解

    Java中的反射是指在程序运行时动态地获取和操作类、方法、属性等元素的能力。它使得我们可以在程序运行时获取一个类的信息,并对其进行操作,需要的朋友可以参考下
    2023-05-05
  • SpringBoot返回统一的JSON标准格式实现步骤

    SpringBoot返回统一的JSON标准格式实现步骤

    这篇文章主要介绍了SpringBoot返回统一的JSON标准格式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08

最新评论