我有 3 个证书 - 根 CA [A]、中间 CA [B] 和一些由 B [C] 签名的证书。我想用java验证C。我暂时禁用了 CRL 和 OCSP。java使用PKIXCertPathValidator实现进行验证。
我尝试了两种方法:
- 在 CertPath 中传递 B 和 C,将 A 作为受信任的锚点传递。
- 在 CertPath 中传递 C,A 作为受信任的定位点,B 作为 CertStore。
这两种方法都不起作用。问题是验证器从 CertPath 获取索引 0 处的元素,然后为其查找受信任的锚点。C 由 B 签名,该 B 不是受信任的锚点,因此失败。
我希望它像这样工作:
- 指定要验证的证书。
- 指定受信任的定位点。
- 提供一堆可能是中间 CA 的证书。
- 验证证书。
我想你想要像这个方法这样的东西:
public static boolean verify(X509Certificate certificateToValidate, List<X509Certificate> potentialCAs, X509Certificate root) {
for(X509Certificate potentialCa : potentialCAs) {
try {
certificateToValidate.verify(potentialCa.getPublicKey());
potentialCa.verify(root.getPublicKey());
return true; // there was CA that signed you cert and this ca is signed by root
} catch (Exception e) {
//not valid
}
}
return false; // validation failed
}
您只需遍历潜在的 CA 并检查此 CA 是否签署您的证书,如果是,则检查根是否对此 CA 签名。