truststore怎么验自签名证书
1.你 truststore 里放的是“服务器那张自签名证书”
这时服务器发来的证书,必须和你导入
truststore 的证书完全一样,JDK才会认。
导入时,keytoo1 把证书的 DER 编码存进etruststore;
JDK加载后得到 X509Certificate 对象;
验证时,它会把服务器证书和 truststore 里的信任销证书做比较;
Java 里这个比较等价于X509Certificate.equals(),它比较的是证书编码,不是只看主题或公钥
所以:
进制完全一致 →认;
主题、公钥一样,但序列号、有效期、签发者等有任何不同 →编码不同 →不认;
服务器换了证书,即使同名同公钥,也必须重新导入新证书。
2.你 truststore 里放的是“根 CA 或中间 CA”
这时 JDK 不要求服务器证书和你 truststore 里的CA 证书相同,而是验证签名链
流程:
1. 服务器发来:叶子证书 +中间 CA 证书(可能还有根);
2.你的 truststore 里有根 CA,
3. JDK 用根 CA 的公钥去验证中间 CA 证书的签名;
4. 再用中间 CA 的公钥验证叶子证书的签名!
5.一路验到信任锚,
这里“知道”的方式不是证书相同,而是
issuer 和 subject 能接上;
签名能被信任锚的公钥验证通过。
有效期、密钥用途、基本约束等检查通过
所以,CA签发场景下,证书可以每次不同,只
验签,逐级向上;
4.如果路径最终连到 truststore 里的信任锚,就信任;
5.如果服务器证书本身就是 truststore 里的信任锚 →路径长度 0,直接信任。
所以 JDK 不是“知道”它是自签名还是 CA 签发,而是通过验签和路径构建自动推导
6.一句话总结
'issuer == Subject 且 能用自己公钥验签成功
→自签名
lssue:!= Subject e 能用 lssuer 证书公钥验签成功 → 由该 CA 签发
JDK 在验证时通过 PKIX路径构建自动处理不预先分类。
最终是否信任,取决于证书链能否连到truststore 里的信任锚。本回答由 A1 生成,内容仅供参考,请仔细甄别
5.JDK 内部怎么判断?
JDK 的 PKIX 验证器不会先判断“这是自签名还是 CA 签发”再决定策略。它总是:
1.拿服务器发来的证书链,:
2.尝试构建一条能连到 truststore 中某个信任锚的路径;
3. 构建过理:
如果当前证书的 lssuer 和 Subject 相同,并且能用自己公钥验签成功 →认为它是自签名;
否则,去找 Issuer 对应的证书,用其公钥验签,逐级向上;
4. 如果路径最终连到 truststore 里的信任锚,就信任;
5.如果服务器证书本身就是 truststore 里的信任锚 →路径长度 0,直接信任。
所以 JDK 不是“知道”它是自签名还是 CA 签发,而是通过验签和路径构建自动推导。
浙公网安备 33010602011771号