当前位置: 代码网 > it编程>编程语言>Java > Java HTTPS请求失败排查与证书导入的全过程

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

2025年08月03日 Java 我要评论
引言在实际项目部署中,我们可能会遇到 java 应用调用某个 https 接口失败,特别是涉及公司网关(如 www.test.com)或 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请求失败与证书导入的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com