2011-08-09 18 views
9

Espero que haya una forma de acceder mediante programación a un almacén de claves de confianza central en un dispositivo Android. Sé que existe uno, al menos para verificar las conexiones SSL, etc. que también viene con una práctica herramienta para agregar certificados, navegación, etc. (Encontrado en configuración-> ubicación & seguridad-> administrar certificados confiables)Android Central Keystore

I'd le gusta poder recuperar las claves públicas mediante programación con el fin de cifrar archivos, etc.

Dada la documentación disponible, parece que otros desarrolladores de aplicaciones están administrando su propio almacén de claves dentro de su aplicación, lo que parece redundante.

¿Alguna idea?

+0

Lo que encontraría serían certificados de servidor, útiles para los fines que ya ha descrito. Lo que no encontraría, y no quisiera agregar, creo, son los certificados personales útiles para el cifrado de archivos, su propósito declarado. – Earl

+0

Derecha, parecen ser solo certificados de CA. Todavía estaría interesado en saber si se puede acceder o modificar programáticamente, y también si existe otro almacén de claves central para certificados de correo electrónico, etc. – Nick

+0

Puede acceder a la tienda de confianza y cargarla, pero no hay una API oficial para esta. Es un almacén de claves de Bouncy Castle regular, simplemente puede usar la clase KeyStore. –

Respuesta

9

Esto no es compatible, puede romperse en versiones futuras, etc., pero aquí le mostramos cómo obtener una lista de los certificados de confianza. No puede agregar nuevos sin acceso de root, porque/system está montado de solo lectura. Pero si tiene acceso de administrador, puede usar la API normal KeyStore para agregar certificados.

KeyStore ks = KeyStore.getInstance("BKS"); 
InputStream is = new FileInputStream("/etc/security/cacerts.bks"); 
ks.load(is, "changeit".toCharArray()); 

List<X509Certificate> certs = new ArrayList<X509Certificate>(); 
Enumeration<String> aliases = ks.aliases(); 
while (aliases.hasMoreElements()) { 
    String alias = aliases.nextElement(); 
    X509Certificate cert = (X509Certificate) ks.getCertificate(alias); 
    certs.add(cert); 
} 

EDIT: Esto debería funcionar con la necesidad de codificar la ruta de acceso al almacén de claves:

TrustManagerFactory tmf = TrustManagerFactory 
        .getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
tmf.init((KeyStore) null); 
X509TrustManager xtm = (X509TrustManager) tmf.getTrustManagers()[0]; 
for (X509Certificate cert : xtm.getAcceptedIssuers()) { 
    String certStr = "S:" + cert.getSubjectDN().getName() + "\nI:" 
         + cert.getIssuerDN().getName(); 
    Log.d(TAG, certStr); 
} 
+0

Y, por supuesto, se rompió ... al menos en una tableta Motorola XOOM actualizada a 4.x; /etc/security/cacerts.bks se reemplazó con el directorio/etc/security/cacerts/que contiene los certs como archivos individuales codificados con PEM. – Nick

+3

Puede agregar certificados en ICS a través de la API. Incluso escribí al respecto :) http://nelenkov.blogspot.com/2011/12/ics-trust-store-implementation.html –

+0

Esto muestra un error "Archivo no encontrado excepción" ... ¿qué hacer para eso? –

1

ICS (Android 4.0/API 14) introdujo el TrustedCertificateStore (no directamente disponible en el SDK) eso te permite hacer exactamente eso. Puede acceder a él utilizando la API de JCA Keystore de esta manera:

/** 
* Android Central Keystore repo usually located on /data/misc/keychain 
* including the system trusted anchors located on /system/etc/security 
*/ 
KeyStore keyStore = KetStore.getInstance("AndroidCAStore"); 
keyStore.load(null, null); //Load default system keystore 
Enumeration<String> keyAliases = keyStore.aliases(); 

while(keyAliases.hasMoreElements()){ 
    String alias = aliases.nextElement(); 
    X509Certificate cert = (X509Certificate) keyStore.getCertificate(alias); 

    //<User cert in whatever way you want> 
} 
Cuestiones relacionadas