【问题标题】:Android keystore stopped workingAndroid 密钥库停止工作
【发布时间】:2012-11-12 04:37:50
【问题描述】:

就在最近我遇到了密钥存储问题。我知道已经有很多关于这个问题的问题了。我已全部阅读并疯狂地用 Google 搜索。

错误:

keytool error: java.io.IOException: Keystore was tampered with, or password was incorrect
java.io.IOException: Keystore was tampered with, or password was incorrect
    at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:772)
    at sun.security.provider.JavaKeyStore$JKS.engineLoad(JavaKeyStore.java:55)
    at java.security.KeyStore.load(KeyStore.java:1214)
    at sun.security.tools.KeyTool.doCommands(KeyTool.java:885)
    at sun.security.tools.KeyTool.run(KeyTool.java:340)
    at sun.security.tools.KeyTool.main(KeyTool.java:333)
Caused by: java.security.UnrecoverableKeyException: Password verification failed
    at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:770)
    ... 5 more

我正在使用的软件:

Java

java version "1.7.0_21"
Java(TM) SE Runtime Environment (build 1.7.0_21-b11)
Java HotSpot(TM) 64-Bit Server VM (build 23.21-b01, mixed mode)

日食

Version: 3.8.0
Build id: I20120502-2000

最新的 ADT 插件

最新的 Android SDK

这是我所知道的:

  • 我没有丢失密码,也从未更改过。
  • 我无法找回密码(我知道密码)。
  • 如果不发布全新的应用程序,我无法使用不同的密钥签署现有应用程序(因此我无法发布任何更新)。

这是我所做的:

  • 我已经多次卸载并重新安装了 Eclipse。
  • 我已经卸载并重新安装了 android ADT 插件。
  • 我已经多次删除并重新下载了最新的 Android SDK。
  • 我已经卸载并重新安装了JDK7。
  • 我已尝试使用我的密钥库的备份。
  • 我已使用“md5sum KEYSTORE”检查了 MD5 校验和,并与备份进行了比较(相同的 MD5 输出 - 未被篡改)。
  • 我已经尝试暴力破解密钥存储(我已经找回了我知道的密码)。
  • 我创建了一个测试密钥(使用当前设置)并测试了密码,它似乎工作正常(所以有些东西发生了变化)。
  • 我已尝试手动导出 android .apk,然后尝试对其进行签名(在 Eclipse 之外)。

这是我导出签名应用程序的方法:

  • 通过 Eclipse: 使用 File > Export > Export Android Application 导出。
  • JDK7 之前: jarsigner -verbose -keystore KEYSTORE FILE ALIAS。
  • 使用 JDK7: jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore KEYSTORE FILE ALIAS。

还有什么需要弄清楚或尝试的?

  • 一些参考资料/网址说要删除“trusted.certs”文件?
  • 尝试删除“debug.keystore”?
  • 更新 Eclipse 或任何 Android 开发工具会影响我的密钥库吗?
  • 将 Java 从 jdk6 更新到 jdk7 会产生任何问题吗?
  • 这会扰乱或改变 jarsigner 的工作方式吗?

用户建议:

  • 尝试使用 JDK6,但我最近能够导出应用程序。
  • 检查了我 local.properties 中的 key.store.password 或 key.alias.password
  • 在 Eclipse 中自动取消选中构建并清理您的项目
  • 尝试删除工作区中的 .metadata 文件夹并清除所有临时文件夹。

总结

  • 密钥库没有改变,
  • 我有密钥库的密码,
  • 我最近使用以下方法成功导出了一个应用程序:
    • Eclipse 3.8(和 Eclipse 4.0+),
    • 最新的 Java 7,
    • 最新的 ADT 插件。
  • 我上一次成功导出和构建是在几周前使用 Eclipse 3.8、最新的 Android 工具和 Java 7 并使用相同的密码。

更新(2014 年 6 月 29 日)

  • 我已使用:keytool -list -keystore KEYSTORE 成功证明并证明我的 4 个密钥中的 3 个有效。
  • 我暴力破解了最后一个密钥并从密钥库中获得了密码(我已经知道的密码),但是当我输入签名时密码不起作用。我用过:java -jar AndroidKeystoreBrute_v1.02.jar -m 3 -k KEYSTORE -d WORDLIST
  • 奇怪的是,有时当我很快将密码输入 eclipse 时,我的别名会显示出来,我可以成功导出我的应用程序。 (我知道这很疯狂)。
  • 更新了 Java 版本。

如果我很快输入密码,有时它会起作用。

看来第一次打开 Eclipse 并输入密码让我可以使用密钥库。

显然,如果一切都失败了,我将不得不创建一个新的密钥库。我真的很想解决这个问题,除了用新密钥重新发布之外,我现在不知道该怎么办。

如果密钥无法正常恢复,我可能会在 Github 上开源。


解决方案(2014 年 6 月 29 日):

特别感谢用户 Erhannis!

这是我所做的:

该命令每次都会在我身上出错:

keytool -importkeystore -srckeystore old.keystore -destkeystore new.keystore -v

由于您告诉我我们可以从 Java Keystore(.jks) 中提取私钥,因此我深入挖掘并最终使用了该命令的变体。我关注了您发布的链接herehere

keytool -importkeystore -srckeystore old.keystore -destkeystore new.keystore -deststoretype pkcs12

提取私钥并存储为 PKCS12 后,我想提取我的私钥并将其放回一个全新的 Java Keystore:

keytool -importkeystore -srckeystore new.keystore -srcstoretype pkcs12 -destkeystore final.keystore -deststoretype jks

参考资料:

http://developer.android.com/tools/publishing/app-signing.html#signapp

http://code.google.com/p/android-keystore-password-recover/

我已阅读的 StackOverflow URL 列表:

How to handle a lost KeyStore password in Android?

Invalid Keystore problem?

Android: I lost my android key store, what should I do?

I lost my .keystore file?

Forgot Keystore password, thinking of Brute-Force detection. will it corrupt the keystore?

I have lost the password for android Keystore file

Problem running my signed, release keystore in Eclipse

Android - Forgot keystore password. Can I decrypt keystore file?

Android release keystore issue: "Keystore was tampered with, or password was incorrect"

【问题讨论】:

  • 您的密钥库文件是否可能以某种方式损坏?如果您尝试使用已存储在其他地方(如果有的话)的备份密钥库文件,它是否有效?
  • 我已经回答了这个问题。我已经检查了备份和当前的 MD5,看看它们是否相同。我也尝试过使用备份无济于事。
  • 我存储在本地,但我总是保留备份。
  • 我想我可能有同样的问题。你觉得会是this problem吗?
  • 看起来很相似。当我不久前更新时,一切都开始发生了。它只影响了一个应用程序。

标签: java android apk keystore jarsigner


【解决方案1】:

我可能遇到了同样的问题。我从来没有弄清楚它失败的原因(尽管我想知道是不是因为密钥库密码短于 6 位),但是我能够将我的密钥复制到一个新的密钥库中,然后我将其重命名以替换旧的,之后它神秘地工作了(使用新密码)。顺便说一句,需要密钥密码。在https://security.stackexchange.com/a/3795 工作,我做了以下事情:

  1. keytool -importkeystore -srckeystore old.keystore -destkeystore new.keystore -v
  2. 两次输入新的密钥库密码
  3. 当它要求我输入源密钥库密码时按 Enter(留空)
  4. 输入密钥密码

在仔细检查新版本是否有效后,我只是将其复制到旧版本上。希望这对你有用;祝你好运。

【讨论】:

  • 我有点困惑,为什么它将我的帖子标记为“社区 wiki”。编辑:哦,等等,我明白了。问题本身被标记为“社区 wiki”。
  • 不知什么原因,我现在才看到这个,我会尽快尝试并回复您!
  • 抱歉让您久等了。我已经尝试过了,但每次尝试输入密码时总是收到相同的错误。
  • @JaredBurrows 当您尝试将密钥复制到新的密钥库或尝试使用新的密钥库时,它是否给您错误?
  • 是的,它总是抱怨密码。但是,当我使用暴力破解工具时,我会找回密码。该工具能够登录/检查正确的密码。
【解决方案2】:

我遇到了同样的问题,我尝试了该线程中建议的所有方法,但没有任何方法可以保存我的别名密码。关键是我对密码绝对确定,因为我已经更新了应用程序四次。我收到 “密钥库被篡改,或密码不正确” 消息。

解决办法

似乎在使用 eclipse 创建密钥库时,在密码前添加了一个空格字符!

这个讨厌的错误显然已在更高版本中得到修复,导致我无法使用我认为正确的密码签署我的应用程序。

基于此 SO 链接:Ant fails to build signed apk after updating to android v20 我建议您尝试在密码之前或之后添加一个空格字符

【讨论】:

  • 我在 Unity 上遇到了同样的问题——在我的例子中是 2 个空格。必须小心使用复制/粘贴!浪费了我4个小时的时间。 :(
【解决方案3】:

尝试删除工作区中的 .metadata 文件夹并清除所有临时文件夹。如果您的密钥库文件没有损坏,并且您尝试正确重新安装 Eclipse、ADT、Android SDK 和 Java SDK,我看不出这个奇怪问题的其他可能原因,除了 .metadata 缓存文件和\或一些临时损坏。

另一个建议

尝试使用Portecle 一个实用程序来管理和检查密钥库、密钥、证书、证书请求、证书吊销列表等。

【讨论】:

  • 好的,我移动了“.metadata”文件夹而不是删除它。还有哪些“临时”文件夹?
  • @JaredBurrows 与其他临时文件夹我指的是您操作系统的标准临时目录,导出期间在此目录中创建的文件通常会在每次导出项目时重新生成...但是如果您得到这个奇怪的问题是另一个尝试做
  • 我已经编辑了我的答案,添加了另一个建议。希望这会有所帮助
  • 好的,所以我终于有时间擦除我的“.eclipse”和“.metadata”文件夹了。我重新安装了 ADT 插件并导入了我需要导出的项目。由于某种原因,我仍然遇到麻烦。
【解决方案4】:

我会建议更多的加热和试验。

耐心应用这些,

步骤:

  1. 在 Eclipse 中取消自动构建(项目-> 自动构建)并清理您的项目。
  2. 再次构建。(右键项目+构建项目)
  3. 导出项目。
  4. 选择 Android 导出。(自动对齐)
  5. 选择您的密钥。提供密码。别名应该出现在列表中。(请确保大写锁定)。有时我们提供正确的密码,但由于大写,它总是失败;)
  6. 让我知道它是否适合您。

希望对您有所帮助。

【讨论】:

  • 好的,我试过了,还是不行。不过谢谢。
【解决方案5】:

您是否将 key.store.password 或 key.alias.password 等值存储在 local.properties 文件中?有哪一个不正确吗?

我很好奇使用 JDK6 创建并在 JDK7 中验证的密钥是否会出现一些错误 - 这可以解释为什么您为测试创建的新密钥有效,而旧密钥却没有。尝试降级到 JDK6 并查看是否可以解决问题 - 其他人在 JDK7 中遇到 jarsigner 问题,当他们降级到 6 时就消失了。如果可行,请提交错误报告并要求提供补丁,以便您可以安全地升级到 Java 7 :)

【讨论】:

  • 很抱歉这么晚才回复您,但我怎么会不小心将这些值存储在 local.properties 中?另外,您的意思是 project.properties 而不是 local.properties?
  • 值将被读取到任何一个中。 local.properties 旨在存储特定于您的机器的值,这些值不会进入源代码控制(如 SDK 的路径、密钥库文件的路径等)。项目属性适用于与机器无关的键/值对,例如最低/目标 API 版本。
  • 我查看并没有在我的本地计算机上找到这些文件。
【解决方案6】:

我最近也在与这个问题作斗争,并尝试了此处和其他地方列出的所有建议。终于在我的最后发现了一个导致此错误的愚蠢错误 - 我想在这里分享它以防它对你们任何人有所帮助。

如果您像我一样,在您的机器上有多个 Java 版本,并且在您最初创建密钥库和现在尝试签署 APK 之间升级了 JRE/JDK,则更有可能出现这种情况。

由于某种原因,我们的编译指令引用了完整的 Java 路径,如下所示:

C:\Progra~1\Java\jdk1.6.0_45\bin\jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore cre80ve.keystore unsigned.apk cre80ve

上面的一个建议让我想到这可能根本不是密码问题,而可能是版本不兼容导致了问题。所以我运行了以下命令:

keytool -list -keystore cre80ve.keystore

使用我知道是正确的密码,你瞧,它确认它是正确的密码。

然后我删除了指向(旧)Java 版本的路径中的显式引用。这使它自动获取最新版本的 Java(在我的例子中为 jdk1.8.0_31):

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore cre80ve.keystore unsigned.apk cre80ve

一切都开始正常了!

底线:这可能根本不是密码问题,而是不同版本的 Java 或 Android SDK 导致了问题,所以记得检查一下。

一旦它开始工作,请记住将您的密钥库和密码备份在安全的地方:-)

【讨论】:

  • 感谢:This is more likely to be the case if you, like me, have multiple Java versions on your machine and had upgraded JRE / JDK between the time you originally created the keystore and now when you're trying to sign the APK. 我想这就是发生在我身上的事情。
【解决方案7】:

我的密钥别名突然停止工作。 (好的,经过 Android Studio 和 Java 的几次更新)。

我尝试了该线程以及其他线程的所有解决方案。就我而言,解决方案令人惊讶。 我有几个别名的密钥库。除了一个密码与密钥库相同的密码外,没有一个在工作。但不幸的是,它不是我需要的。这让我在没有任何逻辑的情况下思考。 我使用

将单个别名复制到新的密钥库
keytool -importkeystore -srckeystore old.keystore -destkeystore new.keystore -srcalias importantalias

然后我将别名密码更改为与密钥库的密码相同:

keytool -keypasswd -keystore new.keystore -alias importantalias

我终于可以签署我的 apk 了。 它看起来像愚蠢的错误,可以浪费一天的开发时间。

【讨论】:

  • 这与此线程上的“正确”答案相同。
  • 我试过了,但我得到了错误,keytool 错误:java.security.UnrecoverableKeyException:无法恢复密钥
【解决方案8】:

刚遇到这个问题 - 突然间,Android Studio 忘记了我的密码,并且不会使用我在 gradle 文件中的密码。我在同一个项目中拥有相同的密钥文件和密码已有 6 年了!

所以我手动输入了它们 - 但它一次又一次地验证失败。我尝试了一些方法,例如使缓存无效、重新启动 Android Studio 和恢复密钥库的备份,但没有任何帮助。

最后,我绝望地尝试切换密钥库密码和密钥密码。瞧——它奏效了!几年前,当我将密码输入 Gradle 构建文件时,我发现我已经切换了密码,出于某种原因,我从未注意到。

结论:永远不要 100% 确定自己做对了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多