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

mho*_*lum 5 ssl android ldap certificate unboundid-ldap-sdk

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

LDAPException(resultCode = 01(connect error),errorMessage =('尝试连接到服务器时发生错误place.myserver.com:636:javax.net.ssl.SSLHandShakeException:java.security.cert.CertPathValidatorException:Trust anchor for未找到证书路径

// 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);
Run Code Online (Sandbox Code Playgroud)

但是,代码段:

SSLUtil sslUtil = new SSLUtil(new TrustAllTrustManager());
LDAPConnection connection = new LDAPConnection(sslUtil.createSSLSocketFactory());
connection.connect("place.myserver.com", 636);
Run Code Online (Sandbox Code Playgroud)

确实有效(虽然我被高层人士告知,这将是不安全的).我不太清楚我在这里做错了什么,所以任何帮助都会受到赞赏.另外,如果有一个更好的方法来完成这个比我上面尝试做的更多,请随时告诉我:)我想坚持使用UnboundID库,因为其余的代码已经使用这也是,如果我使用TrustAllTrustManager一切正常.

小智 3

确实,信任所有信任管理器并不安全。它对于测试目的很方便,但它会允许坏人使用他为自己生成的证书来设置自己的服务器,并使用它来冒充真正的服务器,或者作为中间人进行操作,拦截并可能警告任何其他服务器客户端和真实服务器之间的通信。有了更严格的信任管理器,客户端应该拒绝假服务器将提供的假证书。

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

如果您查看结果,它会显示一条消息“未找到证书路径的信任锚”。这意味着在信任存储中找不到服务器正在使用的证书或其任何颁发者的证书。您需要将服务器证书(或其颁发者之一的证书)导入到您正在使用的信任存储中。听起来你已经尝试这样做了,但由于它不起作用,那么它的完成方式一定不太正确。我建议与目录服务器管理员合作,以确保您尝试根据服务器配置导入正确的证书。