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 ,我做了以下工作:

  1. keytool -importkeystore -srckeystore old.keystore -destkeystore new.keystore -v
  2. input新的密钥库密码两次
  3. 当它询问我的源密钥库密码时,请按Enter键 (保留为空)
  4. input密钥密码

仔细检查后发现新工作,我只是复制了旧的。 希望对你有帮助; 祝你好运。

尝试删除工作区中的.metadata文件夹并清除所有临时文件夹。 如果你的keystore文件没有被破坏,并且你已经尝试正确地重新安装Eclipse,ADT,Android SDK和Java SDK,那么除了.metadatacaching文件和/或一些临时损坏之外,我不会看到其他可能的原因。

另一个build议

尝试使用Portecle实用程序来pipe理和检查密钥库,密钥,证书,证书请求,证书撤销列表等。

我会build议一些更多的热量和试验。

有耐心应用这些,

脚步:

  1. 在eclipse中自动取消构build(Project-> Build Automatically)并清理你的项目。
  2. 重新构build它(右键单击项目+生成项目)
  3. 导出项目。
  4. selectAndroid导出(自动alignment)
  5. select你的钥匙。 提供密码。 别名应该出现在列表中(确保大写locking)。 有时我们给出正确的密码,但由于上限,它总是失败;)
  6. 请让我知道这对你有没有用。

希望这会帮助你。

我有同样的问题,我尝试了这个线程中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。 它看起来像可以浪费一天的发展愚蠢的错误。