【问题标题】:How to convert .pfx file to keystore with private key?如何使用私钥将 .pfx 文件转换为密钥库?
【发布时间】:2011-05-12 03:40:54
【问题描述】:

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

我做错了什么?

【问题讨论】:

标签: java certificate apk keytool jarsigner


【解决方案1】:

使用 JDK 1.6 或更高版本

Justin 在下面的 cmets 中指出,仅 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

【讨论】:

  • 三个步骤都不需要,直接运行:keytool -importkeystore -srckeystore mykeystore.pxf -destkeystore clientcert.jks -srcstoretype pkcs12 -deststoretype JKS
  • 我认为旧版本的 keytool 不会让你这样做。我记得 8 年前我必须运行 openssl,但现在在 Oracle JDK 6 和 7 中使用 keytool,就像 Justin 所说的那样,它就像一个魅力。
  • 请注意,我比贾斯汀早一年以更简单的形式给出了这个答案,并提供了更多细节。
  • @gjpc 注意。您的回答非常完整,值得大量投票:)
  • 这确实是一个很好的答案,经过几天的研究,它救了我。这个答案确实值得更多的赞成。谢谢先生。
【解决方案2】:

我找到了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

【讨论】:

  • 我有一个问题,pfx 没有密码,所以-srcstorepass 是我的问题。此 PFX 由适用于 Windows 的 LetsEncrypt 客户端创建
【解决方案3】:

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 因为不必转换密钥库文件(我已经有足够的格式了!)
【解决方案4】:

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

要解决此问题,有多种选择。在我看来,更简单的选择是在 IE 中导入和导出 pfx 文件(选择包括链中的所有证书的选项)。 IE 中证书的导入和导出过程应该非常简单,并且在其他地方有据可查。

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

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

【讨论】:

  • 这似乎不适用于 IE11。即使我告诉它,它也没有包含证书链。我知道这在过去是有效的。
【解决方案5】:

您的 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 密钥库。

【讨论】:

  • 你能告诉我如何使用 keytool 导入 key.pem 和 cert.pem 吗?
  • 小补充:导出私有ky的时候要在最后加上-nodes
【解决方案6】:

如果您使用 JDK 1.5 或更低版本,则 keytool 实用程序将没有 -importkeystore 选项(请参阅 JDK 1.5 keytool documentation),并且 MikeD 的解决方案只能通过在具有较新 JDK 的机器上传输 .pfx 来获得(1.6或以上)。

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

【讨论】: