[英]How to store private key in android keystore?
我想將私鑰存儲在 android KeyStore 中,但是 KeyStore.getInstance("JKS") 的問題是這樣的錯誤:java.security.KeyStoreException: JKS not found。
請幫助我為什么不知道這種情況?
我的代碼如下:
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 Emulator 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.