Как обеспечить соединение LDAP через SSL из JNDI - PullRequest
2 голосов
/ 12 августа 2010

Я новичок в LDAP и JNDI.Я настроил сервер LDAP с SSL с использованием OpenDS и клиента, который использует JNDI для доступа к LDAP.

Что я могу сделать, чтобы убедиться, что я действительно общаюсь через SSL с сервером LDAP?Это потому, что я действительно не вижу никакой разницы со стороны клиента, когда пытаюсь получить доступ к LDAP через SSL и без него.

EDITED

Я настроил Сервер LDAP с использованием OpenDS.Каталог состоит только из 1 пользователя.Это DN uid = defaultuser, ou = Пользователь, o = IT, dc = QuizPortal .Порт LDAP = 1389 и Порт SSL = 1636 .Порт по умолчанию 389 и 636 в настоящее время используется некоторыми другими программами.Я также выбрал опцию создать сертификат самоподписания .

Ниже приведен код со стороны Client .В основном это простой запрос атрибутов пользователя.

public static void main(String[] args)
{
    String INITCTX = "com.sun.jndi.ldap.LdapCtxFactory";
    String MY_HOST = "ldap://KhooGP-Comp3:1389";
    String MGR_DN = "cn=Directory Manager";
    String MGR_PW = "password";
    String MY_SEARCHBASE = "ou=User,o=IT,dc=QuizPortal";
    String MY_FILTER = "uid=defaultuser";
    String MY_ATTRS[] = {"cn", "telephoneNumber", "userPassword"};

    //Identify service provider to use
    Hashtable env = new Hashtable();
    env.put(Context.INITIAL_CONTEXT_FACTORY, INITCTX);
    env.put(Context.PROVIDER_URL, MY_HOST);

    env.put(Context.SECURITY_AUTHENTICATION, "simple");
    env.put(Context.SECURITY_PRINCIPAL, MGR_DN);
    env.put(Context.SECURITY_CREDENTIALS, MGR_PW);

    try
    {
        // Create the initial directory context
        InitialDirContext initialContext = new InitialDirContext(env);
        DirContext ctx = (DirContext)initialContext;

        System.out.println("Context Sucessfully Initialized");

        SearchControls constraints = new SearchControls();
        constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);

        NamingEnumeration results = ctx.search(MY_SEARCHBASE, MY_FILTER, constraints);

        while(results != null && results.hasMore())
        {
            SearchResult sr = (SearchResult) results.next();
            String dn = sr.getName() + "," + MY_SEARCHBASE;
            System.out.println("Distinguished Name is " + dn);

            Attributes ar = ctx.getAttributes(dn, MY_ATTRS);

            if(ar == null)
            {
                System.out.println("Entry " + dn);
                System.out.println(" has none of the specified attributes\n");
            }
            else
            {
                for(int i=0; i<MY_ATTRS.length; i++)
                {
                    Attribute attr = ar.get(MY_ATTRS[i]);
                    System.out.println(MY_ATTRS[i] + ":");

                    for(Enumeration vals=attr.getAll(); vals.hasMoreElements();)
                    {
                        System.out.println("\t" + vals.nextElement());
                    }
                }
            }
        }
    }
    catch(Exception e)
    {
        System.err.println(e);
    }
}

Я также выполнил netstat в соответствии с рекомендациями, и существует связь по порту 1636. Значит ли это, что я действительно уже общаюсь по SSL?

1 Ответ

1 голос
/ 12 августа 2010

На стороне сервера вам могут потребоваться аутентифицированные привязки, тогда, если вы НЕ используете SSL, ваше приложение не сможет работать.

Вы можете выполнить пакетную трассировку, чтобы увидеть, являются ли данные открытым текстом или зашифрованы.

Если вы используете LDAP через SSL, вы, скорее всего, используете порт 636.Таким образом, вы могли бы netstat увидеть, к какому порту вы подключились.

Если вы используете TLS, это сложнее, так как вы используете 389, но с StartTLS он запускает открытый текст, а затем преобразуется в шифрование.

Делать это в коде?Не знаю.

...