我正在尝试连接到我的android应用程序中的ldap服务器,并且正在使用未绑定的sdk。最近,从不安全的LDAP更改为安全的LDAP,我必须相应地更改应用程序。我已经获得了要验证的ssl证书文件。我已经使用该文件创建了一个keystore,如here所述。我把这个密钥库文件放在我的应用程序的assets文件夹中,正在从中提取。下面的代码当前不起作用,并引发异常:
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);

确实有效(尽管上级告诉我这是不安全的)。
我不太清楚我到底做错了什么,所以我很感激你的帮助。此外,如果有更好的方法来实现这一点,而不是我正在尝试做的,请随时告诉我:)我想坚持使用unbounded库,因为其余的代码也已经使用它编写了,如果我使用trustalltrustmanager,一切都会正常工作。

最佳答案

确实,trust all trust manager不安全。这对于测试来说是很方便的,但是它允许一个坏蛋用他为自己生成的证书建立自己的服务器,并用它来模拟真实的服务器,或者以中间人的身份操作,拦截并潜在地警告客户机和真正的服务器。有了一个更严格的信任管理器,客户端应该拒绝假服务器将提供的假证书。
不过,不幸的是,您在本例中尝试使用的信任管理器似乎不喜欢您的服务器向其提供的证书。因为trust all trust manager允许您建立连接,这意味着您的服务器确实有一个证书,并且能够执行ssl通信,但是您的信任管理器不喜欢这个证书。这几乎肯定不是ldap sdk的问题,因为如果使用相同的信任存储,那么其他ldap api也会出现相同的问题。
如果您查看结果,它会显示一条消息“trust anchor for certification path not found”。这意味着在信任存储中既没有找到服务器正在使用的证书,也没有找到其任何颁发者的证书。您需要将服务器证书(或其颁发者之一的证书)导入正在使用的信任存储区。听起来你已经试过这么做了,但既然它不起作用,那就一定是有些事情做得不对。我建议与目录服务器管理员合作,以确保您正尝试根据服务器配置导入正确的证书。

08-18 06:06
查看更多