5

我正在尝试在我的 Android 应用程序中连接到 LDAP 服务器,并且正在使用 UnboundID SDK。最近,从不安全的 LDAP 更改为安全的 LDAP,我必须相应地更改应用程序。我已获得要验证的 SSL 证书文件。我已经使用该文件创建了一个密钥库,如此所述。我在我的应用程序的资产文件夹中有这个密钥库文件,并且正在从中提取。下面的代码目前不起作用,并引发异常:

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

但是,代码段:

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

确实有效(尽管我被高层告知这是不安全的)。我不太确定我在这里做错了什么,所以任何帮助将不胜感激。另外,如果有比我上面尝试做的更好的方法来完成这个,请随时告诉我:) 不过我想坚持使用 UnboundID 库,因为其余代码已经使用同样,如果我使用 TrustAllTrustManager,一切正常。

4

1 回答 1

3

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

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

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

于 2012-08-10T08:32:45.137 回答