Fehlermeldung Socket Close bei LDAP-Zugriff

  • Themenstarter Themenstarter SteffenJan
  • Beginndatum Beginndatum
S

SteffenJan

Hallo zusammen,

habe das Code-Beispiel http://www.tutorials.de/forum/java/222137-netzwerksache-aus-benutzername-werde-vor-und-nachname.html von Thomas Darimont in mein Projekt mit eingebaut. Es lief auch prima - bis ich irgendetwas geändert habe. Nur weiss ich nicht, welche Änderung die folgende Fehlermeldung hervorruft:

main, handling exception: java.net.SocketException: Software caused connection abort: recv failed
main, SEND TLSv1 ALERT: fatal, description = unexpected_message
main, WRITE: TLSv1 Alert, length = 2
main, Exception sending alert: java.net.SocketException: Software caused connection abort: socket write error
main, called closeSocket()

Beim Debuggen habe ich festgestellt, daß er in folgenden Teil aussteigt:


private static List findUsersByAccountName(String accountName) throws Exception{
List list = new ArrayList();
String snPrefix = accountName.substring(0, 2) + "*";
String givenNamePrefix = accountName.substring(2) + "*";

//Unsere LDAP Abfrage...

String searchFilter = "(&(objectClass=user)(cn=" + accountName + "))";
SearchControls searchControls = new SearchControls();
String[] resultAttributes = { "distinguishedName"};
searchControls.setReturningAttributes(resultAttributes);
searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
NamingEnumeration results = ldapContext.search("DC=***,DC=***t", searchFilter, searchControls);

/* ----> ab der nächsten Zeile kommt beim 2. Durchlauf die Fehlermeldung

while(results.hasMoreElements()){
SearchResult searchResult = (SearchResult)results.nextElement();
list.add(searchResult.toString());
}
return list;
}

Es werden (wahrscheinlich) 2 Ergebnisse gefunden, beim 2. Durchlauf bringt er die Fehlermeldung. Das erste Ergebnis ist korrekt.

Wodurch tritt der Fehler auf?

Viele Grüße
Steffen
 
Hat niemand eine Idee? Oder habe ich zu wenig Informationen gegeben?

Grüße
Steffen
 
Hallo zusammen,

ich komme einfach nicht weiter mit dem Code. Versuche oben genannten Code über die Prozedur AD.init(user,passwort) aufzurufen, aber jedes Mal steigt er mit einer Nullpointer Exception aus. Lege ich dagegen User/Passwort innerhalb der init-Prozedur per User=xxx Passwort=xxx fest, funktioniert das ganze. Woran kann das liegen?

Viele Grüße
Steffen
Code:
package test;

import javax.naming.*;
import javax.naming.directory.*;
import java.util.*;
import java.security.*;

public class AD
{
  

static DirContext ldapContext;
String baseName = ",DC=***,DC=***";
String serverIP = "XXX.XXX.XXX.XXX";

  
 public AD() {
  try {
  Hashtable<String, String> ldapEnv = new Hashtable<String, String>(11);
  ldapEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
  ldapEnv.put(Context.PROVIDER_URL, "ldap://" + serverIP + ":636");
  ldapEnv.put(Context.SECURITY_AUTHENTICATION, "simple");
  ldapEnv.put(Context.SECURITY_PRINCIPAL, "xxx@xxx.xx");
  ldapEnv.put(Context.SECURITY_CREDENTIALS, "xxx");
  ldapEnv.put(Context.SECURITY_PROTOCOL, "ssl");
  ldapEnv.put(Context.REFERRAL, "follow");
  ldapContext = new InitialDirContext(ldapEnv);
  
  }
  catch (Exception e) {
  System.out.println(" bind error: " + e);
  e.printStackTrace();
  System.out.println("*************************************************************************** Init...");
  System.out.println(e.getMessage());
  }
  }
 

 public static List findUsersByAccountName(String accountName) throws Exception{
	List list = new ArrayList();

    String snPrefix = accountName.substring(0, 2) + "*";
    String givenNamePrefix = accountName.substring(2) + "*";

    //Unsere LDAP Abfrage...
    //String searchFilter = "(&(objectClass=user)(sn=" + snPrefix + ")(givenName=" + givenNamePrefix + "))";
    String searchFilter = "(&(objectClass=user)(cn=" + accountName + "))";
    SearchControls searchControls = new SearchControls();
    String[] resultAttributes = { "distinguishedName"};
    searchControls.setReturningAttributes(resultAttributes);
    searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
    
    //while (ldapContext.search("DC=busch,DC=inet", searchFilter,searchControls).hasMoreElements())
    
    NamingEnumeration results = ldapContext.search("DC=xxx,DC=xxx", searchFilter,searchControls);
    SearchResult searchResult= (SearchResult)results.nextElement();
    boolean add = list.add(searchResult.toString());
    /*
	while(results.hasMoreElements()){
		searchResult= (SearchResult)results.nextElement();
			list.add(searchResult.toString());
		}*/
    return list;
  }

  
  
 public void updatePassword(String password, String OU) {
   try {
		String quotedPassword = "\"" + password + "\"";
		char unicodePwd[] = quotedPassword.toCharArray();
		byte pwdArray[] = new byte[unicodePwd.length * 2];
		for (int i=0; i<unicodePwd.length; i++) {
		pwdArray[i*2 + 1] = (byte) (unicodePwd[i] >>> 8);
		pwdArray[i*2 + 0] = (byte) (unicodePwd[i] & 0xff);
  }

  ModificationItem[] mods = new ModificationItem[1];
  mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute("UnicodePwd", pwdArray));
    
  System.out.println("*************************************************************************** Modify...");
  ldapContext.modifyAttributes(OU+baseName, mods);
  ldapContext.close();
    }
    catch (Exception e) {
      System.out.println("update password error: " + e);
    
   System.out.println("*************************************************************************** Update...");
  System.out.println(OU+"***OU************************************************************************");
  System.out.println(password+"PASSWORD********************************************************************");
  
  System.out.println(e.getMessage());
  //System.exit(-1);
  }
  
   }
    
  public static void init(String sUser, String passwort)  throws Exception {

	  AD adc = new AD();
    
  Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
//   the keystore that holds trusted root certificates
  System.setProperty("javax.net.ssl.trustStore", "\\\\ivy\\Zertifikat\\mycerts.jks");
  System.setProperty("javax.net.debug", "all");

  List list = adc.findUsersByAccountName(sUser);
  String OU="";
  for (Iterator iter = list.iterator(); iter.hasNext();) {
    String element = (String) iter.next();
  OU=element.substring(0,element.indexOf(":"));
 }
  //OU=.substring(0,Uname.indexOf(":"));
  try{
	  	if (OU.length()!=0) {adc.updatePassword(passwort,OU);}
  	}
  	catch 
  	(Exception e) 
  	{
	  }
  	AD.ldapContext.close();
  } 
}
 
Zurück