2011-08-09 10 views
9

Mam nadzieję, że istnieje sposób programowego dostępu do centralnego zaufanego magazynu kluczy na urządzeniu z systemem Android. Wiem, że taki istnieje, przynajmniej do weryfikacji połączeń SSL itp., Który jest również wyposażony w przydatne narzędzie do dodawania certyfikatów, przeglądania itp. (Znaleziono w ustawieniach-> lokalizacja & bezpieczeństwo-> zarządzaj zaufanymi certyfikatami)Android Central Keystore

Ja bym jak móc programowo pobierać z niego klucze publiczne w celu szyfrowania plików itp.

Wygląda na to, że inni twórcy aplikacji zarządzają własnym plikiem kluczy w swojej aplikacji, co wydaje się zbędne.

Wszelkie pomysły?

+0

Znajdą się tam certyfikaty serwerów, przydatne do celów, które już zostały opisane. To, czego nie znajdziesz - i nie chcesz dodawać, jak sądzę - to osobiste certyfikaty przydatne do szyfrowania plików, twój określony cel. – Earl

+0

Prawo wydają się być tylko certyfikatami CA. Nadal chciałbym dowiedzieć się, czy można je programowo uzyskać/zmodyfikować, a także czy istnieje inny centralny magazyn kluczy dla certyfikatów e-mail itp. – Nick

+0

Z pewnością można uzyskać dostęp do magazynu zaufanych certyfikatów i załadować go, ale nie ma oficjalnego API dla to. Jest to zwykły magazyn kluczy Bouncy Castle, możesz po prostu użyć klasy KeyStore. –

Odpowiedz

9

To nie jest obsługiwane, może być łamane w przyszłych wersjach itp., Ale oto jak uzyskać listę zaufanych certyfikatów. Nie możesz dodawać nowych bez dostępu root, ponieważ/system jest podłączony tylko do odczytu. Ale jeśli masz uprawnienia administratora, możesz użyć zwykłych interfejsów API KeyStore do dodawania certyfikatów.

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); 
} 

Edycja: powinno działać z konieczności kodować ścieżkę do kluczy:

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

No i oczywiście pękło ... przynajmniej na tablecie Motorola XOOM zaktualizowanym do wersji 4.x; /etc/security/cacerts.bks został zamieniony na katalog/etc/security/cacerts/zawierający certyfikaty jako indywidualne pliki PEM. – Nick

+3

Możesz dodawać certyfikaty w ICS za pośrednictwem interfejsu API. Nawet o tym napisałem :) http://nelenkov.blogspot.com/2011/12/ics-trust-store-implementation.html –

+0

To pokazuje błąd "Nie znaleziono pliku wyjątku" ... co z tym zrobić? –

1

ICS (Android 4,0/API 14) wprowadziła TrustedCertificateStore (które nie są bezpośrednio dostępne w SDK) co pozwala ci to zrobić dokładnie. Dostęp do niego można uzyskać za pomocą interfejsu API JCA Keystore w następujący sposób:

/** 
* 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> 
} 
Powiązane problemy