Android从JKS文件提取公私钥时遇密钥库版本错误问题
问题
我在/src/main/res/raw目录下放了一个ecc.jks文件,这个文件基于EC算法生成,密钥长度为256位。我想从中提取公钥和私钥生成新的KeyPair,但运行下面的代码时一直报java.io.IOException: Wrong version of key store错误。
出错代码
public KeyPair easyLoadJKS(String alias, String pass) { try { String keyStoreType = KeyStore.getDefaultType(); KeyStore keystore = KeyStore.getInstance(keyStoreType); InputStream in = _context.getResources().openRawResource(R.raw.ecc); keystore.load(in, pass.toCharArray()); Key key = keystore.getKey(alias, pass.toCharArray()); if (!(key instanceof PrivateKey)) return null; Certificate cert = keystore.getCertificate(alias); PublicKey publicKey = cert.getPublicKey(); return new KeyPair(publicKey, (PrivateKey) key); } catch (Throwable e) { System.out.println(e.getMessage()); return null; } }
Keystore Explorer查看的文件详情
- 算法页:密钥库类型为JKS,密钥算法为EC(基于secp256r1曲线),密钥长度256位
- 证书详情页:证书版本为v3,签名算法为SHA256withECDSA,主体与颁发者信息一致,包含有效期等内容
- 私钥详情页:私钥算法为EC,长度256位,关联证书的签名算法为SHA256withECDSA
- 公钥详情页:公钥算法为EC,长度256位,使用secp256r1曲线参数
解决办法
显式指定密钥库类型为JKS
部分Android环境的默认密钥库类型并非JKS(比如可能是BKS),不要依赖KeyStore.getDefaultType(),直接指定类型:KeyStore keystore = KeyStore.getInstance("JKS");修复JKS版本兼容性问题
这个错误大多是因为JKS文件由高版本JDK(JDK9及以上)生成,而当前Android或运行环境仅支持旧版JKS格式。可以用Keystore Explorer重新导出兼容版本:
打开Keystore Explorer加载ecc.jks→ 顶部菜单选「工具」→「更改密钥库类型」→ 选择JKS → 保存新文件替换原文件。核对密码与别名
确认传入的密码和别名与Keystore Explorer中显示的完全一致,虽然密码错误的报错信息不同,但先排除这个基础问题。转换为Android原生支持的BKS格式
若上述方法无效,可将JKS转成BKS格式尝试:
用Keystore Explorer将JKS转换为BKS,然后修改代码中的密钥库类型:KeyStore keystore = KeyStore.getInstance("BKS");注意旧版Android可能需要添加BouncyCastle依赖到项目中。
内容的提问来源于stack exchange,提问作者Hajitsu
相关产品推荐
相关产品推荐

