【问题标题】:java.io.IOException: Invalid Keystore formatjava.io.IOException:无效的密钥库格式
【发布时间】:2010-11-06 08:46:18
【问题描述】:

有谁知道如何解决这个问题? 我尝试了很多方法,但都没有奏效。

当我点击更多细节时,我得到了这个:

at sun.security.provider.JavaKeyStore.engineLoad(Unknown Source)
atsun.security.provider.JavaKeyStore$JKS.engineLoad(Unknown Source)
at java.security.KeyStore.load(Unknown Source)
at com.sun.deploy.security.RootCertStore$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.deploy.security.RootCertStore.loadCertStore(Unknown Source)
at com.sun.deploy.security.RootCertStore.load(Unknown Source)
at com.sun.deploy.security.RootCertStore.load(Unknown Source)
at com.sun.deploy.security.ImmutableCertStore.load(Unknown Source)
at com.sun.deploy.security.TrustDecider.isAllPermissionGranted(Unknown Source)
at com.sun.deploy.security.TrustDecider.isAllPermissionGranted(Unknown Source)
at sun.plugin.security.PluginClassLoader.getPermissions(Unknown Source)
at java.security.SecureClassLoader.getProtectionDomain(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$000(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at sun.applet.AppletClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.applet.AppletClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.applet.AppletClassLoader.loadCode(Unknown Source)
at sun.applet.AppletPanel.createApplet(Unknown Source)
at sun.plugin.AppletViewer.createApplet(Unknown Source)
at sun.applet.AppletPanel.runLoader(Unknown Source)
at sun.applet.AppletPanel.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

【问题讨论】:

  • 你到底想做什么?发布一些示例代码会有所帮助。
  • 请发布您已经尝试过的内容?
  • 看来 Tomi 没有写过任何 KeyStore 相关的代码;这个堆栈只是一个 Applet 入门。看起来类加载器在准备验证小程序签名时遇到了问题。
  • @erickson:是的。现在我也看到了。但如果没有 OP 响应,恐怕我们无法继续进行下去。
  • 您是如何生成 JKS 文件的?结帐此线程:stackoverflow.com/a/59312913/7051466

标签: java encryption applet keystore


【解决方案1】:

我在使用不同版本的 keytool 时遇到了同样的问题:

C:\Program Files\Java\jdk1.8.0_51\bin\keytool

但相同的密钥库文件可以正常工作

“C:\Program Files\Java\jre1.8.0_201\bin\keytool”

我知道这是一个旧线程,但已经浪费了很多时间来解决这个问题......:D

【讨论】:

  • 只是一个小镜头:在版本 51 和 201 之间,Java 中的无限制加密策略已启用,所以也许你应该在你的“旧”Java 中安装来自 Oracle 的无限制加密文件(你会发现很多这里的主题)。
【解决方案2】:

就我而言,我使用 Java 1.8 版运行该项目。以及我从 java 16 生成的 Keystore.jks 文件。 我将我的项目 java 版本更改为 16,错误消失了。

请检查您生成密钥库的JDK版本和您项目的JDK版本是否相同。如果它们不同,请从运行当前项目的同一 JDK 生成密钥库,或者更改项目 JDK。

【讨论】:

    【解决方案3】:

    您可以通过在 android/app/ 目录中运行此命令来生成调试密钥库:

    keytool -genkey -v -keystore debug.keystore -storepass android -alias androiddebugkey -keypass android -keyalg RSA -keysize 2048 -validity 10000
    

    或者直接从官方模板下载https://raw.githubusercontent.com/facebook/react-native/master/template/android/app/debug.keystore

    【讨论】:

      【解决方案4】:

      我在运行 keytool 命令时遇到了这个问题。还有另一种运行keytool命令的方法,这里提到:https://developers.google.com/android/guides/client-authusing gradlew command。

      当我在调试模式下运行时 ./gradlew signingReport --debug 知道 gradle 插件需要 java 11 而我的本地有 java8。下载了 java11 并更新了路径。运行命令(确保打开一个新终端,以便将 java 路径反映到 11)。像魅力一样工作!!!

      【讨论】:

        【解决方案5】:

        对我来说,发生这个问题是因为我在笔记本电脑上使用 1.8.0_251 生成了 .jks 文件,然后我将它复制到了具有 java 1.8.0_45 的服务器上,当我在代码中使用该 .jks 文件时,我得到了 java.io。 IOException: 无效的密钥库格式。

        为了解决这个问题,我直接在服务器上生成了 .jks 文件,而不是从具有不同 Java 版本的笔记本电脑上复制。

        【讨论】:

          【解决方案6】:

          同样的问题,我安装了 Oracle JDK,并使用它创建了我的密钥库,但采用 jceks 格式

          keytool -importkeystore -destkeystore client.keystore \
              -srckeystore redislabs_user.p12 -srcstoretype pkcs12 \
              -deststoretype jceks -alias client-cert
          

          我删除了-deststoretype jceks 选项,它运行良好:)

          【讨论】:

            【解决方案7】:

            也许maven对你的KeyStore进行了编码,你可以设置filtering=false来解决这个问题。

            <build>
                ...
                <resources>
                    <resource>
                        ...
                        <!-- set filtering=false to fix -->
                        <filtering>false</filtering>
                        ...
                    </resource>
                </resources>
            </build>
            

            【讨论】:

            • 我在我的父母 pom.将过滤标记为 false 解决了问题。src/main/resourcestrue
            • 谢谢,这对我有用。更改后我不得不再次进行 Maven 构建
            【解决方案8】:

            去建造 清理项目 然后重建你的项目 它对我有用。

            【讨论】:

              【解决方案9】:

              我在 ubuntu 上遇到了 openJDK 的问题,必须安装 Oracle JDK 才能正常工作。

              您可以关注此guide on google sites 来执行此操作。

              【讨论】:

                【解决方案10】:

                (重新)安装最新的 JDK(例如Oracle's)为我修复了它。

                在安装最新的JDK之前,当我在Terminal.app中执行以下命令时:

                keytool -list -keystore $(/usr/libexec/java_home)/jre/lib/security/cacerts -v
                

                结果:

                keytool error: java.io.IOException: Invalid keystore format
                java.io.IOException: Invalid keystore format
                    at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:650)
                    at sun.security.provider.JavaKeyStore$JKS.engineLoad(JavaKeyStore.java:55)
                    at java.security.KeyStore.load(KeyStore.java:1445)
                    at sun.security.tools.keytool.Main.doCommands(Main.java:792)
                    at sun.security.tools.keytool.Main.run(Main.java:340)
                    at sun.security.tools.keytool.Main.main(Main.java:333)
                

                但是,安装最新的Oracle JDK并重启终端后,执行以下命令:

                keytool -list -keystore $(/usr/libexec/java_home)/jre/lib/security/cacerts -v
                

                结果:

                Enter keystore password:  
                

                表示路径上的keytool可以访问keystore。

                【讨论】:

                • 这对我有用 - 只是安装最新的,Mac 已经“更新”为补丁或其他东西 - 但只有在我启动一个新的终端窗口时,路径才使用新的 java 更新。特别有用的是复制错误并证明问题已解决的命令(尽管由于 $(java_home) 引用,那些在 gradle 命令不起作用的终端中工作,这有点令人困惑)!
                • 这个命令帮助我验证了 jks 文件 (keytool -list -keystore )
                【解决方案11】:

                您可能会在复制/传输过程中损坏文件。

                你在用maven吗? 如果您使用“filter=true”复制密钥库文件,您可能会损坏该文件。

                请检查文件大小。

                【讨论】:

                • 太棒了!我真的帮了我。请您澄清一下为什么过滤参数会破坏密钥库?
                • 感谢 filter=true ...拯救了我的一天
                • 在我的例子中,maven-cargo-plugin 容器配置应该使用&lt;files&gt;&lt;file&gt;...&lt;/file&gt;&lt;/files&gt; 来处理二进制文件,而不是&lt;configfiles&gt;&lt;configfile&gt;,根据the maven:cargo documentation
                【解决方案12】:

                您的密钥库已损坏,您必须恢复或重新生成它。

                【讨论】:

                • 我不敢提 :)
                【解决方案13】:

                我认为您要使用的密钥库文件的格式与您的 Java 版本不同或不受支持。你能发布更多关于你的任务的信息吗?

                一般来说,要解决这个问题,您可能需要重新创建整个密钥库(例如使用其他一些 JDK 版本)。在导出-导入新旧密钥之间的密钥 - 如果您设法在其他地方打开旧密钥。

                如果它只是一个不受支持的版本,请尝试 BouncyCastle 加密提供程序,例如 (虽然我不确定它是否为 Java 添加了对更多密钥库类型的支持?)。

                编辑:我查看了 BC 的功能规范。

                【讨论】:

                  猜你喜欢
                  • 2023-03-20
                  • 1970-01-01
                  • 2014-11-22
                  • 1970-01-01
                  • 2022-12-14
                  • 1970-01-01
                  • 2015-01-02
                  • 2012-04-21
                  • 1970-01-01
                  相关资源
                  最近更新 更多