如何使用私钥将.pfx文件转换为密钥库?

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

我做错了什么?

使用JDK 1.6或更高版本

Justin在下面的评论中指出,keytool本身可以使用下面的命令来做到这一点(尽pipe只在JDK1.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实用程序来validation密钥存储区的内容:

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

最后如果你需要的话,你可以通过将上面创build的密钥库导入到一个新的密钥库中,将它转换成一个JKS密钥库:

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

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" 

以上两个命令将提示您input在pfx export中指定的密码。 如果要以明文forms将密码挂起,请在-keystore开关之前使用-storepass开关

一旦签字,欣赏你的作品:

 jarsigner.exe -verify -verbose -certs yourjarfile 

我发现这个页面告诉你如何导入PFX到JKS(Java Key Store):

 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文件应该包含其中的私钥。 直接从您的PFX文件(例如使用OpenSSL)导出私钥和证书,并将它们导入您的Java密钥库。

编辑

更多信息:

  • 在这里下载OpenSSL for Windows。
  • 导出私钥: openssl pkcs12 -in filename.pfx -nocerts -out key.pem
  • 导出证书: openssl pkcs12 -in filename.pfx -clcerts -nokeys -out cert.pem
  • 使用keytool私钥和证书导入到Java密钥库中。

贾斯汀(上图)是准确的。 但是,请记住,取决于从中间CA获得证书的人员,是否涉及根CA,或者如何创build/导出pfx,有时可能会丢失证书链。 导入后,您将拥有一个PrivateKeyEntrytypes的证书,但具有长度为1的链。

要解决这个问题,有几个select。 在我心中,更容易的select是在IE中导入和导出pfx文件(select包括链中所有证书的选项)。 在IE中证书的导入和导出过程应该很容易,并且在其他地方有很好的logging。

一旦导出,导入上面指出的Justin的密钥库。 现在,您将拥有一个具有PrivateKeyEntrytypes的证书和证书链长度大于1的密钥库。

某些基于.Net的Web服务客户端出错(无法build立信任关系),如果您不这样做。

如果您使用的是JDK 1.5或更低版本,那么keytool实用程序将不具有-importkeystore选项(请参阅JDK 1.5 keytool文档 ),只有通过将计算机上的.pfx传输到较新的JDK(1.6或更高版本)。

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

Interesting Posts