1

我试图在 android 上实现 SSL 连接,但是当我尝试加载我的密钥库时遇到问题,但是当我调用 KeyStore.getInstance("RSA") 时出现此异常。

03-26 12:19:28.660: E/AndroidRuntime(6465): 由: 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);
     }
 }
4

3 回答 3

1

例外说明了一切。没有 RSA 密钥库之类的东西。有 JKS 密钥库、PCKS#11 密钥库、WindowsMY 密钥库等等。你是什​​么品种,只有你自己知道。

于 2014-03-26T22:56:46.163 回答
0

您可以为 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 = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
KeyStore.Entry keyStoreEntry = keyStore.getEntry(alias, null);

有关详细信息,请参阅 Android 开发人员BasicAndroidKeyStore示例。

于 2016-01-29T10:32:58.067 回答
-1

一定要有

private KeyFactory keyStore; 

keyStore必须是KeyFactory类型。

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

看这个例子: How to use keystore in Java to store private key?

于 2014-03-26T19:37:30.123 回答