这里使用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显示弹出窗口以获得用户的许可,如
有没有办法解决这个问题。如果有人知道,请发表您的建议。提前谢谢。
答案 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,提供一个拥有服务器证书的信任管理器。