使用Java中的bouncycastle生成p7b证书链

时间:2017-12-21 02:05:26

标签: java cryptography certificate bouncycastle pki

我需要使用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附加到调试器,但是我看到代码但是在类名旁边我得到行不可用,所以我无法看到空指针异常发生的位置。

enter image description here

有趣的是,我在该类上看到了一个空心的Java图标: enter image description here

1 个答案:

答案 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 作为已签名的数据,但现在您必须输入一些数据,即使它只是一个空字节数组。