将一个或多个 X509Certificates 保存到 PKCS#7 文件/容器?

Saving one or multiple X509Certificates to a PKCS#7 File / Container?

我有多个 X509 证书。现在我想将其中一个或多个保存到 PKCS#7 文件/容器中 Java.

我可以从 PKCS#7 文件中读入一个或多个证书,但我不知道如何将它们写入 PKCS#7 文件。我只知道这个文件中的数据是 PEM 编码的,并且这个数据在标签 --- BEGINN PKCS7 ------ END PKCS7 ---.

首先,阅读 PKCS#7/CMS 的整个 RFC 以获得更好的理解。请关注此 RFC link

为了便于实施,请使用 bouncycastle 库。现在,有不同类型的 PKCS#7.CMS 数据(如 signedData、envelopedData 等)。假设您要使用 signeData 格式。然后,你需要生成CMSSignedData data. For that, you need to prepare private key and Certificate chain. Here, I am assuming, you already have those. Now prepare CMSProcessableByteArray

CMSProcessableByteArray 的示例代码:

CMSProcessableByteArray msg = new CMSProcessableByteArray("Hello World".getBytes());

然后声明 CMSSignedDataGenerator 并添加 signerInfo 和证书。

CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
gen.addSignerInfoGenerator(new JcaSignerInfoGeneratorBuilder(......));
gen.addCertificates(certs);

然后使用 CMSSignedDataGenerator 和 CMSProcessableByteArray 生成 CMSSignedData。

CMSSignedData cmsData = gen.generate(msg, true);

现在,有两种格式供您写入文件:Pem 和 Der。你想写 pem 编码。那么,将整个数据放在一个 ContentInfo 中。

ContentInfo ci = ContentInfo.getInstance(ASN1Object.fromByteArray(signedData));

现在,使用Pemwriter 编写p7b 格式的contentInfo 对象。打开文件并查看用户证书。

PEMWriter pemWriter = new PEMWriter(new FileWriter("Demo-CMS.p7b"));
pemWriter.writeObject(obj);
pemWriter.flush();
pemWriter.close();