【问题标题】:Using an empty keystore password used to be possible?以前可以使用空的密钥库密码吗?
【发布时间】:2023-06-19 03:38:01
【问题描述】:

在长时间停止 Android 开发后签署 apk 时,我很惊讶我无法再输入 空密钥库密码 来解锁它。是我一个人还是以前有可能?如果是这样,那是什么时候发生的变化,我怎样才能设法解锁密钥库?

一些背景:也许我只是疯了,之前没有为密钥库使用空密码,但是我本来可以使用的唯一可能的密码也不起作用(我发誓,没有我可能会使用另一个密码!)。

【问题讨论】:

  • 这是您创建的密钥库,还是调试密钥库?我假设你的意思是前者,但我只是想检查一下......
  • @CommonsWare:是的,我在几年前使用 ADT 创建了密钥库……大卫:它是“命中-输入-即时-空”:)
  • 也许你把密钥库弄混了? (发生在我身上,过了一段时间我才发现......)
  • @dorjeduck:不,这是我唯一的密钥库。

标签: java android keytool


【解决方案1】:

可以使用 Java sdk 中的 keytool 操作密钥库。

尝试在您的密钥库上执行 keytool,并使用空密码提取证书。之后,将其导入新的密钥库。这次,请使用真实密码。

-exportcert 开关将帮助您实现这一目标。

可能是您更新了 java sdk,因此您无法输入空密码(由于该工具的某些安全升级)。在这种情况下,您可以尝试安装较旧的 sdk 并执行上述操作。

祝你好运!

【讨论】:

  • 感谢@Udinic,但 keytool 本身也不允许空密码! :/ 我想这也是 Java SDK 的更新改变了它,但老实说,我不想经历过去两年的所有 SDK 修订...... :) 任何提示什么版本可能会起作用不胜感激!
  • 你不必每一个都安装,只需要你可能在 2 年前就有的那个,然后继续安装。
  • 好的,尝试使用keytool的“-storepass ”选项来存储一个新的pass。在此之前备份您的密钥库。
  • @Udinic 是否有机会提供将 -exportcert 导入新密钥库的步骤?因此,以下将允许您使用空密码“keytool -list -v -keystore [keystore-filename]”提取信息,如何将这些信息导出到新的密钥库中?任何帮助将不胜感激。
【解决方案2】:

您的密钥库不能使用空密码。

我检查过,只要 jdk 1.3 keytool 不允许,请参阅http://docs.oracle.com/javase/1.3/docs/tooldocs/win32/keytool.html,其中 doc 明确指出:

storepass 必须至少有 6 个字符长。它必须提供给访问密钥库内容的所有命令。对于此类命令,如果命令行中未提供 -storepass 选项,则会提示用户输入。

为了好玩,我想尝试 jdk 1.2 的 keytool 并下载它,因为它的文档没有说明密码是强制性的,但我需要一个 Windows NT 机器来安装它! 我绝对不认为 Android 曾经使用过这个 keytool 版本。

抱歉,您的密码似乎是:忘记了密码,或者使用大写锁定输入密码/激活了错误的键盘布局。 :(

编辑:

如果不是布局问题可以尝试

【讨论】:

  • 可悲的是,从 v 1.3 到 keytool 的链接已失效。
【解决方案3】:

您可以编写一个简单的 Java SE 程序来尝试使用您的密钥或列出别名,而不是使用 keytool。 API应该(不是 100%)允许您使用空 ("") 密码。

您还可以尝试使用portecle 等第三方工具来列出/提取密钥。

【讨论】:

  • 已测试,但 portecle 不会使用空密码打开旧密钥库。
【解决方案4】:

尝试默认的android调试模式密钥库密码android或java cacerts默认changeit/changeme

【讨论】:

    【解决方案5】:

    我也遇到过这个问题,这很奇怪。我有一个不受任何密码保护的旧密钥库。我可以在 SoapUI 中成功使用它,但 keytoolkeystore explorer 无法打开它。我必须创建已经有密码的新密钥库,从那以后一切都很好。

    我怀疑 Java 8 比 Java 7 更挑剔。

    keytool -importkeystore -srckeystore client.jks -destkeystore client2.jsk -srcstoretype JKS -deststoretype JKS -deststorepass changeit
    

    【讨论】:

    • 这仍然要求输入密钥密码并且不接受空白
    【解决方案6】:

    我在尝试使用 hadoop 的密钥存储提供程序时遇到了同样的问题,它使用 none 作为默认密码,请参阅:JavaKeyStoreProvider.java

    我最终从 OpenJDK8 复制了原始的 keytool 并删除了这个新实现中的限制(它是相同的,但没有 6 个字符的限制):KeytoolWithoutPasswordLimits

    通过这种方式,我成功地使用了none 作为密码。

    【讨论】:

    • AdoptopenJDK 的密钥工具,从版本 8(我仍然可以在那里下载的最低版本)adoptopenjdk.net/archive.html - 也无济于事。关于最少 6 个字符的相同错误 Keytoolwithoutpasswordlimits 无法自行编译 - 非常感谢您提供更多信息(或至少说明如何编译基本 .java 文件),但我怀疑它是“下载 openjdk,提取 src.zip , javac ”。 javac -XDignore.symbol.file - 是必需的,对源文件进行一些修改 - 应该值得在答案中添加。
    • @T.S 例如,使用 IntelliJ,您可以在这些 steps 之后创建一个新的 Java 应用程序,并将 helloworld 示例替换为 my code
    • 我们尝试了eclipse,同样的想法。最终,我们找到了 -XDignore.symbol.file,它只允许编译我们需要的 1 个文件,只需稍加调整即可。最后,这是让它工作的更快方法。命令行在这方面很有帮助,但确实需要大量的谷歌搜索。
    【解决方案7】:

    如果以上所有方法都失败了,您可以尝试破解它。相关问题:Android - Forgot keystore password. Can I decrypt keystore file?

    【讨论】:

      【解决方案8】:

      这对我有用:

      keytool -list -keystore keyStoreFileWithotPassword.jks -protected
      

      更正:事实证明 list 功能无需输入实际密码即可工作!但是 import 功能确实需要密码

      【讨论】: