Использование Android TrustStore для aSmack в Android 4+ (ICS)

Я не эксперт по хранилищам ключей, и мне трудно понять нюансы этого, но вот как далеко я продвинулся:

При создании xmpp-соединения с помощью сборки asmack, найденной здесь, все равно нужно изменить хранилище доверенных сертификатов, которое обычно , например, несколько источников в Интернете, делается с помощью этих команд

ConnectionConfiguration config = new ConnectionConfiguration(host, Integer.parseInt(port), service);
config.setTruststorePath("/system/etc/security/cacerts.bks");
config.setTruststorePassword("changeit");
config.setTruststoreType("bks");
XMPPConnection connection = new XMPPConnection(connConfig);
connection.connect();

Это работает для более старых версий Android, но в ICS они изменили некоторые вещи, и теперь это не так. Теперь путь другой.

По-видимому, это можно исправить, но я понятия не имею, как это сделать.

Нужен, очевидно, метод, возвращающий путь в зависимости от версии SDK, который возвращает нужную строку для установки sdk-пути, так как нельзя просто вернуть само хранилище ключей в xmpp-соединение.

Со ссылкой на это этот метод будет выглядеть так:

private String getTrustStorePath() 
{
 String path = System.getProperty("javax.net.ssl.trustStore");

 if (path == null) 
 {
  if ( Build.VERSION.SDK_INT >= 14 ) 
  {
   //THIS IS THE PART I DONT KNOW
   path="";
  }
  else
  {
   path = "/system/etc/security/cacerts.bks";
  }

  return path;
}

Здесь комментатор говорит, что под Android "4.x; /etc/security/cacerts.bks был заменен с каталогом /etc/security/cacerts/, содержащим сертификаты в виде отдельных файлов с кодировкой PEM». однако я не знаю, какое значение это имеет, если оно вообще есть.

Я также проверил код двух проектов, использующих xmpp и asmack (gtalksms и yaxim, но не вижу, как они избегают этой проблемы.


person Lukas Ruge    schedule 01.06.2012    source источник
comment
Я также в настоящее время исследую это. Недавно мы изменили определение пути хранилища доверенных сертификатов в GTalkSMS. так как его также можно увидеть здесь. Но я уверен, что этого недостаточно...   -  person Flow    schedule 02.06.2012


Ответы (2)


Попробуй это:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
    connectionConfiguration.setTruststoreType("AndroidCAStore");
    connectionConfiguration.setTruststorePassword(null);
    connectionConfiguration.setTruststorePath(null);
} else {
    connectionConfiguration.setTruststoreType("BKS");
    String path = System.getProperty("javax.net.ssl.trustStore");
    if (path == null)
        path = System.getProperty("java.home") + File.separator + "etc"
            + File.separator + "security" + File.separator
            + "cacerts.bks";
    connectionConfiguration.setTruststorePath(path);
}

См. https://github.com/Flowdalic/asmack/wiki/Truststore и некоторую предысторию объяснение на http://nelenkov.blogspot.com/2011/12/ics-trust-store-implementation.html.

person Phillip    schedule 01.08.2012
comment
Привет, я использовал приведенный выше код для Jellybean, поэтому он отлично работает, также я могу аутентифицировать пользователей. Но я также вижу перехваченное исключение java.lang.NullPointerException. Оно выдается из continueTLSReceived, который, в свою очередь, вызывает ServerTrustManager. Вылетает для configuration.getTruststorePath(). Есть идеи? - person anargund; 23.05.2013
comment
@anargund Я тоже вижу ту же проблему. ICS и JellyBean. - person Geebs; 04.06.2013
comment
@Geebs Я решил это. Я загрузил последнюю версию файла jar с веб-сайта asmack. Раньше у меня была проблема, потому что я использовал какой-то старый файл jar. Как только я начал использовать последнюю версию, большинство проблем было решено. - person anargund; 05.06.2013
comment
как создать путь к доверенному хранилищу и этот фон, пожалуйста, объясните и эти вещи @Phillip - person Karthick M; 04.04.2014

Хранилище доверия в ICS больше не находится в одном файле .bks, а в отдельных файлах с кодировкой PEM в каталоге /system/etc/security/cacerts. Добавленные пользователем сертификаты можно поместить в /data/misc/keychain/cacerts-added. Более подробную информацию можно найти здесь.

Ваш файл сертификата должен иметь имя: subject-hash.N, где N — последовательное целое число, начинающееся с 0 (обычно просто 0, но если 0 уже используется, то 1 и т. д.).

Чтобы получить хеш темы вашего сертификата, вы можете использовать openssl следующим образом: openssl x509 -noout -subject_hash_old -in my-cert-file.pem

person rustyx    schedule 26.08.2012
comment
Спасибо, но как тогда настроить соединение, для которого требуется указать путь к доверенному хранилищу, если его больше не существует? jivesoftware.smack.ConnectionConfiguration требует использования setTruststorePath, потому что в конце результатом должно быть XMPP-соединение. - person Lukas Ruge; 29.08.2012
comment
Или, если пойти другим путем: могу ли я создать соединение, вообще не устанавливая хранилище доверия? Ненадежное соединение, так сказать. - person Lukas Ruge; 03.09.2012
comment
Вы пробовали ответ Филиппа? В ICS вам не нужно устанавливать путь к хранилищу доверенных сертификатов, только тип хранилища доверенных сертификатов AndroidCAStore. - person rustyx; 03.09.2012
comment
Да, я попробовал, и это (почти) сработало (хотя я думаю, что ошибка была в окружающем коде). Теперь я уменьшил его еще больше, не используя никаких доверенных источников или шифрования. По сути, самый минимум, как показано здесь. Это, конечно, не обеспечивает никакой безопасности, но, похоже, пока работает, позволяя мне работать над другими вещами... - person Lukas Ruge; 03.09.2012