【发布时间】:2019-06-07 10:49:43
【问题描述】:
我已经尝试了上述两个答案,但我觉得这些都不适合我的需要,因为根据下面的链接,我可以总结出 PKCS7 用于两个目的,
- 创建签名、摘要等 CMS(加密消息语法)
- 证书容器
我的需要更多的是第 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))。您指的其他标准是什么? ...
-
... 另见serverfault.com/questions/9708/… security.stackexchange.com/questions/94797/… security.stackexchange.com/questions/80410/… security.stackexchange.com/questions/73156/… -- 最后让我想起了另一种选择:Java
CertPath.getEncoded()creates a p7 -仅证书。 -
@dave_thompson_085 谢谢。我指的是 PKCS12 和另一种特定于 java 的称为 JKS(Java KeyStore) 格式。实际上我已经看到他们两个都支持只存储没有私钥的证书。因此,当其他格式可用时,为什么有人会使用 PKCS7 来存储证书的问题。也谢谢你的资源。你能写一个答案让我接受吗?还是我应该写?
标签: java security ssl keystore jks