当前位置: 首页 > 知识库问答 >
问题:

如何使用Java检查X509Certificate链的吊销状态?

水品
2023-03-14

我正在使用以下代码:

public static boolean isCertChainValid(ArrayList<X509Certificate> certificateList) {

    try {

        CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");

        CertPath certPath = certificateFactory.generateCertPath(certificateList);

        CertPathValidator validator = CertPathValidator.getInstance("PKIX");

        KeyStore keystore = KeyStore.getInstance("JKS");
        InputStream is = new FileInputStream(System.getProperty("java.home") + "/lib/security/" + "cacerts");
        keystore.load(is, "changeit".toCharArray());

        PKIXParameters params = new PKIXParameters(keystore);

        params.setRevocationEnabled(true);

        Security.setProperty("ocsp.enable", "true");
        System.setProperty("com.sun.net.ssl.checkRevocation", "true");
        System.setProperty("com.sun.security.enableCRLDP", "true");

        PKIXCertPathValidatorResult r = (PKIXCertPathValidatorResult) validator.validate(certPath, params);
        return true;
    } catch (CertificateException e) {
        throw new RuntimeException(e);

    } catch (NoSuchAlgorithmException e) {
        throw new RuntimeException(e);

    } catch (KeyStoreException e) {
        throw new RuntimeException(e);

    } catch (IOException e) {
        throw new RuntimeException(e);

    } catch (InvalidAlgorithmParameterException e) {
        throw new RuntimeException(e);

    } catch (CertPathValidatorException e) {
        throw new RuntimeException(e);
    }
}

这是我获取证书列表的方式:

public static void main(String args[]) throws Exception {

    CertVal certVal = new CertVal(new File("/home/varun/Documents/SampleCerts/google.pem"), "X.509");
    X509Certificate cert = (X509Certificate) certVal.getCert();

    certVal = new CertVal(new File("/home/varun/Documents/SampleCerts/google.int.pem"), "X.509");
    X509Certificate int_cert = (X509Certificate) certVal.getCert();

    certVal = new CertVal(new File("/home/varun/Documents/SampleCerts/google.root.pem"), "X.509");
    X509Certificate root_cert = (X509Certificate) certVal.getCert();

    System.out.println(cert.toString());

    ArrayList<X509Certificate> cList = new ArrayList<>();
    cList.add(cert);
    cList.add(int_cert);
    cList.add(root_cert);

    System.out.println(isCertChainValid(cList));
}

Google.pem、Google.int.pem、Google.root.pem分别是在浏览器中使用导出选项获得的端证书、中间证书和根证书。

密钥:Sun EC公钥,256位公用x Coord:46177506158937302063723158048612066903199153823785912505310712717097913459047公用y Coord:11380901548809011503210296172948380830057126799034749740821637608868220331参数:secp256r1[NIST P-256,X9.62 prime256v1](1.2.840.10045.3.1.7)有效期:[From:Thu Jun 16 14:07:32 IST 2016,To:Thu SEP256V1](1.2.840.10045.3.1.7)P08 13:59:00 IST 2016]发行人:CN=Google Internet Authority G2,O=Google Inc,C=US序列号:[
51E47ED1 28A4436E]

如证书例外9:[1]和[2]所示,OSCP URL和CRL URL都可与证书一起使用。这两个东西在中间证书中也有,但它们在根证书中没有,这是合理的,因为它们不需要与它们一起使用。

共有1个答案

鲁烨熠
2023-03-14

我发现了问题所在。

正是根证书在certpath中的存在造成了所有的麻烦。

根证书不包含CRL和OSCP链接。不断更新存储库是可信证书存储库或信任存储库的工作。

而且

线程“main”java.lang.RuntimeException中出现异常:java.Security.Cert.CertPathValidatorException:证书未在以下位置指定OCSP响应程序

简而言之,要检查证书链中证书的吊销状态,需要排除根证书。验证器算法可以确定最后一个中间证书是否由根CA签名。

 类似资料:
  • 问题内容: 我目前正在使用SSL编写网络TCP服务器。在生产中,我们最终将要求客户使用证书进行身份验证。 为了在紧急情况下吊销证书,我们还想建立一个CRL。 我的问题是:Java是否开箱即用地检查CRL(如果提供了证书),还是需要手动实施此类检查? 为了进行测试,我准备了带有CRL设置的证书,但是Java似乎没有尝试对其进行验证(我将其放入本地Web服务器中并且无法访问)。 我仅找到 _com.s

  • 我试图使用Github桌面和git shell从Github进行克隆,但不断出现以下错误: 拉取现有存储库时也会出现同样的问题。 我已经尝试上载在

  • 我对PKI的世界是新的,一般的证书。我正在写一个服务,需要验证证书链。 感谢所有的指示和帮助提前。感激不尽。 致以最诚挚的问候

  • 提前谢谢你

  • 问题内容: 我在各地搜索过Google,并在其他社区中询问过,并且继续前进到讨论该规范的Oracle文档。但是,该文档更多地涵盖了方法的命名以及整个体系结构,实际上并未提出讨论如何实际编写一些代码来检查x509证书是否被撤销的方法。 也许这只是我头上的办法?但是如果有人可以帮助我,我肯定会感激不尽,我已经将头撞在墙上的墙上已经有大约一周的时间了。 问题答案: 每个CA都会发布已撤销的证书列表。此列

  • 如果这种理解是正确的,那么我希望x509Chain对象能够通过吊销检查,即使检查是在上面文件的2014年3/1/之后的最新吊销列表存在的情况下进行的。不幸的是,结果是验证失败,因为它认为证书已被吊销。 在这种情况下,我是否必须做进一步的测试以查看撤销日期并覆盖结果并忽略它?我是不是做了什么蠢事?我是不是误会了撤销?