2012-06-01 36 views
3

我不是密鑰庫的專家,也很難理解的這種細微差別,但是這是我在多大程度上得到:採用了Android信任庫的aSmack在Android 4以上(ICS)

在創建XMPP的使用asmack構建連接發現here一個仍然有改變信任,通常,因此在網絡上說的多sources,使用這些命令

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他們改變完成有些事情,現在它不再了。現在的路徑是不同的。

顯然this can be fixed但我沒有現實的想法如何。

顯然,需要的是一種方法,它返回取決於SDK版本的路徑,該路徑返回所需的字符串以設置sdk路徑,因爲您不能只將密鑰庫本身返回給xmpp連接。

在參考this該方法是這樣的:

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

Here一個評論者說,Android的下「4.x的; /etc/security/cacerts.bks被替換目錄/ etc /安全/ cacerts /包含證書作爲單獨的PEM編碼文件。「然而,我不知道這有什麼相關性,如果有的話。

我還檢查了使用XMPP和asmack(gtalksmsyaxim兩個項目的代碼,但沒有看到他們是如何避免這個問題

+0

我也目前正在調查這一點。我們最近[改變了我們如何檢測GTalkSMS上的信任庫路徑](http://code.google.com/p/gtalksms/source/detail?r=0ce642447febaf596a49a7caf8ffb79701e657ef),因爲它也可以[在這裏看到](https:/ /github.com/Flowdalic/asmack/wiki/Truststore)。但我很肯定,這是不夠的... – Flow

回答

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背景說明。

+0

嗨,我用上面的代碼爲Jellybean,所以它工作正常,我也可以驗證用戶。但是我也看到一個被捕獲的異常java.lang.NullPointerException 它從proceedTLSReceived拋出,然後調用ServerTrustManager。它崩潰了configuration.getTruststorePath()。 有什麼想法? – anargund

+0

@anargund我也看到同樣的問題。 ICS和果凍豆。 – Geebs

+0

@Geebs我解決了它。我從asmack網站下載了最新版本的jar文件。之前我遇到過問題,因爲我正在使用一些舊的jar文件。只要我開始使用最新版本,大部分問題都已解決。 – anargund

1

在ICS的信任存儲不是一個單一的文件.bks任何更多,但在單獨PEM編碼文件目錄。用戶添加的證書可以放置在/data/misc/keychain/cacerts-added。更多細節可以參考here

您的證書文件必須命名爲:subject-hash.N其中N是從0開始的連續整數(通常只是0,但如果已經使用0,則爲1等)。

爲了讓您的證書的主題 - 哈希值,你可以使用OpenSSL這樣的: openssl x509 -noout -subject_hash_old -in my-cert-file.pem

+0

謝謝,但如何可以配置連接,這將需要設置信任庫的路徑,如果這沒有更久的存在? 'jivesoftware.smack.ConnectionConfiguration'需要使用'setTruststorePath',因爲最終結果必須是XMPP-Connection。 –

+0

或者,轉向不同的方向:我可以創建一個連接而不設置信任存儲嗎?可以說是一個不可信的連接。 –

+0

你試過菲利普的答案嗎?在ICS中,您不需要設置信任存儲路徑,只需要信任存儲類型「AndroidCAStore」。 – rustyx