关于java:Android密钥库停止工作

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,我执行了以下操作:

  • keytool -importkeystore -srckeystore old.keystore -destkeystore new.keystore -v
  • 输入新的密钥库密码两次
  • enter向我询问源密钥存储密码时,请点击它(保留空白)。
  • 输入密钥密码
  • 经过反复检查,新的工作,我只是复制了旧的一个。希望它对你有用;祝你好运。


    尝试删除工作区中的.metadata文件夹并清除所有临时文件夹。如果您的密钥存储文件没有损坏,并且您已经试图正确地重新安装Eclipse、ADT、Android SDK和JAVA SDK,那么除了元数据缓存文件和一些临时损坏之外,我看不到其他可能导致这种奇怪问题的原因。

    另一个建议

    尝试使用portecle一个实用程序来管理和检查密钥库、密钥、证书、证书请求、证书吊销列表等。


    我遇到了同样的问题,我尝试了这个线程中建议的所有方法,但是没有任何方法可以保存我的别名密码。关键是我对密码绝对有把握,因为我已经更新了应用程序四次。我收到"keystore被篡改,或者密码不正确"的消息。

    解决方案

    似乎在使用Eclipse创建密钥库时,在密码前面添加了一个空格字符!

    这个讨厌的bug显然是在后来的版本中修复的,这使得我无法用我认为正确的密码来签署我的应用程序。

    基于这个so链接:Ant在更新到android v20后无法构建签名的apk,我建议您在密码之前或之后添加一个空格字符。


    我建议多加一些热度和试验。

    有耐心应用这些,

    步骤:

  • 在Eclipse中自动取消勾选构建(project->build automatically),并清理您的项目。
  • 再次构建。(右键单击项目+构建项目)
  • 导出项目。
  • 选择Android导出(自动对齐)
  • 选择你的钥匙。提供密码。别名应该出现在列表中。(请确定大写锁定)。有时我们会给出正确的密码,但由于大写,它总是失败;)
  • 让我知道它是否适合你。
  • 希望这对你有帮助。


    刚刚出现了这个问题——突然,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: