"密钥库的错误版本"错误。如何创建version = 1密钥库证书?

时间:2012-08-15 03:46:04

标签: android ssl keytool android-keystore

我在使用SSL时遇到问题,因为我收到了与我的密钥库相关的以下错误(使用keytool per 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):at   org.bouncycastle.jce.provider.JDKKeyStore.engineLoad(JDKKeyStore.java:812)   ...

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

  

块引用   来自JDKKeyStore.java:
  if(版本!= STORE_VERSION)           {               if(版本!= 0)               {                   抛出新的IOException(“密钥库的错误版本。”);               }           }

     

块引用

在这种情况下,STORE_VERSION = 1,我的版本= 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 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 / Users / djames / dropbox / bc146keystore /

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

我收到以下错误:

  

keytool error:java.lang.RuntimeException:用法错误,?providerpath   不是合法命令java.lang.RuntimeException:用法错误,   ?providerpath不是合法的命令   sun.security.tools.KeyTool.parseArgs(KeyTool.java:375)at 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" ...)

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

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

吉姆

(Mac OSX 10.6.8 if relevant)

4 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:3)

我能够通过密钥库的版本解决这个问题。见:keytool error when creating BKS keystore: providerpath is not a legal command

答案 2 :(得分:1)

版本不匹配是针对密钥库版本,而不是证书版本(对于v3 X.509证书,其值应为2)。

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

答案 3 :(得分:0)

为了完成Ryan的答案,因为我必须深入了解如何使用Bouncy Castle 1.46生成BKS,您可以使用Portecle来生成BKS。

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

    修改

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

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