引言
在实际项目部署中,我们可能会遇到 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 缺少可信证书链中的中间证书。
解决方法也非常明确:
- 获取目标服务的完整证书链
- 将链中缺失的证书导入 java 的 cacerts 信任库
- 重启应用验证是否成功
如果你在实际部署中也遇到类似问题,不妨从证书入手,按图索骥逐步排查。
生产上解决
证书等级提升,开始是从阿里云上够买个人免费版证书,提升证书等级就行了
以上就是java https请求失败排查与证书导入的全过程的详细内容,更多关于java https请求失败与证书导入的资料请关注代码网其它相关文章!
发表评论