В запоминании диспетчера доверия в соединении Xmpp с использованием Smack api, как избежать запроса разрешения от клиента в Android?

Здесь я использую сервер Openfire для общения в чате с помощью Smack api. при установлении соединения между клиентом и сервером его запрашивающий сертификат, поэтому я использовал диспетчер доверия Memorizing, например,

SSLContext sslContext = null;
try {
            sslContext = SSLContext.getInstance("TLS");
            sslContext.init(null,MemorizingTrustManager.getInstanceList(getApplicationContext()), new SecureRandom());
        } catch (NoSuchAlgorithmException | KeyManagementException e) {
            e.printStackTrace();
        }
        XMPPTCPConnectionConfiguration.Builder configBuilder = XMPPTCPConnectionConfiguration.builder();
        configBuilder.setCustomSSLContext(sslContext);

Но проблема в том, что MemorizingTrustManager показывает всплывающее окно для получения разрешения от пользователя, например

введите здесь описание изображения

Есть ли способ справиться с этим .. Если кто-нибудь знает, опубликуйте свое предложение. Заранее спасибо.


person Priya    schedule 11.11.2016    source источник
comment
Я не понимаю вопроса: отображение этого диалогового окна, когда сертификат службы не может быть проверен системой (например, через установленные центры сертификации), - это именно то, что должен делать MTM.   -  person Flow    schedule 11.11.2016
comment
@Flow, Могу ли я принять в фоновом режиме ... что мне нужно, я не хочу показывать это всплывающее окно пользователю, или есть другой способ предоставить сертификат, а не MTM.   -  person Priya    schedule 11.11.2016
comment
Надеюсь, мой ответ здесь поможет: stackoverflow.com/a/33148123/4629102, а также мой блог: smackssl.blogspot.in/2015/10/   -  person Iqbal S    schedule 13.11.2016


Ответы (1)


Если вы посмотрите на источник memorizingTrustManager, вы заметите, что он обрабатывает два доверенных хранилища. Один - системное хранилище доверенных сертификатов по умолчанию, второй - доверенное хранилище приложений. Запрошенное разрешение означает, что этот сертификат нельзя проверить ни в одном магазине. Итак, один из подходящих способов - загрузить этот сертификат в хранилище доверенных сертификатов вашего приложения. Таким образом, в течение ssl handshake хранилище доверенных сертификатов будет выполнять внутреннюю проверку и принимать сертификат с сервера.

/** Creates an instance of the MemorizingTrustManager class that falls back to a custom TrustManager.
 *
 * You need to supply the application context. This has to be one of:
 *    - Application
 *    - Activity
 *    - Service
 *
 * The context is used for file management, to display the dialog /
 * notification and for obtaining translated strings.
 *
 * @param m Context for the application.
 * @param defaultTrustManager Delegate trust management to this TM. If null, the user must accept every certificate.
 */

public MemorizingTrustManager(Context m, X509TrustManager defaultTrustManager) {
    init(m);
    this.appTrustManager = getTrustManager(appKeyStore);
    this.defaultTrustManager = defaultTrustManager;
}

Проверьте источник здесь MemorizingTrustManager

поэтому не передавайте null, предоставьте доверенный менеджер, у которого есть сертификат вашего сервера.

person Farhan    schedule 16.11.2016