在命令行中运行PEPK应用签名工具出错(java -jar pepk.jar)。

16

我收到以下输出:

错误:null

该命令从命令行执行:

java -jar pepk.jar --keystore=my.keystore --alias=x --output=my.output --encryptionkey=1243

有人知道为什么或如何解决吗?

"my.keystore"文件存在且为密钥库。别名是正确的,而"my.output"文件不存在。我已更改示例中的encryptionkey值,但无论使用什么值,始终会获得相同的输出。

我尝试过双引号括起来的密钥库和输出值,并提供(用引号括起来的)密钥库文件和输出文件的完整路径。仍然是相同的错误输出。该jar正在被执行,因为如果缺少某些内容,我会看到显示的使用帮助。我还尝试在不同的目录中运行命令,并确保输出目录中的权限正确。

我正在使用Java版本:

Java版本“9” Java(TM) SE Runtime Environment (build 9+181) Java HotSpot(TM) 64-Bit Server VM (build 9+181, mixed mode)

在Windows 10上。(我尝试了/和两种路径)。 pepk.jar是从我的应用程序Play Store的应用签名页面于此问题发布的当天下载的。

更新,使用2018年9月17日下载的新版本:

根据Pierre的建议下载了新版本的pepk.jar之后,输出现在是:

Error: Unable to export or encrypt the private key
java.lang.NullPointerException
at com.google.wireless.android.vending.developer.signing.tools.extern.export.KeystoreHelper.loadKeystore(KeystoreHelper.java:45)
at com.google.wireless.android.vending.developer.signing.tools.extern.export.KeystoreHelper.getPrivateKey(KeystoreHelper.java:38)
at com.google.wireless.android.vending.developer.signing.tools.extern.export.ExportEncryptedPrivateKeyTool.run(ExportEncryptedPrivateKeyTool.java:114)
at com.google.wireless.android.vending.developer.signing.tools.extern.export.ExportEncryptedPrivateKeyTool.main(ExportEncryptedPrivateKeyTool.java:79)

我已经通过使用keytool -list -v -keystore,双重检查了密钥库并确认它包含一个私钥。


当您运行keytool时,您能否提取密钥的证书? keytool -export -alias <别名> -file /tmp/cert.crt -keystore <your.keystore> - Pierre
是的,我刚试了一下导出功能,运行得很好。 - Gary Bentley
你能否尝试通过下载最新版本的pepk工具再次尝试?我不指望它会更好地工作,但它应该会给我们提供更多有关错误的信息。 - Pierre
我的意思是,我们昨天更新了pepk工具,所以现在你会得到一个堆栈跟踪,而不仅仅是“null”,这将为我提供更多信息来解决问题的根源。 - Pierre
啊,好的,我明天会试一下。之前不太清楚你参与了这个工具的开发。 - Gary Bentley
显示剩余2条评论
6个回答

27

要运行此语法,您需要至少 Java 版本 8 (JDK 1.8):

java -jar PATH_TO_PEPK --keystore=PATH_TO_KEYSTORE --alias=ALIAS_YOU_USE_TO_SIGN_APK --output=PATH_TO_OUTPUT_FILE --encryptionkey=GOOGLE_ENCRYPTION_KEY

说明:

  • PATH_TO_PEPK = pepk.jar 文件的路径,可以是类似于 C:\Users\YourName\Downloads\pepk.jar 的 Windows 用户路径。
  • PATH_TO_KEYSTORE = 用于签署发布 APK 的密钥库文件路径。文件类型可以是 *.keystore*.jks 或无扩展名。例如:C:\Android\mykeystoreC:\Android\mykeystore.keystore
  • ALIAS_YOU_USE_TO_SIGN_APK = 用于签署发布 APK 的别名名称。
  • PATH_TO_OUTPUT_FILE = 带有 .pem 扩展名的输出文件路径,例如 C:\Android\private_key.pem
  • GOOGLE_ENCRYPTION_KEY = 此加密密钥始终应相同。您可以在 App 签署页面上找到并复制粘贴它。应该是这种形式:eb10fe8f7c7c9df715022017b00c6471f8ba8170b13049a11e6c09ffe3056a104a3bbe4ac5a955f4ba4fe93fc8cef27558a3eb9d2a529a2092761fb833b656cd48b9de6a

示例:

java -jar "C:\Users\YourName\Downloads\pepk.jar"
--keystore="C:\Android\mykeystore" --alias=myalias --output="C:\Android\private_key.pem" --encryptionkey=eb10fe8f7c7c9df715022017b00c6471f8ba8170b13049a11e6c09ffe3056a104a3bbe4ac5a955f4ba4fe93fc8cef27558a3eb9d2a529a2092761fb833b656cd48b9de6a
在终端输入命令后,您需要提供以下信息:
  1. 密钥库密码
  2. 别名密码

如果一切正常,现在将会在 PATH_TO_OUTPUT_FILE 文件夹中生成一个名为 private_key.pem 的文件。

更多资源:


2
我已经将JDK更新到最新版本,但仍然遇到相同的错误。:( - user3077416

13

我最终通过使用标准的 Windows (10) 命令提示符 "cmd" 来解决了这个问题。看起来 System.getConsole 正在为 cmd 返回一个非空值。

我没有找到任何关于 mingw64(我通常在 Windows 上使用的命令提示符)正在发生什么以及为什么 System.getConsole 没有被设置的信息。


在尝试在Cygwin和Git Bash中运行失败后,这对我起作用了。 - droideckar
1
非常感谢!最终在PowerShell中为我工作了。 - jetpackpony

10

如果您正在使用 gitbash,则必须在命令前加上前缀

winpty

由于PEPK命令需要控制台输入, (或通过标准的windows CMD提示符运行)

1
哇,谢谢。我自己永远也达不到这个水平! - Chris Rae
非常感谢。我以前总是卡在这里,直到现在才在CMD上尝试而不是gitbash,但现在我也可以在gitbash上使用它了。 - Atin Agrawal

5

我非常感激@droidBomb在之前的回答中提供的响应。

Xamarin Android 的解决方案略有不同。

必要的标志:

--keystore 包含要导出的私钥的密钥库的路径(例如:C:\Users\YourName\Downloads\abc.keystore)

--alias 密钥库中私钥的别名(例如:upload)

--encryptionkey 用于加密私钥的公钥。这将是公钥的十六进制编码字节。公钥 是一个 4 字节标识符,后跟一个 64 字节 P256 点。(例如:eb10fe8f7c7c9df715022017b00c6471f8ba8170b13049a11e6c09ffe3056a104a3bbe4ac5a955f4ba4fe93fc8cef27558a3eb9d2a529a2092761fb833b656cd48b9de6a)

--output 要输出加密后的私钥的文件(例如:C:\Users\YourName\Downloads\private_key.pem)

  1. 打开命令提示符
  2. 从您的应用程序的Google控制台下载pepk文件。
  3. 准备以下命令
  4. java -jar "C:\Users\YourName\Downloads\pepk.jar" --keystore="C:\Users\YourName\Downloads\upload.keystore" --alias="upload" --encryptionkey=eb10fe8f7c7c9df715022017b00c6471f8ba8170b13049a11e6c09ffe3056a104a3bbe4ac5a955f4ba4fe93fc8cef27558a3eb9d2a529a2092761fb833b656cd48b9de6a --output="C:\Users\YourName\Downloads\private_key.pem"

相应的pem文件将在输出路径中生成。


你的回答和droidBomb的回答有什么不同?看起来需要相同的4个密钥...还是你只是指出了从Android应用程序密钥库上传到Google开发者控制台时要使用的“encryptionkey”的正确值,以便在启用“Google Play应用签名”(https://support.google.com/googleplay/android-developer/answer/7384423)时使用?[这与XAMARIN Android无关。] - ToolmakerSteve

4

在尝试使用gitbash / mingw64在Windows 10上时,我遇到了同样的问题。但是,在PowerShell中它完美地运行。


1

在命令行中会提示输入密钥库和密钥的密码。

问题似乎是您的Java环境没有可用的控制台,即System.console()返回null。

如果您能告诉我是什么原因导致您的Java环境出现这种情况,那么我们可能会尝试为您的使用情况找到解决方案。


我不知道为什么System.console返回null,我是从Windows 64的MINGW64终端运行的,即命令行。一个测试程序显示System.console始终返回null,但System.out正确地重定向到终端。我已在Java控制面板中启用了Java控制台,但没有任何影响。 - Gary Bentley
这个问题有任何更新吗?我今天重新下载了工具,但是仍然出现相同的错误。这正阻止我们在Google商店中更新我们的应用程序。 - Gary Bentley
你有没有在IDE内部的终端中运行命令?查看控制台为什么为空,这是网上提出的第一个原因。不幸的是,其他替代方案无法在您输入密码时隐藏它,因此我将继续寻找解决方案,但从不同的终端或其他人的计算机尝试可能是目前最好的选择。 - Pierre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接