如何确保通过SSL从JNDI进行LDAP连接

时间:2010-08-12 09:22:47

标签: java ssl ldap jndi

我是LDAP和JNDI的新手。我使用OpenDS设置了一个带SSL的LDAP服务器,并使用JNDI来访问LDAP。

我可以做些什么来确保我真的通过SSL与LDAP服务器进行通信?这是因为当我尝试通过SSL访问LDAP时,我并没有真正看到与客户端有任何区别。

EDITED

我已使用OpenDS设置 LDAP服务器。该目录仅包含1个用户。它的DN是 uid = defaultuser,ou = User,o = IT,dc = QuizPortal LDAP端口= 1389 SSL端口= 1636 。默认端口389&一些其他程序目前正在使用636。我还选择了 生成自签名认证 的选项。

以下是客户端方面的代码。它基本上是对用户属性的简单查询。

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 个答案:

答案 0 :(得分:1)

在服务器端,你可能需要经过身份验证的绑定,然后如果你没有使用SSL,那么你的应用程序就会失败。

您可以对其进行数据包跟踪以查看数据是明文还是加密。

如果您使用的是LDAP over SSL,那么您可能会使用端口636。因此,您可以netstat查看已连接的端口。

如果您使用的是TLS则更难,因为您使用389,但使用StartTLS它会启动明文,然后转换为使用加密。

在代码中执行此操作吗?不知道。