在 Java 中使用 LDAPConnection 和端口 636
Using LDAPConnection and Port 636 in Java
我正在尝试让应用程序的 LDAP 连接使用安全端口 636 而不是 389。以下代码在端口 389 上工作得很好,但抛出异常,389 被替换为 636。
线程异常"main" LDAPException(resultCode=81 (server down), errorMessage='The connection to server nlbldap.company_name.co.uk:636 was closed while while while a response to a bind request SimpleBindRequest( dn='jdoe@company_name.co.uk'): 尝试从服务器读取响应时发生 I/O 错误:SocketException(message='Connection reset', trace='read(SocketInputStream.java:186) / read(SocketInputStream.java:140) / fill(BufferedInputStream.java:252) / read(BufferedInputStream.java:271) / read(ASN1StreamReader.java:992) / readType(ASN1StreamReader.java:329) / beginSequence(ASN1StreamReader.java:912) / readLDAPResponseFrom(LDAPMessage.java:1146) / run(LDAPConnectionReader.java:251)', revision=24950)' )
在 com.unboundid.ldap.sdk.SimpleBindRequest.handleResponse(SimpleBindRequest.java:723)
在 com.unboundid.ldap.sdk.SimpleBindRequest.process(SimpleBindRequest.java:575)
在 com.unboundid.ldap.sdk.LDAPConnection.bind(LDAPConnection.java:2154)
在 com.unboundid.ldap.sdk.LDAPConnection.(LDAPConnection.java:670)
在 com.unboundid.ldap.sdk.LDAPConnection.(LDAPConnection.java:563)
在 LdapsMain1.LdapSoton.connect(LdapSoton.java:39)
在 LdapsMain1.Main.main(Main.java:26)
package mywork.classes;
import java.util.List;
import com.unboundid.ldap.sdk.Filter;
import com.unboundid.ldap.sdk.LDAPConnection;
import com.unboundid.ldap.sdk.LDAPException;
import com.unboundid.ldap.sdk.LDAPSearchException;
import com.unboundid.ldap.sdk.SearchRequest;
import com.unboundid.ldap.sdk.SearchResult;
import com.unboundid.ldap.sdk.SearchResultEntry;
import com.unboundid.ldap.sdk.SearchScope;
public class Ldapcompany_name {
static boolean connect(String username, String password) throws LDAPException
{
String baseDN = "ou=user,dc=company_name,dc=co,dc=uk";
String filter = "(&(cn="+username+")(objectClass=user))";
boolean hasRights = false;
LDAPConnection connection = new LDAPConnection("nlbldap.company_name.co.uk", 389, username+"@company_name.co.uk", password);
List<SearchResultEntry> results = getResults(connection, baseDN, filter);
String msg = "results.size() = " + results.size();
for(SearchResultEntry entry : results)
{
for(String v : entry.getAttributeValues("memberof"))
{
if(v.contains("ISSWA-SIS-Web"))
{
hasRights = true;
}
}
}
return hasRights;
}
private static List<SearchResultEntry> getResults(LDAPConnection connection, String baseDN, String filter) throws LDAPSearchException, LDAPException
{
SearchResult searchResult;
Filter filter2 = Filter.createEqualityFilter("ou", "*");
SearchRequest searchRequest2 = new SearchRequest("dc=company_name,dc=co,dc=uk", SearchScope.SUB, filter,"cn", "mail","memberOf");
if (connection.isConnected())
{
searchResult = connection.search(searchRequest2);
for (SearchResultEntry entry : searchResult.getSearchEntries())
{
String name = entry.getAttributeValue("cn");
Object mail = entry.getAttributeValues("memberOf");
System.out.println(name + " " + mail);
}
return searchResult.getSearchEntries();
}
return null;
}
}
这是堆栈跟踪
Exception in thread "main" LDAPException(resultCode=81 (server down), errorMessage='The connection to server nlbldap.company_name.co.uk:636 was closed while waiting for a response to a bind request SimpleBindRequest(dn='jdoe@company_name.co.uk'): An I/O error occurred while trying to read the response from the server: SocketException(message='Connection reset', trace='read(SocketInputStream.java:186) / read(SocketInputStream.java:140) / fill(BufferedInputStream.java:252) / read(BufferedInputStream.java:271) / read(ASN1StreamReader.java:992) / readType(ASN1StreamReader.java:329) / beginSequence(ASN1StreamReader.java:912) / readLDAPResponseFrom(LDAPMessage.java:1146) / run(LDAPConnectionReader.java:251)', revision=24950)')
at com.unboundid.ldap.sdk.SimpleBindRequest.handleResponse(SimpleBindRequest.java:723)
at com.unboundid.ldap.sdk.SimpleBindRequest.process(SimpleBindRequest.java:575)
at com.unboundid.ldap.sdk.LDAPConnection.bind(LDAPConnection.java:2154)
at com.unboundid.ldap.sdk.LDAPConnection.<init>(LDAPConnection.java:670)
at com.unboundid.ldap.sdk.LDAPConnection.<init>(LDAPConnection.java:563)
at LdapsMain1.LdapSoton.connect(LdapSoton.java:39)
at LdapsMain1.Main.main(Main.java:26)
不知道 LDAP Result code 就很难确定。
但我猜你没有向连接对象提供任何 TLS 参数。
添加以下代码允许函数使用端口 636
SSLUtil sslUtil = new SSLUtil(null, new TrustAllTrustManager());
SSLSocketFactory socketFactory = sslUtil.createSSLSocketFactory();
LDAPConnection connection = new LDAPConnection(socketFactory, "nlbldap.company_name.com", 636);
我正在尝试让应用程序的 LDAP 连接使用安全端口 636 而不是 389。以下代码在端口 389 上工作得很好,但抛出异常,389 被替换为 636。
线程异常"main" LDAPException(resultCode=81 (server down), errorMessage='The connection to server nlbldap.company_name.co.uk:636 was closed while while while a response to a bind request SimpleBindRequest( dn='jdoe@company_name.co.uk'): 尝试从服务器读取响应时发生 I/O 错误:SocketException(message='Connection reset', trace='read(SocketInputStream.java:186) / read(SocketInputStream.java:140) / fill(BufferedInputStream.java:252) / read(BufferedInputStream.java:271) / read(ASN1StreamReader.java:992) / readType(ASN1StreamReader.java:329) / beginSequence(ASN1StreamReader.java:912) / readLDAPResponseFrom(LDAPMessage.java:1146) / run(LDAPConnectionReader.java:251)', revision=24950)' ) 在 com.unboundid.ldap.sdk.SimpleBindRequest.handleResponse(SimpleBindRequest.java:723) 在 com.unboundid.ldap.sdk.SimpleBindRequest.process(SimpleBindRequest.java:575) 在 com.unboundid.ldap.sdk.LDAPConnection.bind(LDAPConnection.java:2154) 在 com.unboundid.ldap.sdk.LDAPConnection.(LDAPConnection.java:670) 在 com.unboundid.ldap.sdk.LDAPConnection.(LDAPConnection.java:563) 在 LdapsMain1.LdapSoton.connect(LdapSoton.java:39) 在 LdapsMain1.Main.main(Main.java:26)
package mywork.classes;
import java.util.List;
import com.unboundid.ldap.sdk.Filter;
import com.unboundid.ldap.sdk.LDAPConnection;
import com.unboundid.ldap.sdk.LDAPException;
import com.unboundid.ldap.sdk.LDAPSearchException;
import com.unboundid.ldap.sdk.SearchRequest;
import com.unboundid.ldap.sdk.SearchResult;
import com.unboundid.ldap.sdk.SearchResultEntry;
import com.unboundid.ldap.sdk.SearchScope;
public class Ldapcompany_name {
static boolean connect(String username, String password) throws LDAPException
{
String baseDN = "ou=user,dc=company_name,dc=co,dc=uk";
String filter = "(&(cn="+username+")(objectClass=user))";
boolean hasRights = false;
LDAPConnection connection = new LDAPConnection("nlbldap.company_name.co.uk", 389, username+"@company_name.co.uk", password);
List<SearchResultEntry> results = getResults(connection, baseDN, filter);
String msg = "results.size() = " + results.size();
for(SearchResultEntry entry : results)
{
for(String v : entry.getAttributeValues("memberof"))
{
if(v.contains("ISSWA-SIS-Web"))
{
hasRights = true;
}
}
}
return hasRights;
}
private static List<SearchResultEntry> getResults(LDAPConnection connection, String baseDN, String filter) throws LDAPSearchException, LDAPException
{
SearchResult searchResult;
Filter filter2 = Filter.createEqualityFilter("ou", "*");
SearchRequest searchRequest2 = new SearchRequest("dc=company_name,dc=co,dc=uk", SearchScope.SUB, filter,"cn", "mail","memberOf");
if (connection.isConnected())
{
searchResult = connection.search(searchRequest2);
for (SearchResultEntry entry : searchResult.getSearchEntries())
{
String name = entry.getAttributeValue("cn");
Object mail = entry.getAttributeValues("memberOf");
System.out.println(name + " " + mail);
}
return searchResult.getSearchEntries();
}
return null;
}
}
这是堆栈跟踪
Exception in thread "main" LDAPException(resultCode=81 (server down), errorMessage='The connection to server nlbldap.company_name.co.uk:636 was closed while waiting for a response to a bind request SimpleBindRequest(dn='jdoe@company_name.co.uk'): An I/O error occurred while trying to read the response from the server: SocketException(message='Connection reset', trace='read(SocketInputStream.java:186) / read(SocketInputStream.java:140) / fill(BufferedInputStream.java:252) / read(BufferedInputStream.java:271) / read(ASN1StreamReader.java:992) / readType(ASN1StreamReader.java:329) / beginSequence(ASN1StreamReader.java:912) / readLDAPResponseFrom(LDAPMessage.java:1146) / run(LDAPConnectionReader.java:251)', revision=24950)')
at com.unboundid.ldap.sdk.SimpleBindRequest.handleResponse(SimpleBindRequest.java:723)
at com.unboundid.ldap.sdk.SimpleBindRequest.process(SimpleBindRequest.java:575)
at com.unboundid.ldap.sdk.LDAPConnection.bind(LDAPConnection.java:2154)
at com.unboundid.ldap.sdk.LDAPConnection.<init>(LDAPConnection.java:670)
at com.unboundid.ldap.sdk.LDAPConnection.<init>(LDAPConnection.java:563)
at LdapsMain1.LdapSoton.connect(LdapSoton.java:39)
at LdapsMain1.Main.main(Main.java:26)
不知道 LDAP Result code 就很难确定。
但我猜你没有向连接对象提供任何 TLS 参数。
添加以下代码允许函数使用端口 636
SSLUtil sslUtil = new SSLUtil(null, new TrustAllTrustManager());
SSLSocketFactory socketFactory = sslUtil.createSSLSocketFactory();
LDAPConnection connection = new LDAPConnection(socketFactory, "nlbldap.company_name.com", 636);