创建BKS密钥库时出现keytool错误:providerpath不是合法命令

时间:2012-08-18 03:09:58

标签: bouncycastle keystore keytool

我正在尝试使用keytool创建一个“bks”密钥库(在Mac OS X上使用终端应用)。我遵循以下说明:
keytool error: java.security.KeyStoreException: BKS not found

这是我的用法:

keytool -genkeypair -v -alias androiddebugkey -keyalg RSA -keysize 2048 -validity 10000 -keypass android -keystore /Users/djames/dropbox/bc146keystore/debug.keystore -storepass android -storetype BKS -providerclass org.bouncycastle.jce.provider.BouncyCastleProvider –providerpath /Users/djames/dropbox/bc146keystore/bcprov-jdk16-146.jar -dname "CN=Android Debug, OU=Android, O=Android, L=Whitefish, S=MT, C=US"

我收到以下错误:

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)

我看过无数网帖(包括上面的帖子)推荐的-provider path选项,当我运行keytool -help时,它确认语法合法:

keytool usage:  ...   
-genkeypair  [-v] [-protected]
         [-alias <alias>]
         [-keyalg <keyalg>] [-keysize <keysize>]
         [-sigalg <sigalg>] [-dname <dname>]
         [-validity <valDays>] [-keypass <keypass>]
         [-keystore <keystore>] [-storepass <storepass>]
         [-storetype <storetype>] [-providername <name>]
         [-providerclass <provider_class_name> [-providerarg <arg>]] ...
         [-providerpath <pathlist>]

我还尝试了以下替代方案(每http://docs.oracle.com/javase/6/docs/technotes/guides/security/crypto/CryptoSpec.html):

  1. 删除-providerpath命令的keytool选项,
  2. bcprov-jdk16-146.jar放在{$JAVA_HOME/lib/ext}文件夹
  3. security.provider.3=org.bouncycastle.jce.provider.BouncyCastleProvider添加到java.security文件中。
  4. 但它仍然失败。

    关于我可以采取哪些不同方法来创建BKS密钥库的任何想法?

4 个答案:

答案 0 :(得分:4)

多年以来,我也在尝试这个。

答案是您的参数顺序错误。 -providerpath需要之前 -providerclass参数。

我希望这有助于将来寻找解决方案。

答案 1 :(得分:2)

我无法使用Keytool取得成功。这就是我为解决问题所做的工作:我在Eclipse中首次运行android程序时自动创建了Eclipse(Indigo,SR2)创建的默认debug.keytool(一个JKS类型密钥库),使用Portecle(http://portecle.sourceforge.net/)将其转换为BKS类型的密钥库。现在这是一个棘手的部分:如果我现在使用BKS版本的debug.keytool代替原始版本,我在Eclipse中遇到“Android包装错误”“java.io.IOException:无效的密钥库格式”每当我尝试运行android程序。但是,如果我将原始JKS版本的debug.keytool保留在Eclipse创建它的默认目录中,那么我可以在Android程序的/ resources / raw子文件夹中使用debug.keytool的BKS版本并让Android打开它并识别它。吉姆

答案 2 :(得分:0)

一个简单的替代方法是使用Portecle生成BKS:

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

答案 3 :(得分:0)

我正在尝试使用证书进行SSL连接,因此要在Android中支持,我需要将jks / bks文件用作信任存储。

  

因此生成的jks文件在android SSLSocket连接中尝试过,但是   引发jks无法读取的异常。所以我必须添加   Boncycastle提供程序到JVM并使用jks文件创建bks

下载Bouncycastle提供程序jar文件并将其放在以下路径下:

C:\Program Files\Java\jre1.8.0_191\lib\ext

通过添加以下文件的提供程序来更新java.security文件

C:\Program Files\Java\jre1.8.0_191\lib\security\java.security

添加提供商

security.provider.12=org.bouncycastle.jce.provider.BouncyCastleProvider

关闭命令提示符并打开执行命令以获取bks文件,如下所示:

keytool -importkeystore -srckeystore <input>.jks -destkeystore <required_bks_file_name>.bks -srcstoretype JKS -deststoretype BKS -srcstorepass <jsk file password> -deststorepass <jsk file password> -provider org.bouncycastle.jce.provider.BouncyCastleProvider

现在您可以将bks文件保存在文件夹中了。

谢谢