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 для хранения закрытого ключа?