Центральное хранилище ключей Android

Я надеюсь, что есть способ программно получить доступ к центральному доверенному хранилищу ключей на устройстве Android. Я знаю, что он существует, по крайней мере, для проверки SSL-соединений и т. д., который также поставляется с удобным инструментом для добавления сертификатов, просмотра и т. д. (Находится в настройках-> местоположение и безопасность-> управление доверенными сертификатами)

Я хотел бы иметь возможность программно извлекать из него открытые ключи для шифрования файлов и т. д.

Учитывая доступную документацию, кажется, что другие разработчики приложений управляют собственным хранилищем ключей в своем приложении, что кажется излишним.

Есть идеи?


person Nick    schedule 09.08.2011    source источник
comment
То, что вы найдете, это сертификаты сервера, полезные для целей, которые вы уже изложили. Чего вы не найдете — и, я думаю, не захотите добавлять — так это личных сертификатов, полезных для шифрования файлов, заявленной вами цели.   -  person Earl    schedule 10.08.2011
comment
Правильно, они кажутся только сертификатами CA. Мне все еще было бы интересно узнать, можно ли программно получить к ним доступ/изменить их, а также существует ли другое центральное хранилище ключей для сертификатов электронной почты и т. д.   -  person Nick    schedule 10.08.2011
comment
Вы, конечно, можете получить доступ к хранилищу доверия и загрузить его, но официального API для этого нет. Это обычное хранилище ключей Bouncy Castle, вы можете просто использовать класс KeyStore.   -  person Nikolay Elenkov    schedule 10.08.2011
comment
Кстати, на каком устройстве / версии вы видите меню «управление доверенными сертификатами»? Его нет в официальной сборке Android (по крайней мере, Gingerbread).   -  person Nikolay Elenkov    schedule 10.08.2011
comment
Спасибо Николай! Я подумал, что так и будет, я просто не знал, что это за путь и доступен ли он вообще для внешних приложений. Что касается устройства/версии, я использую Atrix со сборкой AT&T 2.3. Я удивлен, узнав, что это не часть основной сборки. Интересно...   -  person Nick    schedule 12.08.2011


Ответы (2)


Это не поддерживается, может сломаться в будущих версиях и т. д., но вот как получить список доверенных сертификатов. Вы не можете добавлять новые без root-доступа, потому что /system монтируется только для чтения. Но если у вас есть root-доступ, вы можете использовать обычные KeyStore API для добавления сертификатов.

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

РЕДАКТИРОВАТЬ: Это должно работать с необходимостью жестко закодировать путь к хранилищу ключей:

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);
}
person Nikolay Elenkov    schedule 10.08.2011
comment
И, конечно же, он сломался ... по крайней мере, на планшете Motorola XOOM, обновленном до 4.x; /etc/security/cacerts.bks был заменен каталогом /etc/security/cacerts/, содержащим сертификаты в виде отдельных файлов с кодировкой PEM. - person Nick; 08.03.2012
comment
Вы можете добавить сертификаты в ICS через API. Я даже писал об этом :) nelenkov.blogspot.com/2011 /12/ - person Nikolay Elenkov; 08.03.2012
comment
Это показывает ошибку. Файл не найден. Что делать для этого? - person Shani Goriwal; 13.06.2014

ICS (Android 4.0/API 14) представил TrustedCertificateStore (недоступный напрямую в SDK), который позволяет вам делать именно это. Вы можете получить к нему доступ с помощью API JCA Keystore следующим образом:

/**
 * 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 = keyAliases.nextElement();
    X509Certificate cert = (X509Certificate) keyStore.getCertificate(alias);

    //<User cert in whatever way you want>
}
person Chepech    schedule 11.07.2015