我已经尝试了以上两个答案,但是我觉得这些都不适合我的需要,因为根据下面的链接,我可以总结出PKCS7用于两个目的,
我需要的是第二点。我只想使用我在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会拥有吗?
这是正确的方法吗?
答案 0 :(得分:0)
在此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相关的有用链接: