CertPath中的证书顺序

时间:2019-06-06 15:26:25

标签: java x509certificate bouncycastle

我有3个证书-根CA [A],中级CA [B]和一些由B [C]签名的证书。我想在Java中验证C。我此时已禁用CRL和OCSP。 Java使用PKIXCertPathValidator实现在后台进行验证。

我尝试了两种方法:

  1. 将CertPath中的B和C和A作为可信锚传递。
  2. 在CertPath中传递C,将A作为受信任的锚,将B作为CertStore。

这两种方法均无效。问题是验证器从CertPath的索引0处获取元素,然后为其寻找可信锚。 C由不是可信锚的B签名,因此失败。

我希望它像这样工作:

  1. 指定要验证的证书。
  2. 指定受信任的锚点。
  3. 提供一堆可能是中级CA的证书。
  4. 验证证书。

1 个答案:

答案 0 :(得分:0)

我想您想要这样的方法:

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是否对您的证书进行了签名;如果是,则检查root是否对该CA进行了签名。