我想将私钥存储在android KeyStore中,但是我对KeyStore.getInstance(“ JKS”)有问题,例如这样的错误:java.security.KeyStoreException:找不到JKS。
请帮帮我,为什么这个实例不知道?
我的代码如下:
try {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(2048);
KeyPair keyPair = keyPairGenerator.genKeyPair();
X509Certificate certificate = generateCertificate(keyPair);
KeyStore ks = KeyStore.getInstance("JKS");
char[] password = "xxxxxx".toCharArray();
try (FileInputStream fis = new FileInputStream("path\\mykeystore.jks")) {
ks.load(fis, password);
}
Certificate[] certChain = new Certificate[1];
certChain[0] = certificate;
ks.setKeyEntry("key1", keyPair.getPrivate(), password, certChain);
} catch(Exception e) {
e.printStackTrace();
}
Java KeyStore(JKS)在Android上[[不可用。
Android上推荐的密钥库为AndroidKeyStore
。对于您的情况,使用AndroidKeyStore
而不是JKS
获取密钥库实例,并将密码设置为null
,因为AndroidKeyStore
不接受任何密码://...
KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
//...
ks.setKeyEntry("key1", keyPair.getPrivate(), null, certChain);
在AndroidKeyStore
中,您无法设置密钥或密钥库的密码,因为密钥库文件由Android系统本身管理。另外,在AndroidKeyStore
内部生成密钥而不是导入(例如调用setKeyEntry
)是更安全和建议的方式。(在受支持的设备中,Android在单独的安全硬件中生成密钥。这意味着,没有人,包括应用程序本身无法从该设备导出密钥)
因此,请使用KeyGenParameterSpec.Builder
而不是KeyPairGenerator
生成密钥。您可以在这里查看文档:https://developer.android.com/training/articles/keystore
但是,如果您认为
AndroidKeyStore
仍然不适合您,则可以通过以下方式列出Android中可用的密钥库类型:
// Iterate in security providers for(Provider provider: Security.getProviders()) { for(Object item: provider.keySet()) { if(item.toString().startsWith("KeyStore.")) { // grep KeyStores Log.d(TAG, "Keystore: " + item.toString() + " available in provider: " + provider.getName()); } } }
在Android模拟器Pixel 2 API 28
中,此代码输出:
Keystore: KeyStore.BouncyCastle available in provider: BC Keystore: KeyStore.PKCS12 available in provider: BC Keystore: KeyStore.BKS available in provider: BC Keystore: KeyStore.AndroidCAStore available in provider: HarmonyJSSE Keystore: KeyStore.AndroidKeyStore available in provider: AndroidKeyStore
这意味着,可用的KeyStore是:
BouncyCastle PKCS12 BKS AndroidCAStore AndroidKeyStore