最近我遇到了一个关于密钥库的问题。我知道这个问题已经有很多相关的问答了,我已经阅读了它们并进行了激烈的谷歌搜索。
错误:
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)
Eclipse
Version: 3.8.0
Build id: I20120502-2000
最新的ADT插件
最新的Android SDK
我所知道的:
- 我没有丢失密码,也从未更改过密码。
- 我无法检索密码(我知道这个密码)。
- 如果不发布全新的应用程序,我无法使用其他密钥签署现有应用程序以发布更新(因此我无法发布任何更新)。
我已经做了什么:
- 我多次卸载并重新安装了Eclipse。
- 我多次卸载并重新安装了android ADT插件。
- 我多次删除并重新下载了最新的Android SDK。
- 我多次卸载并重新安装了JDK7。
- 我尝试使用我的密钥库备份。
- 我使用“md5sum KEYSTORE”检查了MD5校验和,并与备份进行了比较(相同的MD5输出-未篡改)。
- 我尝试暴力破解密钥库(我已找回我所知道的密码)。
- 我创建了一个测试密钥(使用当前设置),并测试了密码,看起来一切正常(因此某些内容发生了更改)。
- 我尝试在Eclipse之外通过手动导出android.apk文件,然后尝试签名。
如何导出已签名的应用程序:
- 通过Eclipse:使用文件 > 导出 > 导出Android应用程序。
- JDK7之前:jarsigner -verbose -keystore KEYSTORE FILE ALIAS。
- 使用JDK7:jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore KEYSTORE FILE ALIAS。
还剩下什么需要解决或尝试?
有些参考/URL说要删除“trusted.certs”文件?尝试删除“debug.keystore”?更新Eclipse或任何Android开发工具是否会影响我的密钥库?从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,并使用相同的密码。
更新(6/29/14)
- 我使用keytool -list -keystore KEYSTORE成功证明并展示了我的4个密钥中有3个可用。
- 我破解了最后
如果我输入密码得非常快,有时候它就能工作。
看起来打开Eclipse并第一次输入密码让我可以使用密钥库。
显然,如果所有其他方法都失败了,我将不得不创建一个新的密钥库。我真的很想解决这个问题,只是现在除了用新密钥重新发布之外,我不确定该怎么做。
如果无法恢复密钥,我可能会在Github上开源它。
解决方案(2014年6月29日):
特别感谢用户Erhannis!
以下是我的操作:
每次命令都会引发错误:
keytool -importkeystore -srckeystore old.keystore -destkeystore new.keystore -v
你告诉我可以从Java Keystore(.jks)中提取私钥,所以我深入研究并使用了一种变化的命令。我按照你在这里和这里发布的链接进行了操作:
keytool -importkeystore -srckeystore old.keystore -destkeystore new.keystore -deststoretype pkcs12
将私钥提取并存储为PKCS12格式后,我将提取出的私钥放回到一个全新的Java密钥库中:
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网址列表:
Android:我丢失了我的Android Key Store,我该怎么办?
忘记Keystore密码,正在考虑暴力检测。会损坏密钥库吗?
在Eclipse中运行我的已签名,发布的Keystore时出现问题