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