Android keystore stopped working
最近我在一家钥匙店遇到了麻烦。我知道关于这个问题已经有很多问题了。我把它们都读了,然后愤怒地在谷歌上搜索。
错误:1 2 3 4 5 6 7 8 9 10 11 | 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 |
我使用的软件:爪哇
1 2 3 | 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) |
号日食
1 2 | 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:使用文件导出>导出>导出Android应用程序。
- jdk7之前:jarsigner-verbose-keystore keystore文件别名。
- 使用jdk7:jarsigner-verbose-sigalg md5withrsa-digetalg sha1-keystore keystore文件别名。
还有什么需要考虑或尝试的?
一些引用/url表示要删除"trusted.certs"文件?罢工>尝试删除"debug.keystore"?罢工>更新eclipse或任何Android开发工具会影响我的密钥库吗?罢工>- < Java>从JDK6到JDK7更新Java会产生什么问题吗?罢工>
这是否会影响或改变jarsigner的工作方式?罢工>
用户建议:
- 尝试使用JDK6,但我最近能够导出应用程序。
checked key.store.password or key.alias.password in my local.properties在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个有效。
- 我暴力地修改了最后一个密钥,并从密钥库(我已经知道的密码)中获得了密码,但当我输入进行签名时,密码不起作用。我已经使用过:Java-JAR和RooIDKEY StReBuffuTyV1.02.JAR-M 3 K-KoSt- D词表。
- 奇怪的是,有时当我很快在Eclipse中输入密码时,我的别名就会出现,我可以成功地导出我的应用程序。(我知道这很疯狂)。
- 更新的Java版本。
如果我很快输入密码,它有时会起作用。
似乎第一次打开Eclipse并输入密码让我可以使用密钥库。
显然,如果所有其他的都失败了,我将不得不创建一个新的密钥存储。我真的很想解决这个问题,除了用一个新的密钥重新发布外,我不知道现在该怎么做。
如果无法正确恢复密钥,我可以在Github上打开它的源代码。
解决方案(6/29/14):特别感谢用户Erhannis!
以下是我所做的:
每次命令都会出错:
1 | keytool -importkeystore -srckeystore old.keystore -destkeystore new.keystore -v |
。
由于您告诉我可以从Java密钥存储库(.jk)中提取私钥,所以我挖掘得更深,最终使用了命令的变体。我跟踪了你在这里和这里发布的链接:
1 | keytool -importkeystore -srckeystore old.keystore -destkeystore new.keystore -deststoretype pkcs12 |
在提取私钥并存储为PKCS12之后,我认为提取了我的私钥并把它放回一个全新的Java密钥存储库中:
1 | keytool -importkeystore -srckeystore new.keystore -srcstoretype pkcs12 -destkeystore final.keystore -deststoretype jks |
。参考文献:
http://developer.android.com/tools/publishing/app signing.html签名
http://code.google.com/p/android-keystore-password-recover/
我已阅读的stackoverflow URL列表:如何处理丢失的密钥库密码
我可能也有同样的问题。我从来没有弄清楚失败的原因(尽管我想知道是不是因为密钥库密码少于6位),但是我能够将我的密钥复制到一个新的密钥库中,然后重新命名以替换旧的密钥库,之后它神秘地工作(使用新密码)。顺便说一下,需要密码。根据https://security.stackexchange.com/a/3795,我执行了以下操作:
经过反复检查,新的工作,我只是复制了旧的一个。希望它对你有用;祝你好运。
尝试删除工作区中的.metadata文件夹并清除所有临时文件夹。如果您的密钥存储文件没有损坏,并且您已经试图正确地重新安装Eclipse、ADT、Android SDK和JAVA SDK,那么除了元数据缓存文件和一些临时损坏之外,我看不到其他可能导致这种奇怪问题的原因。
另一个建议
尝试使用portecle一个实用程序来管理和检查密钥库、密钥、证书、证书请求、证书吊销列表等。
我遇到了同样的问题,我尝试了这个线程中建议的所有方法,但是没有任何方法可以保存我的别名密码。关键是我对密码绝对有把握,因为我已经更新了应用程序四次。我收到"keystore被篡改,或者密码不正确"的消息。
解决方案似乎在使用Eclipse创建密钥库时,在密码前面添加了一个空格字符!
这个讨厌的bug显然是在后来的版本中修复的,这使得我无法用我认为正确的密码来签署我的应用程序。
基于这个so链接:Ant在更新到android v20后无法构建签名的apk,我建议您在密码之前或之后添加一个空格字符。
我建议多加一些热度和试验。
有耐心应用这些,
步骤:希望这对你有帮助。
刚刚出现了这个问题——突然,Android Studio忘记了我的密码,不使用我在Gradle文件中的密码。我在同一个项目中拥有相同的密钥文件和密码已经6年了!
所以我手动输入了它们——但是一次又一次的验证失败了。我尝试了一些方法,比如使缓存失效,重新启动android studio和恢复密钥库的备份,但没有什么帮助。
最后,在完全绝望的情况下,我试图切换密钥库密码和密钥密码。你看-它起作用了!几年前,当我把密码输入Gradle构建文件时,发现我已经转换了密码,出于某种原因,我从来没有注意到。
结论:永远不要100%确信你做得对。
我的化名突然停止了工作。(好的,经过Android Studio和Java的几次更新)。
我尝试了从这个线程以及从其他线程获得的所有解决方案。在我的例子中,解决方案是令人惊讶的。我有没有别名的密钥库。除了一个密码与keystore相同之外,没有任何一个可以工作。但不幸的是,这不是我需要的。这让我思考的时候没有逻辑性。我将单个别名复制到新的密钥库
1 | keytool -importkeystore -srckeystore old.keystore -destkeystore new.keystore -srcalias importantalias |
然后我将别名密码更改为与keystore的密码相同的密码:
1 | keytool -keypasswd -keystore new.keystore -alias importantalias |
号
最后,我签署了我的APK。它看起来像愚蠢的bug,会浪费一天的开发时间。
我最近也和这个问题作了斗争,并尝试了这里和其他地方列出的所有建议。最后,我发现了一个愚蠢的错误,它导致了我的错误-我想在这里分享这个,以防它帮助任何人。
如果您像我一样,在您的机器上有多个Java版本,并且在您最初创建密钥存储库的时候升级了JRe/JDK,现在当您试图签署APK时,这种情况更有可能发生。
由于某种原因,我们的编译指令引用了完整的Java路径,如下所示:
C:Prima~javajdk1.60y445 bin jARNEVER -冗长-SIGALG Sa1WithSA -Digestalg Sa1-密钥存储CCR80V.KiStKunSunnEd.APK CRE80VE
上面的一个建议让我觉得这可能根本不是密码问题,也可能是版本不兼容导致了这个问题。所以我运行了以下命令:
keytool-列表-keystore cre80ve.keystore
使用我知道的密码是正确的,你瞧,它证实了这是正确的密码。
然后,我在(旧的)Java版本的路径中删除了显式引用。这使得它自动地获取最新版本的Java(JDK1.80Y31),在我的例子中:
jarsigner-verbose-sigalg sha1withrsa-digestalg sha1-keystore cre80ve.keystore unsigned.apk cre80ve
一切都开始好起来了!
ButtoLink:它可能根本不是密码问题,但是Java或Android SDK的不同版本引起了这个问题,所以请记住检查一下。
一旦它开始工作,记住在一个安全的地方备份您的密钥库和密码:—)
是否将key.store.password或key.alias.password等值存储在local.properties文件中?有没有错?
我很好奇是否有一些bug发生在用JDK6创建并在JDK7中验证的密钥上-它可以解释为什么您为测试工作创建的新密钥是有效的,但旧的没有。尝试降级到JDK6,看看是否能解决这个问题-其他人在JDK7中有jarsigner问题,当他们降级到6时,问题就消失了。如果这样的话,请提交一个bug报告并要求一个补丁,这样你就可以安全地升级到Java 7: