使用UnboundID SDK和SSL证书文件连接到Android应用程序中的LDAP服务器

时间:2012-08-09 23:51:01

标签: android ssl ldap certificate unboundid-ldap-sdk

我正在尝试在我的Android应用中建立与LDAP服务器的连接,并且正在使用UnboundID SDK。最近,从不安全的LDAP到安全的LDAP进行了更改,我必须相应地更改应用程序。我已获得SSL证书文件进行验证。我已经使用该文件来创建一个密钥库,如here所述。我在我的应用程序的assets文件夹中有这个密钥库文件,并且从那里开始。下面的代码当前不起作用,并抛出异常:

javax.net.ssl.SSLHandShakeException:

LDAPException(resultCode为= 01(连接误差),的errorMessage =('而尝试连接到服务器place.myserver.com:636发生错误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,那么一切正常。

1 个答案:

答案 0 :(得分:3)

信任所有信托经理确实不安全。它很方便用于测试目的,但它允许坏人用自己为自己生成的证书设置自己的服务器并使用它来冒充真实服务器,或者作为中间人操作,拦截并潜在地提醒任何人客户端和真实服务器之间的通信。如果有更严格的信任管理器,客户端应该拒绝假服务器将出现的虚假证书。

不幸的是,看起来您在这种情况下尝试使用的信任管理器不喜欢您的服务器提供给它的证书。因为信任所有信任管理器允许您建立连接,这意味着您的服务器确实具有证书并且能够执行SSL通信,但是您的信任管理器不喜欢该证书。这几乎肯定不是LDAP SDK的问题,因为如果您使用相同的信任库,任何其他LDAP API都会出现同样的问题。

如果查看结果,则会显示“找不到证书路径的信任锚”的消息。这意味着在信任库中找不到服务器正在使用的证书或其任何发行者的证书。您需要将服务器证书(或其中一个颁发者的证书)导入您正在使用的信任存储区。听起来你已经尝试过这样做了,但是因为它不能正常工作,所以对于它的完成方式来说,一定不能完全正确。我建议与目录服务器管理员一起工作,以确保您尝试根据服务器配置导入正确的证书。