Java11的cacerts无对应中间证书时为何仍可完成证书验证?
问题解答
核心原因:TLS握手时服务端会主动返回完整证书链
HTTPS的TLS握手流程中,服务端默认会下发完整的证书信任链,包含你提到的API叶子证书、中间CA证书,部分场景下还会附带根证书。Java并不会要求中间CA证书必须提前预置在cacerts信任库中,只要完整链的最终根证书在信任库内,即可完成全链路验签。
Java证书验证的具体逻辑
- 验证流程从叶子证书开始,逐层向上校验每一层证书的数字签名是否合法、证书是否在有效期内
- 只要能追溯到任意一个已经在
cacerts中被标记为信任的根证书,整个证书链就会被判定为合法 - 中间证书仅需要由链上的上一级CA签发、签名有效即可,不需要提前预置在本地信任库
对应场景的匹配说明
你使用的OpenJDK 11.0.10版本的默认cacerts中已经预置了DigiCert Global Root CA根证书,服务端返回的证书链已经包含了你本地缺失的中间CA证书,Java可以直接使用服务端返回的中间证书完成逐层验签,最终追溯到受信任的根证书,因此SSL握手可以正常完成。
内容的提问来源于stack exchange,提问作者Damien Tacheron
相关产品推荐
相关产品推荐

