问题描述
我是 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 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());
-
CertPathValidator certPathValidator = CertPathValidator.getInstance("PKIX"); PKIXParameters pkixParameters = new PKIXParameters(keystore); //pkixParameters.setRevocationEnabled(false); PKIXParameters certPathValidatorResult = certPathValidator.validate(certPath,pkixParameters);
-
我假设如果这不是一个有效的链,它会抛出异常。此验证会检查过期的证书、有效的公钥吗?
-
我还需要能够找到证书的 OCSP 状态或检查它是否被撤销>?如何使用 Cryptography API 完成此操作
-
是否比 API 更推荐使用充气城堡? Bouncy Castle 有办法检查证书的 CRL 和 OCSP 状态吗?
提前感谢所有的指点和帮助。欣赏一下。
最好的问候
解决方法
- 没错,您可以使用 CertificateFactory 加载证书链。
- 如果您想验证证书链,则不需要 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());
- 在这种情况下,如果您不知道根 ca,则可以使用它来验证证书。
- 您可以使用 查看期间
x509Certificates.get(1).getNotBefore()
和
x509Certificates.get(1).getNotAfter()
- 验证证书状态很重要。
- 是的,BouncyCastle 是一个很棒的图书馆。