Android 在安卓4+;中使用安卓信任库进行aSmack;(ICS)
我不是密钥库方面的专家,很难理解其中的细微差别,但这就是我取得的成就: 在使用asmack构建创建xmpp连接时,仍然需要更改信任库,这通常是使用这些命令完成的,比如说web上的multipleAndroid 在安卓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
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