3

我不是密钥库方面的专家,很难理解其中的细微差别,但这就是我能做到的:

在使用此处找到的 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 的两个项目的代码(gtalksmsyaxim但没有看到他们如何避免这个问题。

4

2 回答 2

1

试试这个:

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/Truststore和一些背景说明http://nelenkov.blogspot.com/2011/12/ics-trust-store-implementation.html

于 2012-08-01T23:14:51.133 回答
1

ICS 中的信任存储不再位于单个 .bks 文件中,而是位于/system/etc/security/cacerts目录中单独的 PEM 编码文件中。用户添加的证书可以放在/data/misc/keychain/cacerts-added. 更多细节可以在这里找到。

您的证书文件必须命名为:subject-hash.N其中 N 是从 0 开始的连续整数(通常只有 0,但如果已使用 0,则为 1 等)。

要获取证书的主题哈希,您可以像这样使用 openssl: openssl x509 -noout -subject_hash_old -in my-cert-file.pem

于 2012-08-26T22:16:41.220 回答