Android密钥库停止工作
就在最近我有一个关键商店的问题。 我知道这个问题已经有很多问题了。 我已经阅读了所有内容,并疯狂search。
错误:
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输出 – 未被篡改)进行比较。
- 我试图蛮力的关键存储(我已经找回了我知道的密码)。
- 我创build了一个testing密钥(使用当前设置),并testing了密码,它似乎工作正常(所以有所改变)。
- 我已经尝试手动导出android.apk,然后尝试签名(在Eclipse之外)。
以下是我如何导出已签名的应用程序:
- 通过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开发工具会影响我的密钥库吗? -
将Java从jdk6更新为jdk7会产生什么问题? -
这可能是混乱或改变jarsigner如何工作呢?
用户build议:
- 尝试使用JDK6,但我最近能够导出应用程序。
-
检查我的local.properties中的key.store.password或key.alias.password -
在Eclipse中自动取消选中构build并清理项目 -
尝试删除工作区中的.metadata文件夹并清除所有临时文件夹。
概要
- 密钥库没有改变,
- 我有密钥存储的密码,
- 我最近成功导出了一个应用程序,使用:
- Eclipse 3.8(和Eclipse 4.0+),
- 最新的Java 7,
- 最新的ADT插件。
- 我上一次成功的导出和构build是几个星期前使用Eclipse 3.8,最新的Android工具和Java 7使用相同的密码。
更新(6/29/14)
- 我已经使用: keytool -list -keystore KEYSTORE成功地certificate和显示我的4个键中的3个工作。
- 我bruteforced最后一个密钥,并从密钥库(通过我已经知道)获得密码,但密码不起作用,当我进入签名。 我用过: java -jar AndroidKeystoreBrute_v1.02.jar -m 3 -k KEYSTORE -d WORDLIST 。
- 奇怪的是,有时当我很快input我的密码到eclipse中时,我的别名就会出现,我可以成功导出我的应用程序。 (我知道这很疯狂)。
- 更新了Java版本。
如果我input的密码很快就会有效。
看来,开放Eclipse和第一次input密码让我使用密钥存储。
显然,如果一切都失败了,我将不得不创build一个新的密钥存储。 我真的想得到这个解决,我只是不知道现在要做什么,除了用一个新的密钥重新发布。
如果密钥无法正确恢复,我可能会在Github上开源。
解决scheme(6/29/14):
特别感谢用户Erhannis!
这是我做的:
每次命令都会在我身上出错:
keytool -importkeystore -srckeystore old.keystore -destkeystore new.keystore -v
既然你告诉我,我们可以从Java密钥库(.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/
我读过的StackOverflowurl列表:
如何在Android中处理丢失的KeyStore密码?
无效的密钥库问题?
Android:我失去了我的android密钥存储,我该怎么办?
我丢失了.keystore文件?
忘记密钥库密码,思考蛮力检测。 它会破坏密钥库吗?
我已经失去了Android密钥库文件的密码
在Eclipse中运行签名的发行密钥库时出现问题
Android – 忘了密钥库密码。 我可以解密密钥库文件吗?
Android版本密钥库问题:“密钥库被篡改,或者密码不正确”
我可能有同样的问题。 我从来没有弄清楚为什么它是失败的(虽然我不知道是否因为密钥存储密码短于6位数字),但我能够将我的密钥复制到一个新的密钥库,然后我重新命名为replace旧的密钥库,之后神秘地工作(使用新的密码)。 需要密钥,顺便说一下。 closureshttps://security.stackexchange.com/a/3795 ,我做了以下工作:
-
keytool -importkeystore -srckeystore old.keystore -destkeystore new.keystore -v
- input新的密钥库密码两次
- 当它询问我的源密钥库密码时,请按Enter键 (保留为空)
- input密钥密码
仔细检查后发现新工作,我只是复制了旧的。 希望对你有帮助; 祝你好运。
尝试删除工作区中的.metadata文件夹并清除所有临时文件夹。 如果你的keystore文件没有被破坏,并且你已经尝试正确地重新安装Eclipse,ADT,Android SDK和Java SDK,那么除了.metadatacaching文件和/或一些临时损坏之外,我不会看到其他可能的原因。
另一个build议
尝试使用Portecle实用程序来pipe理和检查密钥库,密钥,证书,证书请求,证书撤销列表等。
我会build议一些更多的热量和试验。
有耐心应用这些,
脚步:
- 在eclipse中自动取消构build(Project-> Build Automatically)并清理你的项目。
- 重新构build它(右键单击项目+生成项目)
- 导出项目。
- selectAndroid导出(自动alignment)
- select你的钥匙。 提供密码。 别名应该出现在列表中(确保大写locking)。 有时我们给出正确的密码,但由于上限,它总是失败;)
- 请让我知道这对你有没有用。
希望这会帮助你。
我有同样的问题,我尝试了这个线程中build议的一切,但没有能够保存我的别名密码。 关键是我对密码是绝对肯定的,因为我已经四次更新了应用程序。 我得到了“密钥库被篡改,或密码不正确”的消息。
解决scheme
看来在使用eclipse创build密钥库时,在密码前添加了一个空格字符!
这个令人讨厌的bug显然是固定在一个更高的版本,使我无法用我认为是正确的密码签署我的应用程序。
基于这个SO链接: 更新到android v20后,Ant无法构build签名apk我build议您尝试在密码之前添加一个空格字符 。
你是否在你的local.properties文件中存储key.store.password或key.alias.password等值? 这两个是不正确的?
我很好奇,如果使用JDK6创build并在JDK7中validation的密钥存在一些错误 – 这将解释为什么为testing工作创build的新密钥,但旧密钥不会。 尝试降级到JDK6,看看是否解决了这个问题 – 其他人在JDK7中有jarsigner的问题,当他们降级到6级时就消失了。如果可行的话,提交一个bug报告并要求补丁,以便安全升级到Java 7 🙂
我最近还和这个问题作了斗争,并尝试了这里和别处列出的所有build议。 最后确定了一个愚蠢的错误,导致这个错误在我的最后 – 我想分享这里,以防万一它可以帮助你们。
如果您像我一样,在您的计算机上有多个Java版本,并且在您最初创build密钥库的时间到现在您尝试签署APK之间升级了JRE / JDK,则情况更可能如此。
出于某种原因,我们的编译指令是像这样引用完整的Javapath:
C:\ Progra〜1 \ Java \ jdk1.6.0_45 \ bin \ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore cre80ve.keystore unsigned.apk cre80ve
上面的build议之一让我想到,它可能不是一个密码问题,可能是版本不兼容导致的问题。 所以我跑了下面的命令:
keytool -list -keystore cre80ve.keystore
使用我所知道的密码是正确的,而且看,它证实这是正确的密码。
然后,我删除了(旧的)Java版本的path中的显式引用。 这使得它自动拿起最新版本的Java(在我的情况下是jdk1.8.0_31):
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore cre80ve.keystore unsigned.apk cre80ve
一切开始正常工作!
底线:根本不可能是一个密码问题,但是不同版本的Java或者Android SDK导致这个问题,所以记得检查一下。
一旦它开始工作,记得要在一个安全的地方备份你的密钥库和密码:-)
我的关键别名停滞工作。 (好吧,Android Studio和Java的几个更新之后)。
我尝试了这个线程以及其他人的所有解决scheme。 在我的情况下,解决scheme是令人惊讶的。 我有一个别名很less的keystore。 没有任何工作,除了一个密码存储相同的密码。 但不幸的是,这不是我所需要的。 这让我思考没有涉及的逻辑。 我用单个别名复制到新的密钥库
keytool -importkeystore -srckeystore old.keystore -destkeystore new.keystore -srcalias importantalias
然后我将别名密码更改为与密钥存储库的密码相同:
keytool -keypasswd -keystore new.keystore -alias importantalias
最后我能够签署我的apk。 它看起来像可以浪费一天的发展愚蠢的错误。