apksigner不接受密码

30

直到现在我一直使用以下方法对我的APK进行签名:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore {keystore-file} {apk-file} {keystore-alias}

然而,我试图使用新的apksigner工具,但无法使其工作,因为它始终告诉我密码无效。这是不可能的,因为我已经多次使用jarsigner进行过签名,并且成功了。我尝试过的命令如下:

apksigner sign --ks {keystore-file} {apk-file}

apksigner sign --ks {keystore-file} --ks-key-alias {keystore-alias} {apk-file}

当我创建一个新的密钥库以进行测试时,最奇怪的部分出现了。使用这个新的密钥库它可以正常工作,但是我不明白有什么区别。以下是通过在两者上调用“keytool -v -list -keystore {keystore-file}”获得的信息。

生产密钥库(为避免危险,我已删除了一些文本):

Keystore type: JKS
Keystore provider: SUN

Your keystore contains 1 entry

Alias name: {keystore-alias}
Creation date: Apr 4, 2016
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN={removed-text}, OU={removed-text}, O={removed-text}, L=Unknown, ST=Unknown, C=Unknown
Issuer: CN={removed-text}, OU={removed-text}, O={removed-text}, L=Unknown, ST=Unknown, C=Unknown
Serial number: {removed-text}
Valid from: Mon Apr 04 12:39:50 CEST 2016 until: Fri Aug 21 12:39:50 CEST 2043
Certificate fingerprints:
     MD5:  {removed-text}
     SHA1: {removed-text}
     SHA256: {removed-text}
     Signature algorithm name: SHA256withRSA
     Version: 3

Extensions: 

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: {removed-text}
0010: {removed-text} {removed-text}                                        ....
]
]



*******************************************
*******************************************

新测试密钥库:

Keystore type: JKS
Keystore provider: SUN

Your keystore contains 1 entry

Alias name: app
Creation date: Nov 17, 2016
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=Foobar, OU=Foobar, O=foobar, L=Unknown, ST=Unknown, C=Unknown
Issuer: CN=Foobar, OU=Foobar, O=foobar, L=Unknown, ST=Unknown, C=Unknown
Serial number: 448c7afc
Valid from: Thu Nov 17 11:40:26 CET 2016 until: Mon Apr 04 12:40:26 CEST 2044
Certificate fingerprints:
     MD5:  3E:29:C0:3C:30:B4:DC:E0:A5:94:1D:2E:E9:86:58:CA
     SHA1: 3D:09:B4:42:A2:7C:14:C7:3E:54:33:0E:AB:75:2E:F1:19:23:00:FA
     SHA256: 7F:E0:51:F1:6A:53:45:56:42:B9:F9:38:92:69:81:7A:DA:71:FF:44:51:15:7F:F9:B4:1C:AA:2B:53:4A:89:72
     Signature algorithm name: SHA256withRSA
     Version: 3

Extensions: 

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: BC 1B E6 C4 6D 25 01 70   CA AC 81 34 81 4B AE 41  ....m%.p...4.K.A
0010: 10 DF D8 13                                        ....
]
]



*******************************************
*******************************************

你从apksigner那里得到了什么错误消息/异常?此外,通过不同的组合在--ks-pass pass:<password>和--key-pass pass:<password>中提供密码给apksigner是否会改变任何内容?尝试使用--ks-pass而没有--key-pass,以及--key-pass而没有--ks-pass。 - Alex Klyubin
@AlexKlyubin 好的,我之前遇到的错误是“密码验证失败”,但在尝试了你说的在cmd中提供密码后,我得到了“Keystore密码的不支持密码规范”。我不知道密码规范是什么,但我将密码更改为一个简单版本(没有特殊字符),现在它可以工作了。我不明白为什么他们要更改格式。无论如何,这解决了我的问题,所以如果您想将评论移动到答案中,我会将其标记为已接受。如果您能解释一下为什么会发生这种情况,那就更好了:D。谢谢。 - Noel De Martin
很高兴听到你找到了解决方法。你是剥离了特殊字符还是用ASCII等价物替换它们(例如,“带变音符的a”变成“a”)? - Alex Klyubin
我已经去除了它们,现在我正在使用仅包含字母数字字符的密码。 - Noel De Martin
我相信我已经找到了解决方法。我现在已经提交了https://code.google.com/p/android/issues/detail?id=234089来跟踪这个问题,并正在努力修复/解决它。keytool/jarsigner中的这个问题也可能会解释类似于Android Plugin for Gradle/Android Studio无法使用某些密钥库,报告密码错误的问题。 - Alex Klyubin
5个回答

50

使用方式如下:

./apksigner sign --ks test.jks --ks-key-alias test --ks-pass pass:testtest --key-pass pass:testtest Test_Aligned.apk

21

我目前无法投票/评论,但支持Max的修正:

./apksigner sign --ks test.jks --ks-key-alias test --ks-pass pass:testtest --key-pass pass:testtest Test_Aligned.apk

在我的密码前面加上“pass:”对我很有效

--ks-pass pass:MyPassword
--key-pass pass:MyPassword

17

以下是对我有用的解决方法,我更改了如下内容:

--ks-pass "MyPassword"

将其更改为:

--ks-pass pass:"MyPassword"

这是一个工作起来比较奇怪的 API … 但它可以使用!


14

哇,我不知道你可以在密钥库中更改密码。

无论如何,我遇到了这个问题,结果发现您无需更改密码。诀窍是设置选项。

--ks-pass stdin --key-pass stdin

据说这是默认行为,但在我的情况下,它只有在我特别包含这些内容时才起作用。

执行命令,您将被要求输入密码,即使包括 ! 等字符也可以工作。


1
不幸的是,我已经尝试过了,但仍然无法工作。在这种情况下,我正在使用字符 ¡,但我仍然认为这很令人沮丧,因为我找不到任何文档记录。但是,jarsigner仍然可以使用相同的密码进行工作,所以这不是密码的问题。 - Noel De Martin
1
对我来说有效,如果他们将值“stdin”实现为“默认值”,我想不出这种情况可能发生的方式。 - Hai Zhang

6

原始答案可以在问题的评论中找到,我将其移动到这里以标记问题已回答。

虽然我仍然不确定100%的细节,但问题是我用于密钥库的密码包含特殊字符(*和!)。 将密码更改为字母数字格式后,问题得到解决。 因此,似乎apksigner不接受与jarsigner相同的密码格式。


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