0

我有一个天蓝色的 VM,我在其上托管了一个 AD LDS 实例。我还在 OU 中创建了一些用户。我正在尝试使用我的 Java 代码连接到 AD LDS 实例。我的代码如下:

public final class Main {

    private static final List<String> EMPTY_ARGS = emptyList();

    public static void main(String[] args) throws Exception {

        List<String> argsList = asList(args);

        String url = "LDAP://xx.xx.xxx.xx:389/o=org,c=US";   //Public IP of VM
        String principal = "CN=Test User,OU=Users,O=org,C=US";
        String password = "password";
        List<String> attributeNames = new ArrayList<String>();

        attributeNames.add(url);
        attributeNames.add(principal);
        attributeNames.add(password);

        System.out.println("url = " + url);
        System.out.println("principal = " + principal);
        System.out.println("password = " + password);
        System.out.println("attributeNames = " + attributeNames);

        Hashtable<Object, Object> env = new Hashtable<Object, Object>();
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.PROVIDER_URL, url);
        env.put(Context.SECURITY_AUTHENTICATION, "simple");
        env.put(Context.SECURITY_PRINCIPAL, principal);
        env.put(Context.SECURITY_CREDENTIALS, password);

        env.put("java.naming.ldap.factory.socket", "cnauroth.ldaputil.CustomSSLSocketFactory");

        DirContext ctx = null;

        try {
            System.out.println("Inside");
            ctx = new InitialDirContext(env);

            System.out.println("Successfully authenticated.");

            if (!attributeNames.isEmpty()) {
                Attributes attributes = ctx.getAttributes(principal,
                    attributeNames.toArray(new String[attributeNames.size()]));

                for (String attributeName : attributeNames) {
                    Attribute attribute = attributes.get(attributeName);

                    if (null != attribute) {
                        NamingEnumeration<?> values = attribute.getAll();

                        if (null != values) {
                            if (values.hasMore()) {
                                System.out.println(attributeName);

                                while (values.hasMore())
                                    System.out.println("    " + values.next());
                            }
                        }
                    }
                }
            }
        }
        finally {
            if (null != ctx) {
                try {
                    ctx.close();
                }
                catch (NamingException e) {
                    e.printStackTrace(System.err);
                }
            }
        }
    }
}

当我从 VM 外部执行此代码时,出现以下错误:

Exception in thread "main" javax.naming.CommunicationException: 191.238.241.11:389 [Root exception is java.net.ConnectException: Connection timed out: connect]
    at com.sun.jndi.ldap.Connection.<init>(Unknown Source)
    at com.sun.jndi.ldap.LdapClient.<init>(Unknown Source)
    at com.sun.jndi.ldap.LdapClient.getInstance(Unknown Source)
    at com.sun.jndi.ldap.LdapCtx.connect(Unknown Source)
    at com.sun.jndi.ldap.LdapCtx.<init>(Unknown Source)
    at com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(Unknown Source)
    at com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(Unknown Source)
    at com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(Unknown Source)
    at com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(Unknown Source)
    at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
    at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
    at javax.naming.InitialContext.init(Unknown Source)
    at javax.naming.InitialContext.<init>(Unknown Source)
    at javax.naming.directory.InitialDirContext.<init>(Unknown Source)
    at cnauroth.ldaputil.Main.main(Main.java:92)
Caused by: java.net.ConnectException: Connection timed out: connect
    at java.net.DualStackPlainSocketImpl.connect0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.connect(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.<init>(Unknown Source)
    at sun.security.ssl.SSLSocketFactoryImpl.createSocket(Unknown Source)
    at cnauroth.ldaputil.CustomSSLSocketFactory.createSocket(CustomSSLSocketFactory.java:72)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.sun.jndi.ldap.Connection.createSocket(Unknown Source)
    ... 15 more

错误的原因可能是什么?如果我在 VM 本身上运行类似的代码,我可以连接到 AD LDS 实例

4

0 回答 0