2012-08-09 37 views
4

我正嘗試在Android應用中建立與LDAP服務器的連接,並使用UnboundID SDK。最近,從不安全到安全的LDAP進行了更改,我必須相應地更改應用程序。我已被授予SSL證書文件以進行驗證。我已經用here所描述的文件來創建密鑰庫。我在我的應用的資產文件夾中有這個密鑰庫文件,並且正在從中獲取。下面的代碼目前不工作,並拋出異常:將UnboundID SDK與SSL證書文件一起使用以連接到Android應用中的LDAP服務器

LDAPException(resultCode = 01(連接錯誤),errorMessage =('嘗試連接到服務器時發生錯誤place.myserver.com:636:javax。 net.ssl.SSLHandShakeException:java.security.cert.CertPathValidatorException:認證路徑信任錨找不到

// code from above link 
AssetManager assetManager = getApplicationContext().getAssets(); 
InputStream keyStoreInputStream = assetManager.open("yourapp.store"); 
KeyStore trustStore = KeyStore.getInstance("BKS"); 
trustStore.load(keyStoreInputStream, "myPassword".toCharArray()); 
TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509"); 
tmf.init(trustStore); 
// my code 
SSLUtil sslUtil = new SSLUtil(tmf.getTrustManagers()); 
LDAPConnection connection = new LDAPConnection(sslUtil.createSSLSocketFactory()); 
connection.connect("place.myserver.com", 636); 

但是,代碼段:

SSLUtil sslUtil = new SSLUtil(new TrustAllTrustManager()); 
LDAPConnection connection = new LDAPConnection(sslUtil.createSSLSocketFactory()); 
connection.connect("place.myserver.com", 636); 

不工作(雖然我被知情高層認爲這將是不安全的) 我不太確定我在這裏做錯了什麼,所以任何幫助,將不勝感激。此外,如果有更好的方法來完成這個比我上面嘗試做的更好,請隨時讓我知道:)但我想堅持使用UnboundID庫,因爲其餘代碼已經寫入使用也是如此,如果我使用TrustAllTrustManager,一切都有效。

回答

3

誠然,所有信任管理者都不安全。這對於測試目的很方便,但它可以讓壞人用自己生成的證書設置自己的服務器,並用它來模擬真實的服務器,或者作爲中間的人來操作,攔截並可能提醒任何人客戶端和真實服務器之間的通信。如果採用更嚴格的信任管理器,客戶端應拒絕虛假服務器將提供的虛假證書。

不幸的是,看起來你在這種情況下嘗試使用的信任管理器並不喜歡你的服務器向其提供的證書。由於信任所有信任管理器允許您建立連接,這意味着您的服務器確實有證書並且能夠執行SSL通信,但是您的信任管理器不喜歡該證書。這幾乎肯定不是LDAP SDK的問題,因爲如果您使用的是相同的信任庫,則任何其他LDAP API都會出現相同的問題。

如果查看結果,它將顯示「未找到證書路徑的信任錨點」消息。這意味着服務器正在使用的證書以及它的任何發行者的證書都不在信任庫中。您需要將服務器證書(或其發行人之一的證書)導入您正在使用的信任庫中。這聽起來像你試圖做到這一點,但由於它不起作用,那麼事情就不會那麼完美了。我建議與目錄服務器管理員一起工作,以確保您嘗試根據服務器配置導入正確的證書。

相關問題