2015-07-29 3 views
0

Пользователь сохранил .p12-файл (например, его сертификат S/MIME) на SD-карте. Я хочу загрузить этот сертификат (или выделенный закрытый и открытый ключ) в AndroidKeyStore.Импорт .p12-файла в AndroidKeyStore

File file = new File(pathToP12File); 
Certificate c = null; // TODO: convert file into something I can load into the keystore 

KeyStore ks = KeyStore.getInstance("AndroidKeyStore"); 
ks.load(null); 
ks.setCertificateEntry("myCertAlias", c); 

Какой самый лучший способ, чтобы преобразовать файл в то, что может быть установлена ​​как запись сертификата в хранилище?

ответ

3

Можно интерпретировать p12-файл как хранилище ключей, извлечь сертификат и загрузить его в AndroidKeyStore.

private void getCertsFromP12(String pathToFile, String passphrase){ 
    try { 
     KeyStore p12 = KeyStore.getInstance("pkcs12"); 
     p12.load(new FileInputStream(pathToFile), passphrase.toCharArray()); 
     Enumeration e = p12.aliases(); 
     while (e.hasMoreElements()) { 
      String alias = (String) e.nextElement(); 
      X509Certificate c = (X509Certificate) p12.getCertificate(alias); 
      addCertificateToKeyStore(c); 
     } 
    } catch (Exception e) {} 
} 

private void addCertificateToKeyStore(X509Certificate c) { 
    try { 
     KeyStore ks = KeyStore.getInstance("AndroidKeyStore"); 
     ks.load(null); 
     ks.setCertificateEntry("myCertAlias", c); 
    } catch (Exception e){} 
} 
1

Если вы хотите установить сертификат в андроида KeyChain вы можете использовать P12, чтобы установить его непосредственно, как в следующем методе:

InputStream is = new ByteArrayInputStream(pkcs12); 
    BufferedInputStream bis = new BufferedInputStream(is); 
    byte[] keychainP12 = new byte[bis.available()]; 
    bis.read(keychainP12); 
    Intent installIntent = KeyChain.createInstallIntent(); 
    installIntent.putExtra(KeyChain.EXTRA_PKCS12, keychainP12); 
    context.startActivity(installIntent);