首页 文章

Android密钥库停止工作

提问于
浏览
49

就在最近,我遇到了一个关键商店的问题 . 我知道有很多关于这个问题的问题 . 我已经阅读了所有内容,然后用Google搜索 .

错误:

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输出 - 未被篡改)进行了比较 .

  • 我曾尝试过强制密钥存储(我已经检索了我知道的密码) .

  • 我创建了一个测试密钥(使用当前设置)并测试了密码,它似乎工作正常(因此发生了变化) .

  • 我尝试手动导出android .apk然后尝试签名(Eclipse之外) .

以下是导出已签名应用程序的方法:

  • Through Eclipse: 使用文件>导出>导出Android应用程序导出 .

  • Before JDK7: jarsigner -verbose -keystore KEYSTORE FILE ALIAS .

  • With JDK7: jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore KEYSTORE FILE ALIAS .

还有什么可以搞清楚或尝试?

  • 一些引用/ URL说删除“trusted.certs”文件?

  • 尝试删除“debug.keystore”?

  • 更新Eclipse或任何Android开发工具会影响我的密钥库吗?

  • 将Java从jdk6更新到jdk7会产生任何问题吗?

  • 这有可能搞乱或改变了jarsigner的工作方式吗?

用户建议:

  • 尝试使用JDK6,但我最近能够导出一个应用程序 .

  • 在我的local.properties中检查了key.store.password或key.alias.password

  • 在eclipse中自动取消选中构建并清理项目

  • 尝试删除工作区中的.metadata文件夹并清除所有临时文件夹 .

摘要

  • Keystores没有改变,

  • 我有密钥库的密码,

  • 我最近使用以下方法成功导出了一个应用程序:

  • Eclipse 3.8(和Eclipse 4.0),

  • 最新Java 7,

  • 最新的ADT插件 .

  • 我几周前成功导出和构建使用Eclipse 3.8,最新的Android工具和具有相同密码的Java 7 .

更新(2014年6月29日)

  • 我使用了:keytool -list -keystore KEYSTORE来成功证明并显示我的4个键中的3个有效 .

  • 我强制执行最后一个密钥并从密钥库中获取密码(我已经知道的密码),但是当我输入签名时密码不起作用 . 我用过:java -jar AndroidKeystoreBrute_v1.02.jar -m 3 -k KEYSTORE -d WORDLIST .

  • 奇怪的是,有时当我很快将密码输入eclipse时,我的别名会出现,我可以成功导出我的应用程序 . (我知道这很疯狂) .

  • 更新了Java版本 .

如果我很快输入密码,它有时会起作用 .

似乎第一次打开Eclipse并输入密码让我使用密钥库 .

显然,如果所有其他方法都失败了,我将不得不创建一个新的密钥库 . 我真的想解决这个问题,除了用新密钥重新发布之外,我现在还不确定该做什么 .

如果密钥无法正常恢复,我可能会在Github上开源 .


解决方案(2014年6月29日):

特别感谢用户Erhannis!

这是我做的:

每次命令都会出错我:

keytool -importkeystore -srckeystore old.keystore -destkeystore new.keystore -v

既然你告诉我我们可以从Java密钥库(.jks)中提取私钥,我就会深入挖掘并最终使用命令的变体 . 我按照你发布的链接herehere

keytool -importkeystore -srckeystore old.keystore -destkeystore new.keystore -deststoretype pkcs12

在提取私钥并存储为PKCS12之后,我认为提取了我的私钥并将其放回到全新的Java Keystore中:

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网址列表:

How to handle a lost KeyStore password in Android?

Invalid Keystore problem?

Android: I lost my android key store, what should I do?

I lost my .keystore file?

Forgot Keystore password, thinking of Brute-Force detection. will it corrupt the keystore?

I have lost the password for android Keystore file

Problem running my signed, release keystore in Eclipse

Android - Forgot keystore password. Can I decrypt keystore file?

Android release keystore issue: "Keystore was tampered with, or password was incorrect"

8 回答

  • 5

    我可能遇到过同样的问题 . 我从来没有弄清楚为什么它失败了(虽然我想知道是不是因为密钥库密码短于6位),但我能够将我的密钥复制到一个新的密钥库中,然后我重命名为替换旧密钥库,之后神秘地工作(使用新密码) . 顺便说一句,需要密钥密码 . 工作https://security.stackexchange.com/a/3795,我做了以下:

    • keytool -importkeystore -srckeystore old.keystore -destkeystore new.keystore -v

    • 两次输入新的密钥库密码

    • 当它向我询问源密钥库密码时按Enter键(将其留空)

    • 输入密钥密码

    在仔细检查新的工作后,我只是将它复制到旧的 . 希望这对你有用;祝好运 .

  • 2

    尝试删除工作区中的.metadata文件夹并清除所有临时文件夹 . 如果您的密钥库文件不是't damaged and you have tried to reinstall Eclipse, ADT, Android SDK and Java SDK correctly, I don't,请查看此奇怪问题的其他可能原因,不包括.metadata缓存文件和\或某些临时损坏 .

    Another suggestion

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

  • 0

    我有同样的问题,我尝试了这个线程中建议的一切,但没有能够保存我的别名密码 . 关键是我关于密码是 absolutely sure ,因为我已经四次更新了应用程序 . 我收到了"Keystore was tampered with, or password was incorrect"消息 .

    解决方案

    看来在使用eclipse创建密钥库时, a space character was added in front of the password!

    这个令人讨厌的错误显然已在以后的版本中修复,导致我无法使用我认为正确的密码签署我的应用程序 .

    根据这个SO链接:Ant fails to build signed apk after updating to android v20我建议你 try adding a space character before of after your password .

  • 0

    我会建议更多的热量和试验 .

    有耐心应用这些,

    步骤:

    • 在eclipse中自动取消构建(Project-> Build Automatically)并清理项目 .

    • 再次构建 . (右键单击项目Build Project)

    • 出口项目 .

    • 选择Android导出 . (自动对齐)

    • 选择你的钥匙 . 提供密码 . 别名应该在列表中 . (确保大写锁定) . 有时我们会给出正确的密码,但由于上限,它总是会失败;)

    • 让我知道它是否适合您 .

    希望这会对你有所帮助 .

  • 0

    您是否在local.properties文件中存储了key.store.password或key.alias.password等值?这些都不正确吗?

    我很好奇是否存在使用JDK6创建并在JDK7中验证的密钥发生的错误 - 这将解释为什么您为测试工作创建的新密钥,但旧密钥没有 . 尝试降级到JDK6并看看是否修复了它 - 其他人在JDK7中遇到了jarsigner问题,当它们降级到6时就消失了 . 如果可行的话,提交错误报告并要求补丁,这样你就可以安全地升级到Java 7 :)

  • 1

    我最近也和这个问题进行了斗争,并尝试了这里和其他地方列出的所有建议 . 终于发现了一个愚蠢的错误,导致了我的错误 - 我想在这里分享一下,以防它们帮助你们 .

    如果您像我一样在您的计算机上拥有多个Java版本并且在您最初创建密钥库之间以及现在尝试签署APK时升级了JRE / JDK,则更有可能出现这种情况 .

    出于某种原因,我们的编译指令引用了完整的Java路径,如下所示:

    C:\ Progra~1 \ Java \ jdk1.6.0_45 \ bin \ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore cre80ve.keystore unsigned.apk cre80ve

    上面的一个建议让我觉得它可能根本不是密码问题,而且可能是版本不兼容导致问题 . 所以我运行了以下命令:

    keytool -list -keystore cre80ve.keystore

    使用我知道的密码是正确的,并且看,它确认它是正确的密码 .

    然后我删除了(较旧的)Java版本的路径中的显式引用 . 这使它自动获取最新版本的Java(在我的例子中为jdk1.8.0_31):

    jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore cre80ve.keystore unsigned.apk cre80ve

    一切都开始好起来了!

    底线:它可能根本不是密码问题,但是不同版本的Java或Android SDK会导致问题,所以请记得检查出来 .

    一旦它开始工作,记得在安全的地方备份你的密钥库和密码:-)

  • 3

    我的关键别名停止了工作 . (好的,经过Android Studio和Java的少量更新) .

    我尝试了这个线程以及其他人的所有解决方案 . 就我而言,解决方案令人惊讶 . 我有几个别名的密钥库 . 没有人工作,除了一个密码与密钥库相同的密码 . 但不幸的是,这不是我需要的那个 . 这让我思考没有任何逻辑 . 我将单个别名复制到新的密钥库中

    keytool -importkeystore -srckeystore old.keystore -destkeystore new.keystore -srcalias importantalias
    

    然后我将别名密码更改为与密钥库密码相同的密码:

    keytool -keypasswd -keystore new.keystore -alias importantalias
    

    最后我能够签署我的apk . 它看起来像愚蠢的虫子,可以浪费一天的发展 .

  • 0

    刚出现这个问题 - 突然之间Android Studio忘记了我的密码,并且不会使用我在gradle文件中使用的密码 . 我在同一个项目中使用相同的密钥文件和密码已有6年了!

    所以我手动输入了它们 - 但它一次又一次地验证失败 . 我尝试了一些事情,如使缓存无效,重新启动Android Studio并恢复密钥库的备份但没有任何帮助 .

    最后,在绝望中,我试图切换密钥库密码和密钥密码 . 瞧,看哪 - 它奏效了!事实证明,几年前,当我将密码输入Gradle构建文件时,我已经切换了密码,出于某种原因,我从未注意到 .

    Conclusion: never be 100% sure that you're doing it right.

相关问题