如何将.pfx文件转换为带有私钥的密钥库?


107

我需要签署Android应用程序(.apk)。
我有.pfx档案 我把它转化为.cer通过Internet Explorer文件,然后转换.cer.keystore使用密钥工具。然后我尝试.apk用jarsigner 签名,但是它说.keystore不包含私钥。

我做错了什么?


这是有用的:我怎么能找到并运行的Windows密钥工具stackoverflow.com/questions/5488339/...
彼得Barbanyaga

Answers:


259

使用JDK 1.6或更高版本

贾斯汀在下面的评论中指出,仅keytool能够使用以下命令来执行此操作(尽管仅在JDK 1.6和更高版本中):

keytool -importkeystore -srckeystore mypfxfile.pfx -srcstoretype pkcs12 
-destkeystore clientcert.jks -deststoretype JKS

使用JDK 1.5或更低版本

OpenSSL可以完成所有工作。到目前为止,关于JGuru的答案是我发现的最佳方法。

首先,请确保您已安装OpenSSL。正如我在Mac OS X上发现的那样,已经安装了许多操作系统。

以下两个命令将pfx文件转换为可以作为Java PKCS12密钥存储打开的格式:

openssl pkcs12 -in mypfxfile.pfx -out mypemfile.pem
openssl pkcs12 -export -in mypemfile.pem -out mykeystore.p12 -name "MyCert"

注意,第二个命令中提供的名称是新密钥库中密钥的别名。

您可以使用Java keytool实用工具通过以下命令来验证密钥存储的内容:

keytool -v -list -keystore mykeystore.p12 -storetype pkcs12

最后,如果需要,可以通过将上面创建的密钥库导入到新的密钥库中,将其转换为JKS密钥库:

keytool -importkeystore -srckeystore mykeystore.p12 -destkeystore clientcert.jks -srcstoretype pkcs12 -deststoretype JKS

28
不需要全部三个步骤,只需运行:keytool -importkeystore -srckeystore mykeystore.pxf -destkeystore clientcert.jks -srcstoretype pkcs12 -deststoretype JKS
JustinMorris 2012年

我认为较旧版本的keytool不允许您这样做。我记得8年前我必须运行openssl,但是现在在Oracle JDK 6和7中使用keytool,就像Justin所说的那样,它就像一个魅力。
大卫·布罗萨德

2
请注意,在贾斯汀问世一年之前,我以更简单的形式给出了该答案。
gjpc 2014年

@gjpc注意。您的答案非常完整,值得
多加

这确实是一个很好的答案,经过几天的研究,它挽救了我。这个答案确实值得更多的赞扬。谢谢你,先生。
Mythul 2014年

22

jarsigner可以将您的pfx文件用作对jar进行签名的密钥库。导出时,请确保pfx文件具有私钥和证书链。无需转换为其他格式。诀窍是获取pfx文件的别名

 keytool -list -storetype pkcs12 -keystore your_pfx_file -v | grep Alias

有了别名后,签名很容易

jarsigner.exe -storetype pkcs12 -keystore pfx_file jar_file "your alias"

以上两个命令将提示您输入在pfx导出中指定的密码。如果您想让密码以明文形式挂出,请在-keystore开关之前使用-storepass开关

签名后,欣赏您的作品:

jarsigner.exe -verify -verbose -certs  yourjarfile

1
+1不必转换密钥库文件(我已经拥有足够的格式!)
Trejkaz 2014年

22

我发现页面告诉您如何将PFX导入到JKS(Java密钥库):

keytool -importkeystore -srckeystore PFX_P12_FILE_NAME -srcstoretype pkcs12 -srcstorepass PFX_P12_FILE -srcalias SOURCE_ALIAS -destkeystore KEYSTORE_FILE -deststoretype jks -deststorepass PASSWORD -destalias ALIAS_NAME

3
这应该是完整的答案!
JustAGuy

我一直在寻找这样一个答案-用别名
user3437460

我有一个问题,pfx没有密码,所以-srcstorepass也是我的问题。此PFX由Windows的LetsEncrypt客户端创建
FiruzzZ

2

您的PFX文件中应包含私钥。直接从您的PFX文件中导出私钥和证书(例如,使用OpenSSL),并将其导入到Java密钥库中。

编辑

更多信息:

  • 在此处下载适用于Windows的OpenSSL 。
  • 导出私钥: openssl pkcs12 -in filename.pfx -nocerts -out key.pem
  • 出口证明书: openssl pkcs12 -in filename.pfx -clcerts -nokeys -out cert.pem
  • 使用将私有密钥和证书导入Java密钥库keytool

您能告诉我如何使用keytool导入key.pem和cert.pem吗?
Sad Al Abdullah

1
小增加:导出私有ky时,您必须最后添加-nodes
morgan_il

2

贾斯汀(上)是准确的。但是,请记住,取决于您从谁那里获得证书(中间CA,是否涉及根CA)或创建/导出pfx的方式,有时他们可能会丢失证书链。导入后,您将拥有一个PrivateKeyEntry类型的证书,但其链长度为1。

要解决此问题,有几种选择。在我看来,更简单的选择是在IE中导入和导出pfx文件(选择“包括链中的所有证书”的选择)。IE中证书的导入和导出过程应该非常容易,并且在其他地方也要有充分的文档证明。

导出后,按上面贾斯汀的指示导入密钥库。现在,您将拥有一个密钥库,其证书类型为PrivateKeyEntry且证书链长度大于1。

如果您不执行上述操作,则某些基于.Net的Web服务客户端就会出错(无法建立信任关系)。


这似乎不适用于IE11。即使我告诉它,也没有包含证书链。我知道这在过去是可行的。
Brian Knoblauch

0

如果您使用JDK 1.5或更低版本,则keytool实用程序将没有该-importkeystore选项(请参阅JDK 1.5 keytool文档),而MikeD的解决方案仅可通过.pfx在具有较新JDK(1.6或更高版本)的机器上进行传输来获得。

JDK 1.5或更低版本(如果您具有Oracle WebLogic产品)中的另一个选项是遵循此Oracle文档中的说明:将PFX和PEM证书格式与密钥库一起使用。它描述了转换为.pem格式,如何从此文本格式提取证书信息以及如何.jks使用java utils.ImportPrivateKey实用程序(这是WebLogic产品附带的实用程序)将其导入格式的信息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.