我有多个x509certificates。现在,我想将其中一个或多个保存到带有Java的PKCS#7文件/容器中。
我可以从PKCS#7文件中阅读一个或多个证书,但是我不知道如何将它们写入PKCS#7文件。我只知道该文件中的数据是PEM编码的,并且此数据在标签--- BEGINN PKCS7 ---
和--- END PKCS7 ---
中。
首先,阅读PKCS#7/CMS的整个RFC,以更好地理解。请关注此RFC链接。
为了轻松实施,请使用Bouncycastle库。现在,有不同类型的PKCS#7.CMS数据(例如SignedData,emploweddata等)。让我们采取措施,您想使用签名格式。然后,您需要生成CMSSignedData数据。为此,您需要准备私钥和证书链。我假设在这里,您已经拥有了。现在准备cmsprocessablebytearray。 cmsprocessablebytearray的示例代码:CMSProcessableByteArray msg = new CMSProcessableByteArray("Hello World".getBytes());
HEN声明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();