使用Java中的bouncycastle生成p7b证书链
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Java中的bouncycastle生成p7b证书链相关的知识,希望对你有一定的参考价值。
我需要使用充气城堡1.58生成p7b证书链。
在我们使用的旧版本(1.46)中,此代码有效:
CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
Certificate [] chain = certificate.getCertificateChain();
CertStore certStore;
try {
certStore = CertStore.getInstance("Collection", new CollectionCertStoreParameters(Arrays.asList(chain)));
gen.addCertificatesAndCRLs(certStore);
CMSSignedData signedData = gen.generate(null,(Provider)null);
return signedData.getEncoded();
} catch (Exception ex) {
logger.error("Failed to construct P7B response",ex);
throw new RuntimeException(ex);
}
但是,CMSSignedDataGenerator与新版本的Bouncy Castle有一些变化,所以我修改了我的代码:
CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
Certificate [] chain = certificate.getCertificateChain();
try {
JcaCertStore store = new JcaCertStore(Arrays.asList(chain));
gen.addCertificates(store);
CMSSignedData signedData = gen.generate(null);
return signedData.getEncoded();
} catch (Exception ex) {
logger.error("Failed to construct P7B response",ex);
throw new RuntimeException(ex);
}
但是,我在generate中的这一行上得到一个空指针异常:
CMSSignedData signedData = gen.generate(null);
我试图调试,我检查证书是否加载到JcaCertStore,所以这部分是好的。
但是,当我尝试调试bouncy castle库时,调试器似乎无法找到CMSSignedDataGenerator类的行号。
我正在使用Wildfly来部署我的项目,并且我已经将带有源的jar附加到调试器,但是我看到了代码,但是在类名旁边我得到的行不可用,所以我无法看到null的位置发生指针异常。
我使用以下代码解决了这个问题:
CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
Certificate [] chain = certificate.getCertificateChain();
try {
CMSProcessableByteArray msg = new CMSProcessableByteArray("".getBytes());
JcaCertStore store = new JcaCertStore(Arrays.asList(chain));
gen.addCertificates(store);
CMSSignedData signedData = gen.generate(msg);
return signedData.getEncoded();
} catch (Exception ex) {
logger.error("Failed to construct P7B response",ex);
throw new RuntimeException(ex);
}
但是,我认为这是一种黑客行为,因为您使用CMSSignedDataGenerator进行签名以生成p7b证书链。
在旧版本中,您可以使用null作为已签名的数据,但现在您必须输入一些数据,即使它只是一个空字节数组。
以上是关于使用Java中的bouncycastle生成p7b证书链的主要内容,如果未能解决你的问题,请参考以下文章
如何在 java 中使用 bouncycastle 生成具有主题替代名称的 CSR
Java 中带有 bouncycastle 的 PBKDF2
无法使用java中的pkcs#7和bouncyCastle签署zip文件
为 RSACryptoProvider 和 BouncyCastle 生成密钥/加密/解密
java.lang.IllegalArgumentException:字符串curve25519不是OID bouncycastle 1.52