Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.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到Active Directory LDAP Java.net.SocketException:连接或出站已关闭_Java_Ldap - Fatal编程技术网

Java到Active Directory LDAP Java.net.SocketException:连接或出站已关闭

Java到Active Directory LDAP Java.net.SocketException:连接或出站已关闭,java,ldap,Java,Ldap,晚上好, 到现在为止,我已经面对这个错误好几天了,尽管我在网上寻找解决方案,我还是可以修复这个错误 import java.util.Hashtable; import javax.naming.Context; import javax.naming.NamingEnumeration; import javax.naming.directory.Attribute; import javax.naming.directory.Attributes; import javax.naming.d

晚上好,

到现在为止,我已经面对这个错误好几天了,尽管我在网上寻找解决方案,我还是可以修复这个错误

import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.BasicAttribute;
import javax.naming.directory.BasicAttributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;

public class LDAPtest {
public static void main(String[] args) {
    
    try {
        
        String keystorePath = "C:/Program Files/Java/jdk-13.0.2/lib/security/cacerts";
        System.setProperty("javax.net.ssl.keyStore", keystorePath);
         
        System.setProperty("javax.net.ssl.keyStorePassword", "changeit");
        
        Hashtable<String, String> ldapEnv = new Hashtable<>(); 
        ldapEnv.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
        ldapEnv.put(Context.PROVIDER_URL, "ldaps://localhost:10636");
        ldapEnv.put(Context.SECURITY_AUTHENTICATION,"simple");
        ldapEnv.put(Context.SECURITY_PRINCIPAL,"uid=admin,ou=system");
        ldapEnv.put(Context.SECURITY_CREDENTIALS,"secret");
        
        DirContext connection = new InitialDirContext(ldapEnv);
        System.out.println("Benvenuto " + connection);
        NamingEnumeration enm = connection.list("");

        while (enm.hasMore()) {
            System.out.println(enm.next());
        }

        enm.close();
        connection.close();
        
        
    }catch(Exception e) {
        e.printStackTrace();
    }
    
}

我使用Apache Directory Studio为LDAP服务器进行了设置,并在这里遵循本教程,以使LDAP正常工作:

所以我制作了证书,甚至安装了它,并用keytool将其导入到cacerts中。 我为所选端口(10636)启用了端口转发,但仍然出现以下异常:

javax.naming.CommunicationException: simple bind failed: localhost:10636 [Root exception is 
java.net.SocketException: Connection or outbound has closed]
at java.naming/com.sun.jndi.ldap.LdapClient.authenticate(LdapClient.java:219)
at java.naming/com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2795)
at java.naming/com.sun.jndi.ldap.LdapCtx.<init>(LdapCtx.java:320)
at java.naming/com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxFromUrl(LdapCtxFactory.java:225)
at java.naming/com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:189)
at java.naming/com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(LdapCtxFactory.java:243)
at java.naming/com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(LdapCtxFactory.java:154)
at java.naming/com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(LdapCtxFactory.java:84)
at java.naming/javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:730)
at java.naming/javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:305)
at java.naming/javax.naming.InitialContext.init(InitialContext.java:236)
at java.naming/javax.naming.InitialContext.<init>(InitialContext.java:208)
at java.naming/javax.naming.directory.InitialDirContext.<init>(InitialDirContext.java:130)
at Prova3.main(Prova3.java:31)
Caused by: java.net.SocketException: Connection or outbound has closed
at java.base/sun.security.ssl.SSLSocketImpl$AppOutputStream.write(SSLSocketImpl.java:1246)
at java.base/java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:81)
at java.base/java.io.BufferedOutputStream.flush(BufferedOutputStream.java:142)
at java.naming/com.sun.jndi.ldap.Connection.writeRequest(Connection.java:398)
at java.naming/com.sun.jndi.ldap.Connection.writeRequest(Connection.java:371)
at java.naming/com.sun.jndi.ldap.LdapClient.ldapBind(LdapClient.java:359)
at java.naming/com.sun.jndi.ldap.LdapClient.authenticate(LdapClient.java:214)
... 13 more
javax.naming.CommunicationException:简单绑定失败:localhost:10636[根异常为
java.net.SocketException:连接或出站已关闭]
位于java.naming/com.sun.jndi.ldap.LdapClient.authenticate(LdapClient.java:219)
位于java.naming/com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2795)
位于java.naming/com.sun.jndi.ldap.LdapCtx.(LdapCtx.java:320)
位于java.naming/com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxFromUrl(LdapCtxFactory.java:225)
位于java.naming/com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:189)
位于java.naming/com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(LdapCtxFactory.java:243)
位于java.naming/com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(LdapCtxFactory.java:154)
位于java.naming/com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(LdapCtxFactory.java:84)
位于java.naming/javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:730)
位于java.naming/javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:305)
位于java.naming/javax.naming.InitialContext.init(InitialContext.java:236)
位于java.naming/javax.naming.InitialContext。(InitialContext.java:208)
位于java.naming/javax.naming.directory.InitialDirContext。(InitialDirContext.java:130)
位于Prova3.main(Prova3.java:31)
原因:java.net.SocketException:连接或出站已关闭
位于java.base/sun.security.ssl.SSLSocketImpl$AppOutputStream.write(SSLSocketImpl.java:1246)
位于java.base/java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:81)
位于java.base/java.io.BufferedOutputStream.flush(BufferedOutputStream.java:142)
位于java.naming/com.sun.jndi.ldap.Connection.writeRequest(Connection.java:398)
位于java.naming/com.sun.jndi.ldap.Connection.writeRequest(Connection.java:371)
位于java.naming/com.sun.jndi.ldap.LdapClient.ldapBind(LdapClient.java:359)
位于java.naming/com.sun.jndi.ldap.LdapClient.authenticate(LdapClient.java:214)
... 还有13个
提前感谢谷歌用户

简单绑定失败
错误几乎总是与SSL连接相关

使用
nc
telnet
,检查客户端与远程主机和端口之间是否可以建立连接

使用
SSLPoke.java
(一个检查SSL连接的简单java类),检查证书是否正确导入和使用,同时检查TLS版本是否正确。使用类似于
java-Dhttps.protocols=TLSv1、TLSv1.1、TLSv1.2-Djavax.net.debug=all-SSLPoke google.com 443>log.txt 2>&1的代码

寻找:

  • 警告:找不到合适的证书-在没有客户端身份验证的情况下继续
    =检查是否已设置
    javax.net.ssl.trustStore
  • 致命(握手失败):无法启动握手
    =可能是不匹配的TLS版本
  • 还要检查您的中间CA是否已过期

我在JDK8中也有同样的问题。这似乎不是如中所回答的JDK版本问题
ldapEnv.put(Context.PROVIDER_URL, "ldap://localhost:10389");
javax.naming.CommunicationException: simple bind failed: localhost:10636 [Root exception is 
java.net.SocketException: Connection or outbound has closed]
at java.naming/com.sun.jndi.ldap.LdapClient.authenticate(LdapClient.java:219)
at java.naming/com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2795)
at java.naming/com.sun.jndi.ldap.LdapCtx.<init>(LdapCtx.java:320)
at java.naming/com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxFromUrl(LdapCtxFactory.java:225)
at java.naming/com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:189)
at java.naming/com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(LdapCtxFactory.java:243)
at java.naming/com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(LdapCtxFactory.java:154)
at java.naming/com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(LdapCtxFactory.java:84)
at java.naming/javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:730)
at java.naming/javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:305)
at java.naming/javax.naming.InitialContext.init(InitialContext.java:236)
at java.naming/javax.naming.InitialContext.<init>(InitialContext.java:208)
at java.naming/javax.naming.directory.InitialDirContext.<init>(InitialDirContext.java:130)
at Prova3.main(Prova3.java:31)
Caused by: java.net.SocketException: Connection or outbound has closed
at java.base/sun.security.ssl.SSLSocketImpl$AppOutputStream.write(SSLSocketImpl.java:1246)
at java.base/java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:81)
at java.base/java.io.BufferedOutputStream.flush(BufferedOutputStream.java:142)
at java.naming/com.sun.jndi.ldap.Connection.writeRequest(Connection.java:398)
at java.naming/com.sun.jndi.ldap.Connection.writeRequest(Connection.java:371)
at java.naming/com.sun.jndi.ldap.LdapClient.ldapBind(LdapClient.java:359)
at java.naming/com.sun.jndi.ldap.LdapClient.authenticate(LdapClient.java:214)
... 13 more