我不是keystores方面的专家,很难理解其中的细微差别,但这就是我所取得的进展:
在使用asmack build foundhere创建xmpp连接时,仍然需要更改truststore,也就是说web上的multiplesources通常是使用以下命令完成的

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连接。
关于this can be fixed该方法如下:
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;
}

this一位评论员说,在android“4.x./etc/security/cacerts.bks下,certs被替换为/etc/security/cacerts/目录,其中包含单独的pem编码文件。“但是,我不知道这有什么相关性,如果有的话。
我还检查了使用xmpp和asmack(Heregtalksms的两个项目的代码,但是没有看到它们如何避免这个问题。

最佳答案

试试这个:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
    connectionConfiguration.setTruststoreType("AndroidCAStore");
    connectionConfiguration.setTruststorePassword(null);
    connectionConfiguration.setTruststorePath(null);
} else {
    connectionConfiguration.setTruststoreType("BKS");
    String path = System.getProperty("javax.net.ssl.trustStore");
    if (path == null)
        path = System.getProperty("java.home") + File.separator + "etc"
            + File.separator + "security" + File.separator
            + "cacerts.bks";
    connectionConfiguration.setTruststorePath(path);
}

参见https://github.com/Flowdalic/asmack/wiki/Truststorehttp://nelenkov.blogspot.com/2011/12/ics-trust-store-implementation.html中的一些背景说明。

10-07 19:28