Appearance
浏览器正常,为什么 Java 或其他程序仍报证书错误?
浏览器与应用可能使用不同的信任库、网络入口和证书验证规则。浏览器能打开,不足以证明服务器链完整,也不代表 Java 或设备会接受同一条链。
1. 先确认访问的是同一个服务
对比域名、端口、DNS 解析及代理配置,检查应用所在机器是否访问了不同的内网、IPv6 或负载均衡节点。记录报错时间及完整错误信息。
公网服务可用 MySSL 检测;也可从故障应用所在网络查看实际证书链:
sh
openssl s_client -connect example.com:443 -servername example.com -showcerts将两处域名替换为实际值。OpenSSL 的结果代表它自己的校验环境,不能代替 Java 应用的测试。
2. 根据错误定位
| 现象 | 优先检查 |
|---|---|
PKIX path building failed、找不到签发者 | 服务端是否缺少 ICA/交叉证书;应用实际 truststore 是否信任适用根 |
| 域名不匹配 | 实际请求名称、证书 SAN、SNI 和站点绑定 |
| 证书过期或尚未生效 | 故障入口实际证书及客户端系统时间 |
| 更新证书后只有特定 App/设备失败 | 是否绑定了旧证书、公钥、issuer 或固定链 |
handshake_failure、连接 reset | 结合日志检查 TLS 协议、算法、密码套件和客户端认证要求,不能一概归为缺链 |
3. Java 重点检查
确认应用实际使用的 JRE/JDK,而不是仅查看终端的默认 Java。检查启动参数中的 javax.net.ssl.trustStore,以及框架是否单独配置了信任库。
- 服务端缺链:先修复服务器返回的中间链。
- 应用信任库过旧:通过受控方式更新 JRE 或维护的 CA 信任库。
- 存在证书绑定:由研发按绑定策略更新并验证。
不要通过关闭证书或主机名校验解决问题,也不要把每次下载的站点证书直接当成永久信任根。
4. 用原应用复测
从原网络、原运行环境重新访问,确认错误消失。需要支持时提供域名、端口、应用及 JRE 版本、完整错误和服务器返回链,不发送私钥或信任库密码。
交叉链指南:GlobalSign · DigiCert · TrustAsia。
