繁体   English   中英

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

[英]How to ensure LDAP connection over SSL from JNDI

我是LDAP和JNDI的新手。 我已经使用OpenDS和SSL设置了使用SSL的LDAP服务器和使用JNDI访问LDAP的客户端。

我该怎么做才能确保我确实通过SSL与LDAP服务器通信? 这是因为当我尝试通过SSL和不通过SSL访问LDAP时,我从客户端看不到任何区别。

EDITED

我已经使用OpenDS设置了LDAP服务器 该目录仅包含1个用户。 它的DN是uid = defaultuser,ou = User,o = IT,dc = QuizPortal LDAP端口= 1389SSL端口= 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进行通信了?

在服务器端,您可能需要经过身份验证的绑定,然后,如果您不执行SSL,则您的应用程序将失败。

您可以对它进行数据包跟踪以查看数据是纯文本还是加密的。

如果使用基于SSL的LDAP,则很可能会使用端口636。 因此,您可以使用netstat来查看连接的端口。

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

用代码做吗? 不知道。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM