2010-11-18 151 views
86

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

我在做什么错了?

+0

这可能是有用的:我如何找到并运行Windows的keytool http://stackoverflow.com/questions/5488339/how-can-i-find-and-run-the-keytool – 2014-04-07 06:29:25

回答

204

使用JDK 1.6或更高版本

已经指出的贾斯汀在低于密钥工具单独能够做这个使用下面的命令(虽然只在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 
+25

不需要全部三个步骤,只需运行:keytool -importkeystore -srckeystore mykeystore.pxf -destkeystore clientcert.jks -srcstoretype pkcs12 -deststoretype JKS – JustinMorris 2012-08-22 21:40:06

+0

@Justin谢谢你指出这一点。 – MikeD 2012-10-04 09:51:27

+0

我认为旧版本的keytool不会让你这样做。我记得8年前我必须运行openssl,但现在在Oracle JDK 6和7中使用keytool,就像Justin说的那样,它就像一个魅力一样。 – 2013-05-02 16:09:22

2

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

编辑

更多信息:

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

您能否请提供关于这一点的更多信息? – Ola 2010-11-18 16:44:41

+0

你能告诉我如何使用keytool导入key.pem和cert.pem吗? – 2012-12-30 07:20:38

+0

小增加:当输出私有ky时,必须添加-nodes – 2016-05-27 15:46:46

20

的jarsigner可以使用您的PFX文件的密钥库签署您的罐子。确保您的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 
+0

简单,并为我工作 - 感谢 – CJM 2014-01-29 13:26:07

+1

+ +1无需转换密钥库文件(我已经有足够的格式了!) – Trejkaz 2014-02-17 05:43:44

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 
+1

这应该是完整的答案! – JustAGuy 2016-03-02 00:17:11

0

如果你有JDK 1.5或以下keytool工具的工作不会有-importkeystore选项(请参阅JDK 1.5 keytool documentation),MikeD的解决方案只有在具有较新JDK(1.6或更高版本)的计算机上传输.pfx才可用。

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

2

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

要解决此问题,有几个选项。在我脑海中,更容易的选择是在IE中导入和导出pfx文件(选择包含链中所有证书的选项)。 IE中证书的导入和导出过程应该很容易,并且在其他地方有很好的文档记录。

导出后,导入上面指出的Justin的密钥库。 现在,您将拥有一个具有PrivateKeyEntry类型证书和证书链长度超过1的密钥库。

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

+0

这似乎不适用于IE11。即使我要告诉它,它也没有包含证书链。但我知道这在过去是有效的。 – 2016-01-15 14:18:58

相关问题