我有多个X509Certificates。现在我想将其中一个或多个保存到带有Java的PKCS#7文件/容器中。
我可以从PKCS#7文件中读取一个或多个证书,但我不知道如何将它们写入PKCS#7文件。我只知道此文件中的数据是经过PEM编码的,并且此数据位于代码--- BEGINN PKCS7 ---
和--- END PKCS7 ---
内。
答案 0 :(得分:1)
首先,阅读整个RFC for PKCS#7 / CMS以便更好地理解。请按照RFC link进行操作。
为了便于实现,请使用bouncycastle库。现在,有不同类型的PKCS#7.CMS数据(如signedData,envelopedData等)。让我们来看,你想使用signeData格式。然后,您需要生成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();