Acessando AD

Estou tentando acessar o AD do empresa com o seguinte código( este código eu tirei de um tópico no forum da Sun ):

public static void main( String[] args ) {
		
		char separator = File.pathSeparatorChar;
		Hashtable env = new Hashtable(5, 0.75f);
		String adminName = "uid=trtrt@rtrtrt.com.br,ou=rtrtrt,dc=rtrt,dc=rtrt";
		String password = rtrtrtrttr;;
		String ldapURL = "ldap://rtrtrtrtrt:636";
		DirContext dirContext = null;
		SearchControls searchControls = null;
		String keystore = null;
		Attributes attributes = null;
		//----------------------------------------------------------------------
		
		keystore = "c:\\Sao Vicente\\CertificadoAD\\cacerts";
		System.setProperty("javax.net.ssl.trustStore", keystore);
		
		env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
		// Credenciais de segurança
		env.put(Context.SECURITY_AUTHENTICATION, "SIMPLE");
		env.put(Context.SECURITY_PRINCIPAL, adminName);
		env.put(Context.SECURITY_CREDENTIALS, password);
		// Setando SSL no protocolo
		env.put(Context.SECURITY_PROTOCOL, "ssl");
		// Conexão com o dominio de controle
		env.put(Context.PROVIDER_URL, ldapURL);
		
		try{
			
			// Criando contexto inicial para o diretorio
			dirContext = new InitialLdapContext(env, null);
			// Criando controle de busca
			searchControls = new SearchControls();
			// Especificando atributos de retorno
			String atributosRetorno[] = {"sn", "givenName", "mail"};
			searchControls.setReturningAttributes(atributosRetorno);
			// Especificando o scopo da procura
			searchControls.setSearchScope( SearchControls.SUBTREE_SCOPE );
			// Especificando o filtro de procura LDAP
			String filtroLDAP = "(&(objectClass=user)(mail=*))";
			// Especificando a base para procura
			String baseProcura = "DC=saovicente,DC=corp";
			
			int totalResultados = 0;
			
			// Procurando por objetos usando filtro
			NamingEnumeration resposta = dirContext.search(baseProcura, filtroLDAP, searchControls);
			
			while( resposta.hasMoreElements() ){
				
				SearchResult resultadoProcura = (SearchResult)resposta.next();
				totalResultados++;
				System.out.println( ">>>" + resultadoProcura.getName() );
				
				attributes = resultadoProcura.getAttributes();
				if ( attributes != null ){
					
					try{
						
						System.out.println( "sn" + attributes.get("sn").get() );
						System.out.println( "giveName" + attributes.get("giveName").get() );
						System.out.println( "mail" + attributes.get("mail").get() );
					
					}catch (NullPointerException e) {
						// TODO: handle exception
					}
					
					
				}
				
			}
			System.out.println( "Total" +  totalResultados );
			dirContext.close();
			
		}catch (NamingException e) {
			// TODO: handle exception
			e.printStackTrace();
			//System.out.println( e.getMessage() );
		}
		
		
		
	}

A exception que esta ocorrenco é:


javax.naming.CommunicationException: simple bind failed: saovicente.corp:636 [Root exception is javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake]
	at com.sun.jndi.ldap.LdapClient.authenticate(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.ldap.InitialLdapContext.<init>(Unknown Source)
	at inicio.AcessoAD.main(AcessoAD.java:48)
Caused by: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(Unknown Source)
	at com.sun.net.ssl.internal.ssl.AppOutputStream.write(Unknown Source)
	at java.io.BufferedOutputStream.flushBuffer(Unknown Source)
	at java.io.BufferedOutputStream.flush(Unknown Source)
	at com.sun.jndi.ldap.Connection.writeRequest(Unknown Source)
	at com.sun.jndi.ldap.LdapClient.ldapBind(Unknown Source)
	... 12 more
Caused by: java.io.EOFException: SSL peer shut down incorrectly
	at com.sun.net.ssl.internal.ssl.InputRecord.read(Unknown Source)
	... 20 more

Preciso de ajuda.
Alguém conhece a solução deste problema?

Grato pelo atenção!

Primeiro, o que você quer buscar no AD?
Por que está usando a porta 636(ldaps) para buscar atributos do GlobalCatalog?

Eu preciso buscar no AD login e senha do usuário.

Opa!

E-mail, login e senha do usuário.
São essas três informações.

Uma autenticação você quer fazer então?

Se quiser ler o conteúdo da senha, não é possível.

Segue abaixo um código simples para autenticar um usuário:

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

// Set up environment for creating initial context
Hashtable env = new Hashtable(11);
env.put(Context.SECURITY_AUTHENTICATION,"simple");
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://ipDoServidor:389");

// Authenticate
env.put(Context.SECURITY_PRINCIPAL, "cn=usuario.login,ou=Usuarios,dc=empresa,dc=com,dc=br");
env.put(Context.SECURITY_CREDENTIALS, "senha");

try {
    // Create initial context
	long init = System.currentTimeMillis();
    DirContext ctx = new InitialDirContext(env);
    ctx.close();

    long fim = System.currentTimeMillis();

    System.out.println(">>>>>>>>Autenticou normalmente: " + ((fim - init) / 1000) + " segundos");
}catch(AuthenticationException ex){
	System.out.println(">>>>>>>>Erro de autenticação");
	System.out.println(ex.getMessage());
	ex.printStackTrace();
}catch (NamingException e) {
    System.out.println(">>>>>>>Naming Exception");
	e.printStackTrace();
}catch(Exception e) {
	System.out.println(">>>>>>Outra Exception genérica");
	e.printStackTrace();
}
}[/code]

Ok! Obrigado pela ajuda.

Para buscar atributos do usuário:

[code]
public static void main(String[] args){
try{

		String path = "ou=Usuarios,dc=empresa,dc=com,dc=br";

		NamingEnumeration results = null; 

		Hashtable env = new Hashtable(5, 0.75f);
			env.put(Context.SECURITY_AUTHENTICATION,"simple");
			env.put(Context.SECURITY_PRINCIPAL, "cn=admin,cn=Users,dc=empresa,dc=com,dc=br");
			env.put(Context.SECURITY_CREDENTIALS, "senhaAdmin");
			env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
			env.put(Context.PROVIDER_URL, "ldap://ipDoServidor:389");
			
			DirContext ctx = new InitialDirContext(env);
			SearchControls search = new SearchControls();
			search.setSearchScope(SearchControls.SUBTREE_SCOPE);
			
			results = ctx.search(path, "(&(objectClass=user)(cn=usuario.login))", search);

				
				try {
				   SearchResult searchResult = (SearchResult) results.next();
				   Attributes attributes = searchResult.getAttributes();
				   Attribute attrCN = attributes.get("cn");
				   Attribute attrMail = attributes.get("mail");

				   System.out.print(attrCN.get() + ";");
				   System.out.println(attrMail.get());
				}catch(Exception e) {
					System.out.println(e.getMessage());
					System.out.println(attrCN.get() + ";" + e.getMessage());
					e.printStackTrace();
				}
			ctx.close();
		
	}catch(Exception e){
		System.out.println(e);
	}
}[/code]

É só trocar mail/cn pelos atributos que você quer.

Ok, valeu pela ajuda!
Vou retomar os esforços na segunda, preciso ler os dados dos usuários no AD.
Quanto a senha, vou pensa em alguma alternativa, o fato é que estou desenvolvendo uma aplicação que vai rodar no servidor interno da empresa, e preciso uniformizar o login.

Valeu pela ajuda!