Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android应用程序中使用带有SSL证书文件的未绑定SDK连接到LDAP服务器_Android_Ssl_Ldap_Certificate_Unboundid Ldap Sdk - Fatal编程技术网

在Android应用程序中使用带有SSL证书文件的未绑定SDK连接到LDAP服务器

在Android应用程序中使用带有SSL证书文件的未绑定SDK连接到LDAP服务器,android,ssl,ldap,certificate,unboundid-ldap-sdk,Android,Ssl,Ldap,Certificate,Unboundid Ldap Sdk,我正在尝试在我的Android应用程序中连接到LDAP服务器,并且正在使用未绑定的SDK。最近,从不安全的LDAP更改为安全的LDAP,我必须相应地更改应用程序。我已经获得了SSL证书文件以进行验证。我已经使用该文件创建了一个密钥库,如上所述。我的应用程序的资产文件夹中有这个密钥库文件,我正在从中提取。下面的代码当前不工作,并引发异常: LDAPException(resultCode=01(连接错误),errorMessage=('尝试连接到服务器位置时出错。myserver.com:636:

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

LDAPException(resultCode=01(连接错误),errorMessage=('尝试连接到服务器位置时出错。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,一切都会正常工作。

确实,TrustAllTrustManager不安全。它便于测试,但它允许坏人使用certifi设置自己的服务器CATE为他自己生成并使用它来模拟真实服务器,或者作为中间人进行操作,拦截和潜在地警告客户端和真实服务器之间的任何通信。在一个更严格的信任管理器的位置上,客户端应该拒绝伪造服务器将提交的伪造证书。 但是,不幸的是,您在本例中尝试使用的信任管理器似乎不喜欢服务器提供给它的证书。因为“信任所有”信任管理器允许您建立连接,这意味着您的服务器确实有证书并且能够执行SSL通信,但是关于您的信任管理器不喜欢的证书,这几乎肯定不是LDAP SDK的问题,因为如果您使用相同的信任存储,任何其他LDAP API都会出现相同的问题

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