【问题标题】:Certificate chain validation using java, checking revokation and OCSP status使用 java 进行证书链验证,检查吊销和 OCSP 状态
【发布时间】:2021-03-31 17:00:18
【问题描述】:

我是 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()); 字符串密码 = "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 状态吗?

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

最好的问候

【问题讨论】:

  • PKIX 验证器默认检查到期和撤销。没有通用的方法来检查公钥是否有效生成,即使对于特定的算法,它通常也不能仅在公钥上仅对私钥进行。 PKIX 验证器可以做 OCSP,见docs.oracle.com/en/java/javase/11/security/…

标签: java certificate x509certificate ocsp


【解决方案1】:
  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 是一个很棒的库。

【讨论】:

  • X509Certificate.verify 只验证一个证书上的签名;那,甚至检查链中的每个证书,只是验证链所需的一小部分;请参阅 RFC5280 第 6 节。CertPathValidator 的用途。
  • 感谢@DarkVeider 提供这些cmets。真的很感激。更多说明 List x509Certificates = (List) certificateFactory.generateCertificates(byteArrayInputStream); x509Certificates.get(1).verify(x509Certificates.get(0).getPublicKey());这是否意味着第一个证书始终是根证书?当您说验证不需要 KeyStore 时,verify() 是否能够告诉不受信任的证书?看起来没有完整的方法来验证证书链,或者我错过了什么?非常感谢。
  • 这是否意味着第一个证书始终是根证书,它取决于字节数组上的证书顺序。 dave_Thompson 在他的评论中有理由。
  • 并且是verify()能够告诉一个不受信任的证书,如果你知道是谁发出了证书,然后使用正确的证书进行验证。 CertPathValidator 可以帮助您找到正确的证书并在不知道证书是谁发出的情况下进行验证。
猜你喜欢
  • 2016-11-13
  • 2023-02-04
  • 1970-01-01
  • 1970-01-01
  • 2011-07-18
  • 2012-03-25
  • 1970-01-01
  • 1970-01-01
  • 2018-01-15
相关资源
最近更新 更多