Convert X509 to PKCS7
Create PKCS7 from keystore
我已经尝试了以上两个答案,但是我觉得这些都不适合我的需要,因为根据下面的链接,我可以总结出PKCS7用于两个目的,
创建签名,摘要等CMS(密码消息语法)
证书容器
Based on this I summarized
我需要的是第二点。我只想使用我在KeyStore对象中拥有的所有证书来创建.p7b文件。由于PKCS7不能包含私钥。以上两个答案生成签名,而没有签名。我想念什么吗?是前进的道路还是另一条路?
我可以使用.p7b文件提取证书
FileInputStream is = new FileInputStream( "cert.pkcs7" );
CertificateFactory cf = CertificateFactory.getInstance( "X.509" );
Iterator i = cf.generateCertificates( is ).iterator();
while ( i.hasNext() )
{
Certificate c = (Certificate)i.next();
System.out.println(Base64.getEncoder.encodeToString(c.getEncoded());
}
我问如何做相反的事情,即从
Certificate[]
或Java KeyStore
创建一个.p7b文件好吧,我找到了解决方案:
Solution在这种情况下,我们可以创建我确切要求的内容,但仍然可以得到生成的签名数据。我不要我已经有一个没有signerInfo的简单.p7b软件包,通过此解决方案创建的.p7b是否有它?
这是正确的方法吗?
最佳答案
在此link中找到了解决方案:
码:
//Export a certificate list to PKCS#7
public static byte[] exportCertificatesAsPkcs7(X509Certificate certs[]) throws Exception {
List certList = new ArrayList();
for (X509Certificate certificate: certs){
certList.add(new X509CertificateHolder(certificate.getEncoded()));
}
Store certStore = new JcaCertStore(certList);
CMSProcessableByteArray msg = new CMSProcessableByteArray("Hello World".getBytes());
CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
gen.addCertificates(certStore);
CMSSignedData data = gen.generate(msg, "BC");
return data.getEncoded();
}
与PKCS7相关的有用链接:
Convert X509 to PKCS7
Create PKCS7 from keystore