如何将Java KeyStore转换为PKCS7 .p7b文件?

时间:2019-06-07 10:49:43

标签: java security ssl keystore jks

Convert X509 to PKCS7

Create PKCS7 from keystore

我已经尝试了以上两个答案,但是我觉得这些都不适合我的需要,因为根据下面的链接,我可以总结出PKCS7用于两个目的,

  1. 创建签名,摘要等CMS(密码消息语法)
  2. 证书容器

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会拥有吗?

这是正确的方法吗?

1 个答案:

答案 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相关的有用链接:

Convert X509 to PKCS7

Create PKCS7 from keystore