سؤال

im trying to implement SSL connection on android, but i have a problem when i try to load my keystore, but i when i call KeyStore.getInstance("RSA") i got this exception.

03-26 12:19:28.660: E/AndroidRuntime(6465): Caused by: java.lang.RuntimeException: java.security.KeyStoreException: java.security.NoSuchAlgorithmException: KeyStore RSA implementation not found

 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);
     }
 }
هل كانت مفيدة؟

المحلول

The exception says it all. There is no such thing as an RSA keystore. There are JKS keystores, PCKS#11 keystores, WindowsMY keystores, all kinds of things. What kind yours is, only you know.

نصائح أخرى

You can create a private/public key pair for the RSA algorithm as follows:

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();

You can later retrieve the key pair from the KeyStore as follows:

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

See the Android Developers BasicAndroidKeyStore Sample for more info.

Be sure to have

private KeyFactory keyStore; 

keyStore must be KeyFactory type.

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

See this example: How to use keystore in Java to store private key?

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top