购买代码签名证书时,从PKCS12到JKS证书开始有什么优点?一些vendors给出了有关从JKS或PKCS12证书签名请求开始的说明。我们希望在使用购买的证书时具有最大的灵活性,特别是考虑到成本。例如,我们可能签署的不仅仅是Java代码(例如:iPhone或Android代码签名)。在选择任何一种方法时,我们应该考虑哪些技术因素?
答案 0 :(得分:39)
如果您使用的是Java,那么Java密钥库是存储私钥的一个相当自然的地方.Java应用程序通常希望从JKS获取所需的密钥,并且可以从您自己的Java应用程序轻松访问。但是,JKS无法从Java外部访问(没有跳过几个箍)。
另一方面,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)。
答案 1 :(得分:5)
如果您有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