Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.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
通过Java与LDAP的SSL连接_Java_Ssl_Ldap - Fatal编程技术网

通过Java与LDAP的SSL连接

通过Java与LDAP的SSL连接,java,ssl,ldap,Java,Ssl,Ldap,更新:我从来没有在SSL上工作过。为了获得安全性,我最终实现了一个VPN 我已经花了两天的时间来解决这个问题,但我一辈子都无法解决它。我已经回顾了以下内容: 在许多其他方面 更新:抱歉,我甚至没有发布我收到的错误。这是: javax.naming.CommunicationException: simple bind failed: server.local:636 [Root exception is javax.net.ssl.SSLHandshakeException: sun.secur

更新:我从来没有在SSL上工作过。为了获得安全性,我最终实现了一个VPN

我已经花了两天的时间来解决这个问题,但我一辈子都无法解决它。我已经回顾了以下内容:

在许多其他方面

更新:抱歉,我甚至没有发布我收到的错误。这是:

javax.naming.CommunicationException: simple bind failed: server.local:636 [Root exception is javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target]
我还在Win7 pro上使用GlassFish服务器3.1.2和NetBeans 7.3

以下是导致错误的代码:

Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://server.local:636/");

// Specify SSL
env.put(Context.SECURITY_PROTOCOL, "ssl");

// Fill in secuirty/bind variables
env.put(Context.SECURITY_AUTHENTICATION, "simple"); 
env.put(Context.SECURITY_PRINCIPAL, config.Config.getSECURITY_PRINCIPAL()); //returns user@domain.local
env.put(Context.SECURITY_CREDENTIALS, config.Config.getSECURITY_CREDENTIALS()); //returns password

// Create the initial context
ctx =  new InitialDirContext(env); //defined above as InitialDirContext ctx = null;
我已经使用ldp.exe确认在我们的AD服务器上正确配置了SSL。此外,我还尝试了以下方法:

从AD CS导入客户端证书和CA根证书,如所述 a。我使用了以下命令:

C:\Program Files (x86)\Java\jdk1.7.0_25>bin\keytool -import -file SBS2011.sage.local_sage-SBS2011-CA.crt -keystore .\jre\lib\security\cacerts -alias SBS2011
Enter keystore password:
Certificate already exists in keystore under alias <mykey>
Do you still want to add it? [no]:  yes
Certificate was added to keystore
C:\ProgramFilesx86\Java\jdk1.7.0\u 25>

卸载Java并重新安装,然后重复步骤1

添加以下代码行:

System.setPropertyjavax.net.ssl.trustStore,C:\\ProgramFilesx86\\Java\\jdk1.7.0\u 25\\jre\\lib\\security\\cacerts

System.setPropertyjavax.net.ssl.trustStorePassword,changeit


其他注意事项:使用非SSL连接时,代码工作正常,但在尝试更新用户信息时,出现LDAP错误53。最后,如果有不使用SSL的解决方案,我不介意。

您的信任库不信任LDAP服务器证书

以上步骤3是默认步骤

如果LDAP服务器具有CA签名的证书,则不需要执行步骤1

我不知道您为什么要说“客户端证书”,而您可能需要导入的是LDAP服务器的证书

env.put(Context.PROVIDER_URL, "ldap://server.local:636/");
应该是

env.put(Context.PROVIDER_URL, "ldaps://server.local:636/");

您的信任库不信任LDAP服务器证书

以上步骤3是默认步骤

如果LDAP服务器具有CA签名的证书,则不需要执行步骤1

我不知道您为什么要说“客户端证书”,而您可能需要导入的是LDAP服务器的证书

env.put(Context.PROVIDER_URL, "ldap://server.local:636/");
应该是

env.put(Context.PROVIDER_URL, "ldaps://server.local:636/");

您得到的确切错误是什么?我在上面添加了一个更新。对不起,我之前没有提到。你是如何解决这个问题的?你得到的确切错误是什么?我在上面添加了一个更新。很抱歉,我以前没有提到这一点。您是如何解决的?我添加了用于导入证书的代码,请告诉我这是否错误?1为什么证书已存在于别名下的密钥库中?2如果这应该是CA证书,它应该询问您是否信任它,因为您没有指定-trustcaerts选项。所以还是有问题。不需要同时导入服务器证书和它的CA证书,只需导入后者。证书指的是服务器的CA证书。以前我也执行了相同的命令,它询问我是否要导入它。我说是的,它说“成功”导入,但现在每次我尝试导入它时,它都说它已经存在了。它对我有效。我还是不知道你为什么要两次导入相同的东西。如果您认为您做得不对,应该先删除它。我添加了用于导入证书的代码,请告诉我这是否是错误的?1为什么证书已存在于别名下的密钥库中?2如果这应该是CA证书,它应该询问您是否信任它,因为您没有指定-trustcaerts选项。所以还是有问题。不需要同时导入服务器证书和它的CA证书,只需导入后者。证书指的是服务器的CA证书。以前我也执行了相同的命令,它询问我是否要导入它。我说是的,它说“成功”导入,但现在每次我尝试导入它时,它都说它已经存在了。它对我有效。我还是不知道你为什么要两次导入相同的东西。如果你认为你做得不对,你应该先删除它。