Я не эксперт по хранилищам ключей, и мне трудно понять нюансы этого, но вот как далеко я продвинулся:
При создании 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, но не вижу, как они избегают этой проблемы.