java - android调用上的 keystore 版本错误

标签 java android certificate bouncycastle keystore

我想发出一个 https 请求。

我使用 bouncycaSTLe 生成这样的 keystore :

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  

并且 keylist 命令返回一个正确的值。

但是当我这样做时:

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

我有一个错误:

wrong version of keystore

我尝试使用几个版本的 bouncycast,但结果是一样的。我也尝试定义 keysize 1024,但没有任何改变。

有什么想法吗?

最佳答案

您需要将 keystore 的类型从 BKS 更改为 BKS-v1(BKS-v1 是 BKS 的旧版本)。因为 BKS 版本如所说 here 发生了变化

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

  1. 使用 Portecle:
  1. 您可以使用KeyStore Explorer

新文件将使用 BKS-v1 编码,不再显示错误。要更改 KeyStore 类型,请打开 KeyStore Explorer 并转到 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());

关于java - android调用上的 keystore 版本错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11117486/

相关文章:

java - @Size(min, max) 但不是必需的

在 main 之外的方法中调用 Java 对象

android - Android 测试中的模拟 Api 响应

android - OAuth2 请求缺少参数 access_token

http - 我可以获取IP地址的SSL证书吗?

java - 在 Servlet 类中创建方法是一种不好的做法吗?

android - 如何调试 BOOT_COMPLETED 广播接收器 "Force Close"崩溃?

ssl - heroku:在免费计划上设置 SSL 证书?

java - 如何使用 BasicHttpBinding 和 BasicHttpSecurityMode.TransportWithCredential : 将 header 元素 "mustunderstand=0"设置到 SOAP 请求中

java - 随机生成方程的算法