我正在尝试在 Android 应用程序中连接到 LDAP 服务器,并使用 UnboundID SDK。最近,从不安全的 LDAP 更改为安全的 LDAP,我必须相应地更改应用程序。我已获得 SSL 证书文件来进行验证。我已经使用该文件来制作密钥库,如下所述here http://blog.thoughtcrime.org/authenticity-is-broken-in-ssl-but-your-app-ha。我已经在我的应用程序的资产文件夹中找到了这个密钥库文件,并且正在从中提取。下面的代码目前不起作用,并抛出异常:
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,一切都会正常。
确实,信任所有信任管理器并不安全。它对于测试目的很方便,但它会允许坏人使用他为自己生成的证书来设置自己的服务器,并使用它来冒充真正的服务器,或者作为中间人进行操作,拦截并可能警告任何其他服务器客户端和真实服务器之间的通信。有了更严格的信任管理器,客户端应该拒绝假服务器将提供的假证书。
但不幸的是,您在这种情况下尝试使用的信任管理器似乎不喜欢您的服务器向其提供的证书。由于信任所有信任管理器允许您建立连接,这意味着您的服务器确实具有证书并且能够执行 SSL 通信,但您的信任管理器不喜欢该证书的某些内容。这几乎肯定不是 LDAP SDK 的问题,因为如果您使用相同的信任存储,任何其他 LDAP API 也会出现同样的问题。
如果您查看结果,它会显示一条消息“未找到证书路径的信任锚”。这意味着在信任存储中找不到服务器正在使用的证书或其任何颁发者的证书。您需要将服务器证书(或其颁发者之一的证书)导入到您正在使用的信任存储中。听起来你已经尝试这样做了,但由于它不起作用,那么它的完成方式一定不太正确。我建议与目录服务器管理员合作,以确保您尝试根据服务器配置导入正确的证书。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)