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

How to convert java KeyStore to PKCS7 .p7b file?

Convert X509 to PKCS7

Create PKCS7 from keystore

我已经尝试了上面的两个答案,但我觉得这些不适合我的需要,因为根据下面的 link 我可以总结 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[=18 创建一个 .p7b 文件=]

好的,我找到了解决方案:

在这里我们可以创建我所要求的,但我仍然得到生成的签名数据。我不想要那个。我已经拥有的一个简单的 .p7b 包没有 signerInfo,这个解决方案创建的 .p7b 会有吗?

这样做正确吗?

在此 中找到解决方案:

代码:

//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