使用java进行证书链验证,检查revokation和ocsp状态

o4tp2gmn  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(1608)

我对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);

加载jdk密钥库,如下所示//加载jdk的cacerts密钥库文件字符串filename=system.getproperty(“java.home”)+“/lib/security/cacerts.replace('/',file.separatorchar);fileinputstream is=new fileinputstream(文件名);keystore keystore=keystore.getinstance(keystore.getdefaulttype());string password=“更改”;keystore.load(is,password.tochararray());

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

PKIXParameters pkixParameters = new PKIXParameters(keystore);
//pkixParameters.setRevocationEnabled(false);

PKIXParameters certPathValidatorResult = certPathValidator.validate(certPath, pkixParameters);

我假设如果这不是一个有效的链,它会抛出一个异常。此验证是否会检查过期的证书、有效的公钥?
我还需要能够找到证书的ocsp状态或检查它是否被吊销>?如何使用加密api实现这一点
在api中是否推荐使用bouncy castle?bouncy castle有办法检查证书的crl和ocsp状态吗?
谢谢你的指点和帮助。谢谢你。
致以最诚挚的问候

yjghlzjz

yjghlzjz1#

这是正确的,您可以使用certificatefactory加载证书链。
如果要验证一系列证书,则不需要密钥库。证书由发出该证书的自动授权证书进行验证。
例如:

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());

在这种情况下,如果您不知道根ca,可以使用它来验证证书。
你可以用

x509Certificates.get(1).getNotBefore()

x509Certificates.get(1).getNotAfter()

验证证书的状态很重要。
是的,bouncycastle是一个很好的图书馆。

相关问题