使用 java 进行证书链验证,检查吊销和 OCSP 状态

问题描述

我是 PKI 世界的新手,一般来说是证书。我正在编写一个需要验证一系列证书的服务。

一般的做法如下

a) 根据发送的数据生成证书列表

ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data);

CertPathValidatorResult certPathValidatorResult = null;
try {

  CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
  List<X509Certificate> x509Certificates =
      (List<X509Certificate>) certificateFactory.generateCertificates(byteArrayInputStream);

  CertPath certPath = certificateFactory.generateCertPath(x509Certificates);
  1. 加载 JDK 密钥库,像这样 //加载JDK的cacerts keystore文件 字符串文件名 = System.getProperty("java.home") + "/lib/security/cacerts".replace('/',File.separatorChar); FileInputStream is = new FileInputStream(filename); KeyStore 密钥库 = KeyStore.getInstance(KeyStore.getDefaultType()); String password = "changeit"; keystore.load(is,password.tochararray());

  2. CertPathValidator certPathValidator = CertPathValidator.getInstance("PKIX");
    
    PKIXParameters pkixParameters = new PKIXParameters(keystore);
    //pkixParameters.setRevocationEnabled(false);
    
    PKIXParameters certPathValidatorResult = certPathValidator.validate(certPath,pkixParameters);
    
  3. 我假设如果这不是一个有效的链,它会抛出异常。此验证会检查过期的证书、有效的公钥吗?

  4. 我还需要能够找到证书的 OCSP 状态或检查它是否被撤销>?如何使用 Cryptography API 完成此操作

  5. 是否比 API 更推荐使用充气城堡? Bouncy Castle 有办法检查证书的 CRL 和 OCSP 状态吗?

提前感谢所有的指点和帮助。欣赏一下。

最好的问候

解决方法

  1. 没错,您可以使用 CertificateFactory 加载证书链。
  2. 如果您想验证证书链,则不需要 KeyStore。证书通过颁发该证书的自治证书进行验证。
    例如:
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(chain.getBytes());
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
List<X509Certificate> x509Certificates = (List<X509Certificate>) certificateFactory.generateCertificates(byteArrayInputStream);
x509Certificates.get(1).verify(x509Certificates.get(0).getPublicKey());
  1. 在这种情况下,如果您不知道根 ca,则可以使用它来验证证书。
  2. 您可以使用
  3. 查看期间
x509Certificates.get(1).getNotBefore()

x509Certificates.get(1).getNotAfter()
  1. 验证证书状态很重要。
  2. 是的,BouncyCastle 是一个很棒的图书馆。