2012-08-09 68 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都会出现相同的问题。

如果查看结果,它将显示“未找到证书路径的信任锚点”消息。这意味着服务器正在使用的证书以及它的任何发行者的证书都不在信任库中。您需要将服务器证书(或其发行人之一的证书)导入您正在使用的信任库中。这听起来像你试图做到这一点,但由于它不起作用,那么事情就不会那么完美了。我建议与目录服务器管理员一起工作,以确保您尝试根据服务器配置导入正确的证书。

相关问题