安卓调用时密钥库的错误版本

我想发出一个https请求。

我使用弹跳城堡来生成密钥库,如下所示:

keytool -importcert -trustcacerts -alias ludevCA -file lu_dev_cert.crt -keypass mypass -keystore keystore.bks -storepass mypass -storetype BKS -providerclass org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath bcprov-jdk15on-146.jar  

密钥列表命令返回正确的值。

但是当我这样做时:

KeyStore ks = KeyStore.getInstance("BKS");
InputStream in = getResources().openRawResource(R.raw.keystore);  
ks.load(in, "mypass".toCharArray());

我有一个错误:

wrong version of keystore

我试图使用几个版本的弹跳投射,但结果是一样的。我还尝试定义键大小1024,但没有任何变化。

有什么想法吗?


答案 1

您需要将密钥库的类型从 BKS 更改为 BKS-v1(BKS-v1 是 BKS 的旧版本)。因为 BKS 版本已更改,如这里所述

还有另一种解决方案,要容易得多:

  1. 使用 Portecle:
  1. 您可以使用密钥库资源管理器

新文件将使用 BKS-v1 进行编码,并且不会再显示错误。要更改密钥库类型,请打开密钥库资源管理器,然后转到并保存该文件。Tools -> Change KeyStore Type

注意:
Android 适用于不同的 BKS 版本:例如,API 15 需要 BKS-1,而 API 23 则需要 BKS,因此您可能需要将这两个文件都放在应用中。

您可以使用此代码根据 API 级别在它们之间切换:

int bks_version;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
    bks_version = R.raw.publickey; //The BKS file
} else {
    bks_version = R.raw.publickey_v1; //The BKS (v-1) file
}
KeyStore ks = KeyStore.getInstance("BKS");
InputStream in = getResources().openRawResource(bks_version);  
ks.load(in, "mypass".toCharArray());

答案 2

最后,我在Windows下使用了一个图形编辑器(KeyStore Explorer),它正在工作。

也许该错误是由Java / Mac版本问题引起的


推荐