以上两个答案我都试过了,但我觉得这些并不适合我的需要,因为基于下面的链接,我可以总结一下,PKCS7是用于两个目的的,
我需要更多的是第二点。我只想使用我在.p7b对象中拥有的所有证书创建一个KeyStore文件。因为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中,我们可以创建我所要求的内容,但是我仍然可以获得生成的签名数据。我不想这样。我已经拥有的一个简单的.p7b包没有signerInfo,由这个解决方案创建的.p7b会有吗?
这样做对吗?
发布于 2019-06-10 15:33:08
在这个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相关的有用链接:
https://stackoverflow.com/questions/56492886
复制相似问题