我需要使用bouncy castle 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,因此该部分正常。
但是,当我尝试调试充气城堡库时,调试器似乎无法找到CMSSignedDataGenerator类的行号。
我使用Wildfly来部署我的项目,并且我已经将带有源代码的jar附加到调试器,但是我看到代码但是在类名旁边我得到行不可用,所以我无法看到空指针异常发生的位置。
答案 0 :(得分:0)
我使用以下代码解决了这个问题:
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 作为已签名的数据,但现在您必须输入一些数据,即使它只是一个空字节数组。