Java应用间歇性抛出SunCertPathBuilderException问题求助
问题分析与解决:Squid代理间歇性返回无效证书链导致Java SSL握手失败
问题背景
基于Java 17 Temurin的应用通过Squid 5.7代理调用第三方HTTPS接口,此前运行正常,3月3日起间歇性抛出PKIX path building failed异常。使用DebugCert直接测试目标URL时证书链验证正常,但抓包发现Squid会随机返回以下无效证书链:
1 Subject CN=<destination> Issuer CN=squid sha1 <numeric> md5 <numeric> 2 Subject CN=squid Issuer CN=squid sha1 <numeric> md5 <numeric> 3 Subject CN=squid Issuer CN=squid sha1 <numeric> md5 <numeric>
可能原因
- Squid SSL Bump配置异常:启用了SSL拦截(SSL Bump)功能,但用于生成拦截证书的CA配置错误,或动态证书生成逻辑出现随机故障
- Squid证书缓存损坏:Squid的SSL证书缓存目录(
/var/spool/squid/ssl_db/)存在损坏的缓存文件,导致随机返回无效自签名证书 - Squid版本bug:Squid 5.7存在SSL拦截相关的已知问题,导致证书链构建随机失败
- 网络链路不稳定:Squid与第三方服务器之间的网络波动,导致无法正确获取目标证书链, fallback到自签名证书
解决方案
检查SSL Bump配置
- 确认Squid配置文件中
ssl_bump、sslproxy_cafile、sslproxy_certgen等参数配置正确,确保用于签署拦截证书的CA证书有效且未过期 - 检查
sslproxy_cert_error配置,是否因允许忽略证书错误导致异常返回自签名证书
- 确认Squid配置文件中
清理Squid证书缓存
- 停止Squid服务:
systemctl stop squid - 删除SSL缓存目录:
rm -rf /var/spool/squid/ssl_db/ - 重新初始化SSL缓存:
squid -z - 启动Squid服务:
systemctl start squid
- 停止Squid服务:
验证信任链配置
- 确认Squid的CA证书已正确导入Java应用的
cacerts信任库:keytool -importcert -file /path/to/squid-ca.crt -alias squid-ca -keystore /usr/lib/jvm/temurin-17-jdk-amd64/lib/security/cacerts - 检查导入的CA证书是否未过期:
keytool -list -keystore /usr/lib/jvm/temurin-17-jdk-amd64/lib/security/cacerts -alias squid-ca
- 确认Squid的CA证书已正确导入Java应用的
升级Squid版本
- 将Squid 5.7升级到最新稳定版(如5.9或更高),修复已知的SSL拦截相关bug
临时禁用SSL Bump测试
- 注释掉Squid配置中的
ssl_bump相关规则,重启服务后观察问题是否消失,确认是否为SSL拦截功能导致的异常
- 注释掉Squid配置中的
内容的提问来源于stack exchange,提问作者Juan Bustamante
相关产品推荐
相关产品推荐

