Android 在安卓4+;中使用安卓信任库进行aSmack;(ICS)

Android 在安卓4+;中使用安卓信任库进行aSmack;(ICS),android,xmpp,keystore,asmack,Android,Xmpp,Keystore,Asmack,我不是密钥库方面的专家,很难理解其中的细微差别,但这就是我取得的成就: 在使用asmack构建创建xmpp连接时,仍然需要更改信任库,这通常是使用这些命令完成的,比如说web上的multiple ConnectionConfiguration config = new ConnectionConfiguration(host, Integer.parseInt(port), service); config.setTruststorePath("/system/etc/security/cace

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

在使用asmack构建创建xmpp连接时,仍然需要更改信任库,这通常是使用这些命令完成的,比如说web上的multiple

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连接

关于该方法,如下所示:

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检查了两个项目的代码(但没有看到它们如何避免这个问题。

试试这个:

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);
}

请参阅和一些背景说明。

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

您的证书文件必须命名为:
subject hash.N
,其中N是从0开始的顺序整数(通常仅为0,但如果已使用0,则为1,以此类推)

要获取证书的主题哈希,您可以使用如下openssl:
opensslx509-noout-subject\u hash\u old-在我的证书文件中。pem

我目前也在调查这个问题。我们最近也在调查这个问题。但我很确定这还不够……谢谢,但是如何配置连接,如果不再存在,需要设置信任库的路径呢?
jivesoftware.smack、 ConnectionConfiguration
要求使用
setTruststorePath
,因为最终结果需要是一个XMPP-Connection。或者,要转到另一个方向:我可以创建一个连接而根本不设置信任存储吗?可以说是一个不受信任的连接。你试过Phillip的答案吗?在ICS中,你不需要设置trust存储路径,只有信任存储类型“AndroidCAStore”。是的,我尝试了,它(几乎)成功了(我认为错误在我周围的代码中).我现在进一步减少了它,没有使用任何类型的信任或加密。基本上是如图所示的最小值。这当然缺乏任何安全性,但现在似乎可以让我处理其他东西…嗨,我使用了上面的代码用于Jellybean,所以它工作正常,我还可以验证用户。但我也看到一个捕获到的异常java.lang.NullPointerException从proceedTLSReceived抛出,后者依次调用ServerTrustManager。它因配置而崩溃。getTruststorePath().有什么想法吗?@anargund我也看到了同样的问题。ICS和JellyBean。@Geebs我解决了它。我从asmack网站下载了最新版本的jar文件。我以前遇到过问题,因为我使用的是一些旧的jar文件。当我开始使用最新的jar文件时,大多数问题都得到了解决。如何创建信任存储路径和那些背景,也请解释一下这些事情@Phillip