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

10-06 13:34