我有一个天蓝色的 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 实例