32

购买代码签名证书时,从 PKCS12 开始与 JKS 证书相比有哪些优点?一些供应商给出了从 JKS 或 PKCS12 证书签名请求开始的说明。我们希望在使用购买的证书时拥有最大的灵活性,尤其是考虑到成本。例如,我们可能签署的不仅仅是 Java 代码(例如:iPhone 或 Android 代码签名)。在选择这两种方法时,我们应该考虑哪些技术因素?

4

2 回答 2

53

如果您使用 Java,那么 Java Key Store 是一个相当自然的存储私钥的地方。Java 应用程序通常希望从 JKS 获取所需的密钥,并且可以从您自己的 Java 应用程序轻松访问。但是,无法从 Java 外部访问 JKS(无需跳过几圈)。

另一方面,PKCS#12(又名 PFX)文件是一种与语言无关的方式来存储加密的私钥和证书,并且已经存在了足够长的时间,几乎可以在任何地方得到支持。但请注意,文件格式过于复杂和过于笼统——看看 Peter Gutmann 的“PFX - 如何不设计加密协议/标准”(http://www.cs.auckland.ac .nz/~pgut001/pubs/pfx.html ) 以轻松地看待这些问题。

请注意,使用这些存储格式中的一种或其他格式确实是关于您的应用程序将如何在本地存储加密私钥的问题。向您出售您的证书的供应商永远不会看到私钥,因此他不在乎您使用什么格式。您向他(供应商/CA)发送 PKCS#10 证书请求(包含公钥并使用私钥签名,但不包含私钥),然后他向您发回证书(您可以将其存储在 JKS 或PKCS#12 文件或两者,或其他任何你喜欢的地方)。

从技术上讲,这两种格式都不理想,因为它们都通过使用从密码派生的密钥对其进行加密来保护私钥;但是,这并不能使任何一个比另一个更好。如果您可以使用智能卡或其他硬件密钥存储解决方案,则安全性(虽然不方便)会更好。

决定您选择的主要因素应该是您计划如何使用私钥——即:哪些应用程序需要使用私钥以及它们已经处理的密钥存储格式。PKCS#12 是更灵活的选项...但是如果您打算仅将密钥与您自己编写的代码一起使用(不需要互操作性),那么您也可以考虑使用 PKCS#8 或 PKCS#15 容器。

我不建议您编写自己的代码来处理 PKCS#12(我已经完成了,不好玩)——使用经过验证的第三方库(如 OpenSSL)。

于 2010-10-14T11:28:18.210 回答
10

如果您有 JKS 密钥库,您可以使用以下命令转换为 PKCS12

keytool -importkeystore -srckeypass secret -destkeypass meow123 -srcstorepass secretstore -deststorepass secretstore -srcalias certforsigning -destalias certforsigning -srcalias certforencryption -destalias certforencryption -srckeystore my_java_keystore.jks -destkeystore PFX_keystore.pfx -deststoretype PKCS12

其中 my_java_keystore.jks 是 java 密钥库,它有两个密钥,别名为 certforsigning 和 certforencryption

您还可以使用 Keytool 将密钥从 PKCS12 转换为 JKS

于 2013-04-23T13:35:53.107 回答