在使用Smack api记忆Xmpp连接中的信任管理器时,如何避免在android中询问客户端的permision?

时间:2016-11-11 06:43:04

标签: android openfire smack

这里使用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显示弹出窗口以获得用户的许可,如

enter image description here

有没有办法解决这个问题。如果有人知道,请发表您的建议。提前谢谢。

1 个答案:

答案 0 :(得分:0)

如果您查看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,提供一个拥有服务器证书的信任管理器。