2014-03-26 95 views
1

即时尝试在Android上实现SSL连接,但我有一个问题,当我尝试加载我的密钥库,但我当我调用KeyStore.getInstance(“RSA”)我有这个例外。Android KeyStore.getInstance(“RSA”)不工作

12月3日至26日:19:28.660:E/AndroidRuntime(6465):了java.lang.RuntimeException:致java.security.KeyStoreException:java.security.NoSuchAlgorithmException:未找到密钥库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); 
    } 
} 

回答

1

例外说明了一切。没有像RSA密钥库那样的东西。有JKS密钥库,PCKS#11密钥库,WindowsMY密钥库,各种东西。你是什​​么样的人,只有你知道。

+0

好吧,我认为我失去了,他发给我的人他keystore显示我的命令行,他用它来产生它,并有它的RSA –

+0

嘿,你是完全正确的,密钥存储在JKS和我刚刚吨将其交给BKS,然后KeyStore.getInstance(“BKS”)工作。 谢谢 –

+0

*键*是RSA。 * keystore *是JKS。 – EJP

0

一定要具有

private KeyFactory keyStore; 

keyStore必须KeyFactory型。

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

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

+0

是的,即时通讯使用它。 –

+0

HeyAarón我编辑了我的答案 – Jorgesys

+0

变量名称实际上只是约定,但调用'KeyFactory''''keyStore''似乎不是一个好主意。从这个问题的其余代码中,假设'keyStore'被认为是'KeyStore'的一个实例似乎是公平的。 – Bruno

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

见的Android开发人员BasicAndroidKeyStore样本获取更多信息。