Google Play 的应用程序签名:没有密钥库,只有 .p12

App signing by Google Play: no keystore, just .p12

我正在尝试通过 Google Play 将我现有的应用程序切换为应用程序签名。有一个 post 为那些使用密钥库文件的人提供了很好的说明:

我的问题是我只有一个 .p12 文件而不是密钥库,我无法将其导入到密钥库文件中(长话短说)。

Google Play 使用应用程序签名的第一步是 "Export your app signing private key to a plaintext PEM file." 我做到了,现在我有了从我的原始 .第12页。从 Google 说明来看,他们似乎只需要包含我的私钥的 PEM 文件,而不是密钥库文件。

我的问题是如何使用 pepk 工具创建 Google 需要从 PEM 文件中获取的加密应用签名私钥。

Oracle has written complete instructions 关于将 PEM 转换为密钥库。它还包括 p12。这可能会做你想要的。

不幸的是,搜索引擎不太容易找到它,因为他们称它为 "JKS" 而不是密钥库。

简而言之:

使用以下命令将证书从 PEM 转换为 PKCS12: openssl pkcs12 -export -out eneCert.pkcs12 -in eneCert.pem

您可以忽略此命令发出的警告消息。 输入并重复导出密码。 使用以下命令创建然后删除一个空的信任库:

keytool -genkey -keyalg RSA -alias endeca -keystore truststore.ks
keytool -delete -alias endeca -keystore truststore.ks

-genkey 命令创建如下所示的默认证书。 (这是一个临时证书,随后会被 -delete 命令删除,因此您在这里输入的信息无关紧要。)

Enter keystore password:
Re-enter new password:
What is your first and last name?
[Unknown]: 
What is the name of your organizational unit?
[Unknown]:  
What is the name of your organization?
[Unknown]:  
What is the name of your City or Locality?
[Unknown]: 
What is the name of your State or Province?
[Unknown]: 
What is the two-letter country code for this unit?
[Unknown]: 
Is CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown correct?
[no]: yes

Enter key password for <endeca>
      (RETURN if same as keystore password):
Re-enter new password:

使用以下命令将 CA 导入信任库: keytool -import -v -trustcacerts -alias endeca-ca -file eneCA.pem -keystore truststore.ks

输入密钥库密码。 在提示符下,"Trust this certificate?" 键入 yes。 使用以下命令创建一个空的 Java KeyStore:

keytool -genkey -keyalg RSA -alias endeca -keystore keystore.ks
keytool -delete -alias endeca -keystore keystore.ks

-genkey 命令创建如下所示的默认证书。 (这是一个临时证书,随后会被 -delete 命令删除,因此您在这里输入的信息无关紧要。)

Enter keystore password:
Re-enter new password:
What is your first and last name?
[Unknown]: 
What is the name of your organizational unit?
[Unknown]:  
What is the name of your organization?
[Unknown]:  
What is the name of your City or Locality?
[Unknown]: 
What is the name of your State or Province?
[Unknown]: 
What is the two-letter country code for this unit?
[Unknown]: 
Is CN="Unknown", OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown correct?
[no]: yes

使用以下命令将您的私钥导入空 JKS:

keytool -v -importkeystore -srckeystore eneCert.pkcs12 -srcstoretype PKCS12 -destkeystore keystore.ks -deststoretype JKS

Thx Nick,一切正常。 使用创建的 keystore.ks 我能够使用 pepk jar 命令。 也许作为对 运行 在同一问题中的某个人的扩展:pepk jar 需要一个“别名”作为参数。要从 keystore.ks 中获取别名,您可以使用以下命令:

keytool -v  -list  -keystore keystore.ks

这将 return 您的信息存储在您的 .ks 文件中。您可以在那里看到 属性 别名 。在我的例子中,值只是 1 因为原始的 .p12 文件没有别名。

所以我最后的 pepk 命令是这样的:

java -jar pepk.jar --keystore=keystore.ks --alias=1 --output=encrypted_private_key_path --encryptionkey=SomeKeyWhichIsDisplayedInThePlayConsoleWindow