我想发出一个 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 发生了变化
还有另一种解决方案,这要容易得多:
- 使用 Portecle:
- 下载 Portecle http://portecle.sourceforge.net/
- 使用密码和 portecle 打开您的 bks 文件
- 执行工具>>更改 keystore 类型>>BKS-v1
- 保存文件
- 您可以使用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/