2017-10-20 17 views
2

Mon code de réseau est écrit en NDK (cURL + OpenSSL) et j'aimerais utiliser un certificat de stockage d'informations d'identification d'Android comme certificat client pour une connexion SSL. De plus, j'aimerais offrir une liste de certificats disponibles à l'utilisateur, afin qu'il puisse choisir le certificat pour la connexion. Malheureusement, je ne peux pas obtenir un certificat du stockage de clé.Comment charger un certificat depuis "Credential storage"?

J'ai installé un certificat client sur "Credential storage" (Paramètres -> Secutrity -> ...) sur mon appareil Android (5.0.2), mais je ne suis pas en mesure d'y accéder à partir de Java. J'ai essayé d'appeler du code ci-dessous, mais le stockage clé est empy, athough le certificat est installé dans le stockage d'informations d'identification:

//KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); 
KeyStore ks = KeyStore.getInstance("AndroidKeyStore"); 
ks.load(null); 

Enumeration<String> aliases = ks.aliases(); 
while(aliases.hasMoreElements()) { 
    String alias = (String)aliases.nextElement(); 
    Log.i("app", "alias name: " + alias); 
    Certificate certificate = ks.getCertificate(alias); 
    Log.i("app", certificate.toString()); 
} 

Qu'est-ce que je fais mal?

Répondre

0

informations d'identification de l'utilisateur installées sur l'appareil sont disponibles via Android KeyChain, pas KeyStore Android

La classe KeyChain donne accès aux clés privées et leurs chaînes de certificats correspondants stockage des informations d'identification.

Utilisez choosePrivateKeyAlias pour demander à l'utilisateur de sélectionner le certificat. Le système lance une activité pour que l'utilisateur sélectionne l'alias et vous envoie via un rappel. Ensuite, utilisez getPrivateKey et getCertificate pour récupérer la clé et la chaîne de certification correspondant

KeyChain.choosePrivateKeyAlias(activity, new KeyChainAliasCallback() { 
      public void alias(String alias) {    
       //do something with the selected alias      
      }    
     }, 
     new String[] { KeyProperties.KEY_ALGORITHM_RSA, "DSA"}, // List of acceptable key types. null for any 
     null,      // issuer, null for any 
     null,      // host name of server requesting the cert, null if unavailable 
     -1,       // port of server requesting the cert, -1 if unavailable 
     "");       // alias to preselect, null if unavailable 

PrivateKey privateKey = KeyChain.getPrivateKey(activity, alias); 
X509Certificate chain[] = KeyChain.getCertificateChain(activity, alias); 
0

Essayez quelque chose comme ceci:

X509TrustManager manager = null; 
FileInputStream fs = null; 

TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); 

try 
{ 
    fs = new FileInputStream(System.getProperty("javax.net.ssl.trustStore")); 
    keyStore.load(fs, null); 
} 
finally 
{ 
    if (fs != null) { fs.close(); } 
} 

trustManagerFactory.init(keyStore); 
TrustManager[] managers = trustManagerFactory.getTrustManagers(); 

for (TrustManager tm : managers) 
{ 
    if (tm instanceof X509TrustManager) 
    { 
     manager = (X509TrustManager) tm; 
     break; 
    } 
}