【问题标题】:Keytool change key password using 'keypasswd' throws 'Alias has no key' errorKeytool 使用“keypasswd”更改密钥密码会引发“别名没有密钥”错误
【发布时间】:2015-09-24 15:17:07
【问题描述】:

我正在尝试更改我的密钥库中私钥的密码。执行以下操作:

keytool -keypasswd -alias <alias name> -keystore <keystore path>

我明白了:

Enter keystore password: <keystore password>

返回:

keytool error: java.lang.Exception: Alias <ltsabreskey> has no key

此密钥库是使用从丢失密码的其他密钥库中提取的证书生成的。我正在尝试将更新推送到 Play 商店中的现有应用程序,这可以使用从提取的证书中新生成的密钥库来完成吗?

【问题讨论】:

    标签: java android eclipse keytool


    【解决方案1】:

    注意:此答案适用于 JKSJCEKS 密钥库类型,而不适用于 PKCS12

    密钥库可以保存secret-keykey-pair(私钥+证书链)或certificate。当你-list keystore -- SecretKeyEntry, PrivateKeyEntrytrustedCertEntry 时,你可以分别通过这些名称来识别这些类型。

    如果密钥库类型为JKSJCEKS,其中的SecretKeyEntry 和PrivateKeyEntry 可以使用它们自己的密码(可能与密钥库密码不同)进行保护。对于PKCS12 密钥库类型,您不能拥有不同的密钥库和密钥密码,密钥密码必须与密钥库密码相同。

    现在,您在上次声明中提到您正在使用的密钥库是使用从不同密钥库导出的证书创建的。将证书添加到密钥库有两种不同的用例。当您想要信任特定证书时,您可以只添加证书本身,这称为truststedCertEntry。或者,您可以添加/更新密钥对的证书。这意味着要添加的证书将与私钥相关联,这是一个PrivateKeyEntry

    您正在使用的别名是trustedCertEntry,它不能有keypass。因此,当您针对此别名提供 keypasswd 命令时,它会通过您出现“无键”错误,这就是您所看到的。


    要回答您的具体问题,如果没有私钥,您将无法执行您正在执行的操作,您从原始密钥库中提取了证书,但它没有私钥,并且您无法在没有私钥的情况下提取私钥密码。因此,简而言之,您需要恢复您的旧密钥库,如果您无法恢复,请按照 Play 商店指南了解如果原始密钥库不可恢复该怎么办。

    【讨论】:

    • 这很好地解释了错误发生的原因,但没有提供关于可以采取什么措施的答案。
    • 没有解决方法。 OP 使用错误的数据并期望它以不同的方式工作,这是不正确的。我在最后两段中已经解释并指出了问题。
    • 当然没有按原样修复,但答案至少应该为人们指明正确的方向 - 例如。获取密钥的私有部分。该指导部分完全缺失,因此这不是答案,而是解释。
    • @TeodorSandu 同意,更新了答案。
    • 抱歉耽搁了。现在投票了:)
    【解决方案2】:

    您是否检查过密钥是否真的在密钥库中?试试这个:

    keytool -list -keystore <keystore path>
    

    如果别名不正确(密钥库中不存在密钥)我会得到同样的错误。

    【讨论】:

    • 我遇到了同样的问题,并且有问题的密钥存在于 keytool -list 输出中。