Zabezpečený přístup k LDAPu pomocí JNDI.

V tomto příspěvku je nastíněno, jak lze pracovat s LDAPem v jazyku java. Protože se často přenáší citlivá data je zde ukázáno, jak se připojit přez ssl.

Předpokládáme, že je na LDAP serveru povolena možnost připojovaní přez protokol LDAPS na portu 636. Navíc klient musí mít ve své keystore uložen certifikát serveru nebo jeho certifikační autority.

To můžeme zajistit následujícím způsobem:

Příklad byl vyzkoušen na serveru OpenDS. Pro ostatní servery to bude podobně.

OpenDS ma keystore umístěnou v podadresáři config. keytool -list -v -keystore config/keystore Zobrazi seznam certifikátu z keystore. Bude požadováno heslo. Pouze odentrujte, žádné heslo tam není. Měl by tam být záznam s Alias name rovno server-cert. To je certifikát, který potřebujeme. Vyexportujeme ho následujícím příkazem keytool -exportcert -alias server-cert -keystore config/keystore -file certificate Poté už zbývá pouze tento certifikát naimportovat do JRE databáze důvěryhodných certifikátů. Ten se nacházi v souboru $JAVA_HOME/jre/lib/security/cacerts keytool -importcert -file certificate -alias OpenDS -keystore $JAVA_HOME/jre/lib/security/cacerts Tento příkaz naimportuje certifikát pod aliasem OpenDS. Defaultní heslo je changeit.

Následující java kód vypíše dn všech záznamů osob v adresářovém serveru.

package eu.bcvsolutions.ldap;

import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.directory.DirContext;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.InitialLdapContext;

public class Test {

    public static void main(String[] args) {

        Hashtable environment = new Hashtable();

        environment.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
   
        environment.put(Context.PROVIDER_URL, "ldap://192.168.33.2:636");
        environment.put(Context.SECURITY_PROTOCOL, "ssl");

        environment.put(Context.SECURITY_AUTHENTICATION, "simple");
   
        environment.put(Context.SECURITY_PRINCIPAL, "cn=Directory Manager");
        environment.put(Context.SECURITY_CREDENTIALS, "heslo");

        try {
            DirContext context = new InitialLdapContext(environment, null);
            NamingEnumeration result = null;
            try {
                SearchControls controls = new SearchControls();
                controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
                result = context.search("dc=example,dc=com", "(objectclass=person)", controls);
                while (result.hasMore()) {
                    SearchResult item = (SearchResult) result.next();
                    System.out.print("Item: ");
                    System.out.println(item.getNameInNamespace());
                }
            } finally {
                if (result != null) {
                    result.close();
                }
                context.close();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}