Использование 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. & quot; Тем не менее, я не знаю, какое значение имеет, если таковые имеются, это имеет.

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

 Flow02 июн. 2012 г., 13:15
Я также в настоящее время расследую это. У нас в последнее времяchanged how we detect the truststore path on GTalkSMS как это может бытьseen here, Но я уверен, что этого недостаточно ...

Ответы на вопрос(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.

 04 июн. 2013 г., 14:14
@anargund Я тоже вижу эту проблему. ICS и JellyBean.
 18 авг. 2013 г., 05:30
@anargund спасибо за обновление
 04 апр. 2014 г., 08:36
как создать путь к хранилищу доверенных сертификатов и тому подобное, пожалуйста, объясните эти вещи тоже @Phillip
 04 июн. 2013 г., 22:34
@ Ребята, я решил это. Я скачал последнюю версию файла JAR с веб-сайта Asmack. У меня были проблемы раньше, потому что я использовал какой-то старый файл JAR. Как только я начал использовать последнюю версию, большинство проблем были решены.
 23 мая 2013 г., 02:45
Привет, я использовал приведенный выше код для Jellybean, поэтому он работает нормально, также я могу аутентифицировать пользователей. Но я также вижу перехваченное исключение java.lang.NullPointerException, которое оно генерирует от continueTLSReceived, которое в свою очередь вызывает ServerTrustManager. Вылетает для конфигурации. GetTruststorePath (). Любая идея?

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

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

To get the subject-hash of your cert, you can use openssl like this: openssl x509 -noout -subject_hash_old -in my-cert-file.pem

 Lukas Ruge03 сент. 2012 г., 10:52
Да, я попытался, и это (почти) сработало (я думаю, что ошибка была в моем окружающем коде, хотя). Я теперь уменьшил это еще больше, не используя никакие виды доверия или шифрование. В основном минимум, как показаноhere, Это, конечно, лишено какой-либо безопасности, но, похоже, пока работает, позволяя мне работать над другими вещами ...
 Lukas Ruge03 сент. 2012 г., 09:43
Или пойти в другом направлении: могу ли я создать соединение, не устанавливая хранилище доверенных сертификатов вообще? Ненадежная связь, так сказать.
 03 сент. 2012 г., 10:35
Вы пробовали ответ Филиппа? В ICS вам не нужно устанавливать путь к хранилищу доверенных сертификатов, только тип хранилища доверенных сертификатов "AndroidCAStore".
 Lukas Ruge29 авг. 2012 г., 09:47
Спасибо, но как тогда можно настроить соединение, которое требует указать путь к хранилищу доверенных сертификатов, если его больше не существует?jivesoftware.smack.ConnectionConfiguration требует использованияsetTruststorePath потому что в конце результатом должно быть XMPP-соединение.

Ваш ответ на вопрос