如何在android keystore中存储私钥?

问题描述 投票:0回答:1

我想将私钥存储在android KeyStore中,但是我对KeyStore.getInstance(“ JKS”)有问题,例如这样的错误:java.security.KeyStoreException:找不到JKS。

请帮帮我,为什么这个实例不知道?

  • 我已将密钥库文件加载到:mykeystore.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.security.KeyStoreException:找不到JKS
java android kotlin keystore
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.