【问题标题】:How to convert java KeyStore to PKCS7 .p7b file?如何将 java KeyStore 转换为 PKCS7 .p7b 文件?
【发布时间】:2019-06-07 10:49:43
【问题描述】:

Convert X509 to PKCS7

Create PKCS7 from keystore

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

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

Based on this I summarized

我的需要更多的是第 2 点。我只想使用我在 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 在此我们可以创建我确切要求的内容,但我仍然可以获得生成的签名数据。我不想那样。我已经拥有的一个简单的 .p7b 包没有 signerInfo ,这个解决方案创建的 .p7b 会有吗?

这是正确的做法吗?

【问题讨论】:

  • 你确实想要一个 SignedData。 p7b/p7c 是一个 SignedData,没有(或虚拟的)ContentInfo,也没有 SignerInfo,只有证书(或者可能是 CRL,但您不会从 Java 密钥库中获得任何 CRL)。这正是#45278296 所做的。请注意,它没有像 #16014157 这样的 SignerInfoGenerator 或像 security #13910 这样的 SignerInfo。
  • 好的。感谢您消除我的疑问。那么这是否意味着 pkcs7 不仅仅用于证书容器?我的意思是它可以这样使用,但是当其他格式专门为此目的存在时,为什么有人会选择 PKCS7 作为证书容器。
  • PKCS7 及其后继 CMS (rfcs 2630 3369 3370 5652 et rel) 是多用途、几乎通用的格式,可用于许多事情。可能最为人所知的是,CMS 用于 S/MIME 安全电子邮件。 p7b/p7c 是一个特殊用途,用于一组证书和/或 CRL。除了“PKIpath”,它不是真正的格式,而是缺少格式,我知道的唯一理论上的替代方案是 PKCS12,它实现通常不支持没有私钥的证书(而不是CRL(s))。您指的其他标准是什么? ...
  • @dave_thompson_085 谢谢。我指的是 PKCS12 和另一种特定于 java 的称为 JKS(Java KeyStore) 格式。实际上我已经看到他们两个都支持只存储没有私钥的证书。因此,当其他格式可用时,为什么有人会使用 PKCS7 来存储证书的问题。也谢谢你的资源。你能写一个答案让我接受吗?还是我应该写?

标签: java security ssl keystore jks


【解决方案1】:

在这个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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 2020-01-11
    • 2014-05-09
    • 2015-07-26
    • 2011-10-06
    • 2018-11-15
    • 1970-01-01
    相关资源
    最近更新 更多