我需要签名 Android 应用 (.apk
)。
我有 .pfx
文件。我通过 Internet Explorer 将其转换为 .cer
文件,然后使用 keytool 将 .cer
转换为 .keystore
。然后我尝试使用 jarsigner 对 .apk
进行签名,但它说 .keystore 没有私钥内容。
我做错了什么?
我需要签名 Android 应用 (.apk
)。
我有 .pfx
文件。我通过 Internet Explorer 将其转换为 .cer
文件,然后使用 keytool 将 .cer
转换为 .keystore
。然后我尝试使用 jarsigner 对 .apk
进行签名,但它说 .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
-srcstorepass
是我的问题。这个 PFX 是由一个适用于 Windows 的 LetsEncrypt 客户端创建的。 - FiruzzZ... -srcstorepass "" ...
。 - mshikajijarsigner可以使用您的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导出时指定的密码。如果您想让密码以明文形式出现,请在-keystore开关之前使用-storepass开关
签名后,欣赏您的作品:
jarsigner.exe -verify -verbose -certs yourjarfile
你的PFX文件应该包含私钥。从PFX文件中直接导出私钥和证书(例如使用OpenSSL),然后将它们导入到Java keystore中。
编辑
更多信息:
openssl pkcs12 -in filename.pfx -nocerts -out key.pem
openssl pkcs12 -in filename.pfx -clcerts -nokeys -out cert.pem
keytool
将私钥和证书导入Java keystore。如果您使用的是JDK 1.5或更低版本,则keytool实用程序将没有-importkeystore
选项(请参见JDK 1.5 keytool文档),而MikeD的解决方案仅适用于将.pfx
转移到具有更新JDK(1.6或更高版本)的计算机上。
JDK 1.5或更低版本的另一个选择(如果您拥有Oracle WebLogic产品)是按照此Oracle文档的说明操作:在密钥库中使用PFX和PEM证书格式。它描述了如何将其转换为.pem
格式,如何从此文本格式中提取证书信息,并使用java utils.ImportPrivateKey
实用程序(这是WebLogic产品附带的实用程序)将其导入.jks
格式。
这是我在Visual Studio/Xamarin环境下的解决方案。
预期结果:
foo.pfx
)将被导入到JKS密钥库(示例中为bar.keystore
)中。bar
)。请注意,名称和密码不必匹配,但这是常见做法,也是工具所期望的。
keytool
位置: %JAVA_HOME%\bin
,例如:
C:\Program Files\Android\jdk\microsoft_dist_openjdk_1.8.0.25\bin
C:\Program Files (x86)\Java\jre1.8.0_331\bin
步骤:
keytool -importkeystore -srckeystore foo.pfx -srcstoretype pkcs12 -destkeystore bar.keystore -deststoretype JKS
生成的JKS密钥库将具有一个单一的密钥别名“1”,其临时分配的密码与步骤1中的PFX相同。
keytool -changealias -alias 1 -destalias bar -keystore bar.keystore
keytool -keypasswd -keystore bar.keystore -alias bar
%LOCALAPPDATA%\Xamarin\Mono for Android\Keystore\bar\bar.keystore
验证内容:
keytool -list -v -keystore foo.pfx -storetype pkcs12
keytool -list -v -keystore bar.keystore
现在,您应该能够在使用 Visual Studio 中的 Ad-Hoc 分发选项时看到并使用导入的密钥库。当提示时,请提供签名密码。