使用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的位置发生指针异常。

enter image description here

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

答案

我使用以下代码解决了这个问题:

        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

证书问题:来自 P7B 和 CRT 的 KEY 或 PFX