在 Java 中使用 bouncycastle 生成 p7b 证书链
Generate p7b certificate chain with bouncycastle in Java
我需要使用 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);
}
但是,新版本的 Bouncy Castle 的 CMSSignedDataGenerator 有一些变化,所以我修改了我的代码:
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 的行号 class。
我正在使用 Wildfly 来部署我的项目,我已将带有源代码的 jar 附加到调试器,但是我看到了代码,但在 class 名称旁边我得到了 行不可用,所以我看不到空指针异常发生的位置。
同样有趣的是,我在 class 上看到一个空心的 Java 图标:
我使用以下代码解决了这个问题:
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);
}
但是,我认为这是一种 hack,因为您使用 CMSSignedDataGenerator 用于签名以生成 p7b 证书链。
在旧版本中,您可以使用 null 作为已签名的数据,但现在您必须输入一些数据,即使它只是一个空字节数组。
我需要使用 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);
}
但是,新版本的 Bouncy Castle 的 CMSSignedDataGenerator 有一些变化,所以我修改了我的代码:
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 的行号 class。
我正在使用 Wildfly 来部署我的项目,我已将带有源代码的 jar 附加到调试器,但是我看到了代码,但在 class 名称旁边我得到了 行不可用,所以我看不到空指针异常发生的位置。
同样有趣的是,我在 class 上看到一个空心的 Java 图标:
我使用以下代码解决了这个问题:
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);
}
但是,我认为这是一种 hack,因为您使用 CMSSignedDataGenerator 用于签名以生成 p7b 证书链。
在旧版本中,您可以使用 null 作为已签名的数据,但现在您必须输入一些数据,即使它只是一个空字节数组。