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

时间:2010-11-18 16:25:13

标签: java certificate apk keytool jarsigner

我需要签署Android应用程序(.apk) 我有.pfx个文件。我通过Internet Explorer将其转换为.cer文件,然后使用keytool将.cer转换为.keystore。然后我尝试用jarsigner签署.apk,但它说.keystore不包含私钥。

我做错了什么?

6 个答案:

答案 0 :(得分:240)

使用JDK 1.6或更高版本

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

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

使用JDK 1.5或更低版本

OpenSSL可以做到这一切。 This answer on 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

答案 1 :(得分:21)

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

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

获得别名后,签名很容易

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

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

签名后,敬佩你的工作:

jarsigner.exe -verify -verbose -certs  yourjarfile

答案 2 :(得分:15)

我找到了this页面,告诉您如何将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 :(得分:2)

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

修改

更多信息:

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

答案 4 :(得分:2)

贾斯汀(上图)是准确的。但是,请记住,根据您从哪个获得证书(中间CA,是否涉及根CA)或者如何创建/导出pfx,有时它们可​​能会丢失证书链。导入后,您将拥有PrivateKeyEntry类型的证书,但长度为1的链

要解决此问题,有几种选择。我认为更容易的选择是在IE中导入和导出pfx文件(选择包含链中所有证书的选项)。 IE中证书的导入和导出过程应该非常简单并且在其他地方有详细记录。

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

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

答案 5 :(得分:0)

如果您使用JDK 1.5或更低版本,则keytool实用程序将不具有-importkeystore选项(请参阅JDK 1.5 keytool documentation),并且仅在转移.pfx时才能使用MikeD的解决方案具有较新JDK(1.6或更高版本)的机器。

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