2017-05-04 52 views
0

我有以下setKey()的Android密钥库返回TrustedCertificateEntry代替PrivateKeyEntry

try { 
      if(keyPair!=null) { 
       privateKeyResult = (RSAKey) keyPair.getPrivate(); 
       certificate = generateCertificate(keyPair, before, after); 
      } 
     } catch (NoSuchAlgorithmException | CertificateEncodingException | InvalidKeyException | NoSuchProviderException | SignatureException e) { 
      logger.error("Error in preparing for insertion to keystore", e); 
      sendLogs(e); 
     } 

     try { 
      if(keyStore!=null) { 
       keyStore.setKeyEntry(alias, (Key) privateKeyResult, null, new Certificate[]{certificate}); 
      } 
} catch (KeyStoreException e) { 
      logger.error("Error in insertion to keystore", e); 
      sendLogs(e); 
     } 

及以下信息getKey():

try { 
       privateKeyEntry = (KeyStore.PrivateKeyEntry) keyStore.getEntry(alias, null); 

      if (privateKeyEntry == null) { 
       if (createKeyIfNotExists) { 
        logger.info("key is null, will attempt to create a new one"); 
        setKey(alias,null); 
        //get the newly create key 
        privateKeyEntry = (KeyStore.PrivateKeyEntry) keyStore.getEntry(alias, null); 
       } 
      } else { 
       //logger.debug("key was found"); 
       privateKey = (RSAKey) privateKeyEntry.getPrivateKey(); 
       return privateKey; 
      } 
     } catch (NoSuchAlgorithmException | UnrecoverableEntryException | KeyStoreException | NullPointerException e) { 
      logger.error("Exception getting key from keystore", e); 
      sendLogs(e); 
     } 

,而它的工作原理上的设备的99.98%,不过,在一些(主要是OnePlus)我有以下例外情况:

java.security.KeyStore$TrustedCertificateEntry cannot be cast to java.security.KeyStore$PrivateKeyEntry 

在线privateKeyEntry = (KeyStore.PrivateKeyEntry) keyStore.getEntry(alias, null);,同时试图获得PrivateKeyEntry。我究竟做错了什么?我怎样才能解决这个问题,以确保应用程序在100%的设备上工作?谢谢。

回答

0

可能在OnePlus中getEntry只返回密钥对条目的Certificate

你可以做这样的事情,以相应方法进行投放:

KeyStore.Entry entry = ks.getEntry("ALIAS", new KeyStore.PasswordProtection("PASSWORD".toCharArray())); 
if (entry instanceof KeyStore.PrivateKeyEntry) 
    System.out.println("Private Key..."); 
else if (entry instanceof KeyStore.TrustedCertificateEntry) 
    System.out.println("Trusted Certificate..."); 
else if (entry instanceof KeyStore.SecretKeyEntry) 
    System.out.println("Secret Key..."); 
+0

是的,这将有助于避免类转换异常,但主要问题仍然是 - 为什么会返回密钥库输入错误类型? –