【发布时间】: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) 中提取私钥,因此我深入挖掘并最终使用了该命令的变体。我关注了您发布的链接here 和here:
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?
Android: I lost my android key store, what should I do?
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