我不是密钥库方面的专家,很难理解其中的细微差别,但这就是我能做到的:
在使用此处找到的 asmack 构建创建 xmpp 连接时,仍然需要更改信任库,通常,比如说网络上的多个源,使用这些命令完成
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-path 所需的字符串,因为您不能只将密钥库本身返回到 xmpp-connection。
参考这个方法看起来像这样:
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但没有看到他们如何避免这个问题。