有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

安卓“密钥存储错误版本”错误。如何创建版本=1的密钥库证书?

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

08-14 20:55:23.044: W/System.err(5430): java.io.IOException: Wrong version of key store. 08-14 20:55:23.060: W/System.err(5430): at org.bouncycastle.jce.provider.JDKKeyStore.engineLoad(JDKKeyStore.java:812) ...

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

Blockquote From JDKKeyStore.java:
if (version != STORE_VERSION) { if (version != 0) { throw new IOException("Wrong version of key store."); } }

Blockquote

在本例中,STORE_VERSION=1,my VERSION=3是基于读取我创建的密钥库所持有的证书的详细信息。我不知道如何生成包含version=1证书的密钥库

我发现这个答案很有帮助: wrong version keystore when doing https call

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

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

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

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

(其中/Users/djames/dropbox/bc146keystore/是bouncy castle jar的路径:bcprov-jdk16-146.jar)

我得到以下错误:

keytool error: java.lang.RuntimeException: Usage error, ?providerpath is not a legal command java.lang.RuntimeException: Usage error, ?providerpath is not a legal command at sun.security.tools.KeyTool.parseArgs(KeyTool.java:375) at sun.security.tools.KeyTool.run(KeyTool.java:171) at 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) 个答案

  1. # 1 楼答案

    我的问题是使用了太新的bouncy castle版本。我不得不在以后使用146,它给了我这个错误

  2. # 2 楼答案

    为了完成Ryan的回答,我必须深入研究如何使用Bouncy Castle 1.46生成BKS,您可以使用Portecle生成BKS

    1. 下载Boucycastle Provider 1.46
    2. 安装或解压
    3. 替换bcprov。Portecle安装目录中的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更改类型

  3. # 3 楼答案

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

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