我需要签署 Android 应用程序 ( .apk
)。
我有.pfx
档案。我.cer
通过 Internet Explorer 将其转换为文件,然后转换.cer
为.keystore
使用 keytool。然后我尝试.apk
用 jarsigner 签名,但它说 .keystore 不包含私钥。
我做错了什么?
我需要签署 Android 应用程序 ( .apk
)。
我有.pfx
档案。我.cer
通过 Internet Explorer 将其转换为文件,然后转换.cer
为.keystore
使用 keytool。然后我尝试.apk
用 jarsigner 签名,但它说 .keystore 不包含私钥。
我做错了什么?
使用 JDK 1.6 或更高版本
Justin 在下面的评论中指出,仅 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
我找到了这个页面,它告诉您如何将 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
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
贾斯汀(上图)是准确的。但是,请记住,根据您从谁获得证书(中间 CA、是否涉及根 CA)或 pfx 的创建/导出方式,有时他们可能会丢失证书链。导入后,您将拥有 PrivateKeyEntry 类型的证书,但链的长度为 1。
要解决此问题,有多种选择。在我看来,更简单的选择是在 IE 中导入和导出 pfx 文件(选择包括链中的所有证书的选项)。IE 中证书的导入和导出过程应该非常简单,并且在其他地方有据可查。
导出后,按照 Justin 的说明导入密钥库。现在,您将拥有一个证书类型为 PrivateKeyEntry 且证书链长度大于 1 的密钥库。
Certain .Net based Web service clients error out(unable to establish trust relationship), if you don't do the above.
您的 PFX 文件中应包含私钥。直接从您的 PFX 文件中导出私钥和证书(例如使用 OpenSSL)并将它们导入您的 Java 密钥库。
编辑
更多的信息:
openssl pkcs12 -in filename.pfx -nocerts -out key.pem
openssl pkcs12 -in filename.pfx -clcerts -nokeys -out cert.pem
keytool
。如果您使用 JDK 1.5 或更低版本,则 keytool 实用程序将没有-importkeystore
选项(请参阅JDK 1.5 keytool 文档),并且 MikeD 的解决方案只能通过.pfx
在具有较新 JDK(1.6 或更高版本)的机器上转移来获得。
JDK 1.5 或更低版本(如果您有 Oracle WebLogic 产品)中的另一个选项是遵循此 Oracle 文档中的说明:Using PFX and PEM Certificate Formats with Keystores。它描述了转换为.pem
格式,如何从这种文本格式中提取证书信息,并使用实用程序将其导入.jks
格式java utils.ImportPrivateKey
(这是 WebLogic 产品中包含的实用程序)。