Android KeyStore.getInstance("RSA") не работает

Я пытаюсь реализовать соединение SSL на Android, но у меня есть проблема, когда я пытаюсь загрузить свое хранилище ключей, но я, когда я вызываю KeyStore.getInstance("RSA"), я получил это исключение.

03-26 12: 19: 28.660: E / AndroidRuntime (6465): вызвано: java.lang.RuntimeException: java.security.KeyStoreException: java.security.NoSuchAlgorithmException: реализация KeyStore RSA не найдена

 private KeyStore loadKeyStore() {
     if (keyStore != null) {
         Log.i("WSclient::KeyStore", " keyStore!=null");
         return keyStore; 
     }

     try {
         Log.i("WSclient::KeyStore", " keyStore.getInstancel");
         keyStore = KeyStore.getInstance("RSA");
         Log.i("WSclient::KeyStore", " keyStore:: inputStream");
         InputStream in =  context.getResources().openRawResource(R.raw.file);
         try {
             Log.i("WSclient::KeyStore", " keyStore.load");
             keyStore.load(in, KEYSTORE_PASSWORD.toCharArray());
         } finally {
             in.close();
         }

         return keyStore;
     } catch (Exception e) {
         throw new RuntimeException(e);
     }
 }

3 ответа

Решение

Исключение говорит само за себя. Нет такого понятия, как хранилище ключей RSA. Есть хранилища ключей JKS, хранилища ключей PCKS#11, хранилища ключей WindowsMY, все виды вещей. Какой ты, только ты знаешь.

Вы можете создать пару секретный / открытый ключ для алгоритма RSA следующим образом:

Calendar calendarValidityStart = Calendar.getInstance();

Calendar calendarValidityEnd = Calendar.getInstance();
calendarValidityEnd.add(Calendar.YEAR, 99);

KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(context)
        .setAlias("MyKeyAlias")
        .setSubject(new X500Principal("CN=" + "MyKeyAlias"))
        .setSerialNumber(BigInteger.valueOf(1337))
        .setStartDate(calendarValidityStart.getTime())
        .setEndDate(calendarValidityEnd.getTime())
        .build();

KeyPairGenerator kpGenerator = KeyPairGenerator.getInstance(
        "RSA",
        "AndroidKeyStore");

kpGenerator.initialize(spec);

KeyPair keyPair = kpGenerator.generateKeyPair();

Позже вы можете получить пару ключей из хранилища ключей следующим образом:

KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
KeyStore.Entry keyStoreEntry = keyStore.getEntry(alias, null);

Для получения дополнительной информации см. "Образец Android разработчика BasicAndroidKeyStore".

Обязательно иметь

private KeyFactory keyStore; 

keyStore должно быть KeyFactory тип.

 //keyStore = KeyStore.getInstance("RSA");
 keyStore = KeyFactory.getInstance("RSA");

Посмотрите этот пример: Как использовать хранилище ключей в Java для хранения закрытого ключа?

Другие вопросы по тегам