8

我在使用 SSL 时遇到问题,因为我收到以下与我的密钥库相关的错误(使用 keytool 自创建和自签名:http: //developer.android.com/tools/publishing/app-signing.html) :

08-14 20:55:23.044: W/System.err(5430): java.io.IOException: 密钥库版本错误。08-14 20:55:23.060: W/System.err(5430): 在 org.bouncycastle.jce.provider.JDKKeyStore.engineLoad(JDKKeyStore.java:812) ...

类中抛出的错误JDKKeyStore.java出现在以下代码中:

来自 JDKKeyStore.java 的块引用:
if (version != STORE_VERSION) { if (version != 0) { throw new IOException("Wrong version of key store."); } }

块引用

在这种情况下,STORE_VERSION = 1,我的版本 = 3,基于读取我创建的密钥库所持有的证书的详细信息。我不知道如何生成包含 version=1 证书的密钥库。

我发现这个答案很有帮助: 执行 https 调用时错误的版本密钥库

但是它要求使用以下参数创建密钥库:

-storetype BKS
-provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath
/path/to/bouncycastle.jar

但是,当我尝试使用以下参数创建 keytool(使用 Mac 上的终端应用程序)时:

keytool -genkeypair -v -alias androiddebugkey -keyalg RSA -keysize 2048 -validity 10000 -keypass android -keystore /Users/djames/dropbox/bc146keystore/debug.keystore -storepass android -providerclass org.bouncycastle.jce.provider.BouncyCastleProvider –providerpath /用户/djames/dropbox/bc146keystore/

(其中 /Users/djames/dropbox/bc146keystore/ 是充气城堡 jar 的路径:bcprov-jdk16-146.jar)

我收到以下错误:

keytool 错误:java.lang.RuntimeException:使用错误,?providerpath 不是合法命令 java.lang.RuntimeException:使用错误,?providerpath 不是 sun.security.tools.KeyTool.parseArgs 的合法命令(KeyTool.java: 375) 在 sun.security.tools.KeyTool.run(KeyTool.java:171) 在 sun.security.tools.KeyTool.main(KeyTool.java:166)

我不明白这是在告诉我什么。如果我使用: keytool -help 它告诉我以下是 -genkeypair 选项的有效选项:

-genkeypair [-v] [-protected] [-alias ] [-keyalg ] [-keysize ] [-sigalg ] [-dname ] [-validity ] [-keypass ] [-keystore ] [-storepass ] [-storetype ] [-providername] [-providerclass [-providerarg]] ... [-providerpath]

但是在我正在使用的 Oracle docs java 版本 6 中(http://docs.oracle.com/javase/6/docs/technotes/tools/solaris/keytool.html
它告诉我这些是选项:

-genkeypair {-alias alias} {-keyalg keyalg} {-keysize keysize} {-sigalg sigalg} [-dname dname] [-keypass keypass] {-validity valDays} {-storetype storetype} {-keystore keystore} [-storepass storepass] {-providerClass provider_class_name {-providerArg provider_arg}} {-v} {-protected} {-Jjavaoption}

其中不包括-providerpath option. 为什么不一致?(如果我不使用 -providerpath 选项,那么我会在该选项处得到一个未知的类异常:"-providerclass org.bouncycastle.jce.provider.BouncyCastleProvider"...)

当我谷歌:keytool -providerpath
我没有得到任何帮助来解决这个问题。

我不确定如何在不解决我的 keytool 问题的情况下解决我的密钥库版本问题。任何建议表示赞赏。

吉姆

(Mac OSX 10.6.8 if relevant)
4

4 回答 4

14

我的问题是使用的充气城堡版本太新了。我不得不使用146 - 以后再使用它,它给了我这个错误。

于 2013-04-17T03:07:11.827 回答
5

我能够通过密钥库的版本解决这个问题。请参阅:创建 BKS 密钥库时出现 keytool 错误:providerpath 不是合法命令

于 2012-08-27T02:18:39.857 回答
1

版本不匹配是针对密钥存储版本,而不是证书版本(对于 v3 X.509 证书,它的值应该为 2)。

您使用的是哪个版本的 JDK keytool?您是否指定了命令的完整路径,或者使用了您的PATH? 您确定您使用的是 JKS 密钥存储,而不是 JCEKS 存储吗?

于 2012-08-15T03:53:27.783 回答
0

为了完成 Ryan 的回答,因为我不得不深入了解如何使用 Bouncy Castle 1.46 生成 BKS,您可以使用Portecle生成 BKS。

  1. 下载Boucycastle 提供者 1.46
  2. 安装或解压它。
  3. 替换 Portecle 安装目录中的 bcprov.jar(例如:)C:\Program Files (x86)\Portecle\bcprov.jar。需要相同的命名。
  4. 重新启动 Portecle 并生成您的 BKS 信任库。

这解释了here


编辑

从 Portecle 1.8 开始,您可以使用 BKS-V1 类型来生成您的信任库,而无需替换bcprov.jar.

您可以点击后选择它New keystore或通过菜单更改类型Tools -> Change KeyStore Type

于 2015-12-09T10:38:49.427 回答