Android弹性城堡:IOException

8
我正在使用Sun的keytool创建Bouncy castle密钥库并将证书导入其中。 keytool确实会生成符合Bouncy castle格式的密钥库。
然后,我尝试将Bouncy castle密钥库导入Android程序中。我能够获取“BKS”密钥库的实例,但在调用密钥库的load方法时会抛出异常。
"java.io.IOException: Wrong version of key store".

这是代码。
KeyStore keyStore = KeyStore.getInstance("BKS");
InputStream is = new FileInputStream("/mnt/sdcard/ArcGIS/mystore.bks");
keyStore.load(is, "abcdef".toCharArray());

我尝试了从http://www.bouncycastle.org/latest_releases.html下载的不同版本的Bouncy Castle JAR文件。

我做错了什么?

谢谢, Ranjit

3个回答

22

似乎 Android 4.0.3(API 版本15)随附的 BouncyCastle 版本无法打开使用最新 BouncyCastle 库生成的密钥库。当我使用 bcprov-jdk15on-147.jar 创建一个密钥库时,我的示例 Android 应用程序会出现 java.io.IOException: Wrong version of key store 错误。

但是,如果使用 bcprov-jdk16-146.jar 库创建密钥库,则该应用程序可以加载它。我的解决方法是使用这个较旧的库来创建密钥库。

可以推测在旧的 API 版本上也会有这种情况;在创建密钥库时,请尝试使用旧版本的 BouncyCastle。


1
+1 这解决了我的问题,但也引发了一个问题:当设备更新到Bouncycastle 1.47时,运行Android 4.2的设备会发生什么情况?(来源:http://developer.android.com/about/versions/jelly-bean.html) - Martin Christmann
那也是我的问题的解决方案。感谢您提供宝贵的信息。 - koders
当我尝试使用146库创建证书时,它准确地显示同样的“错误的密钥库版本”。如果我使用最新的版本,它可以成功导入。在Android设备上却恰恰相反。问题在于*.csr证书来自客户端要求保持现有状态的服务器。是否有一种选项可以在不重新生成服务器上的csr文件的情况下使用? - Pedro Teran

4

问题已解决。keytool命令缺少“-storetype BKS”参数,因此尽管生成了BKS密钥库文件,但它可能是无效的。


5
我遇到了同样的问题... 不过我使用了参数“-storetype BKS”。你尝试过其他方法来解决问题吗? - snapfractalpop

1

这个问题是由于您的BKS证书密码长度超过7个字符所致。这是美国政策和出口管制的问题(不是技术原因)。

请使用7个字符长度重新导出您的证书,它就可以正常工作了。

希望能对您有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接