2010-08-12 54 views
2

我是LDAP和JNDI的新手。我使用OpenDS和使用JNDI访问LDAP的客户端设置了使用SSL的LDAP服务器。如何确保从JNDI通过SSL进行LDAP连接

我能做些什么来确保我真的通过SSL与LDAP服务器进行通信?这是因为当我试图通过SSL访问LDAP时,我没有发现与客户端有什么不同。

EDITED

我已经安装使用OpenDS的该LDAP服务器。该目录只包含1个用户。它的DN是uid = defaultuser,ou = User,o = IT,dc = QuizPortalLDAP端口= 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通信真的了吗?

+0

您能否考虑发布一些您的代码示例?可以帮助别人更好地帮助你。 – geoffc 2010-08-12 14:21:23

回答

1

在服务器端,您可能需要认证绑定,那么如果您不做SSL,那么您的应用将失败。

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

如果您通过SSL使用LDAP,则所有情况都使用端口636。所以你可以用netstat来查看你连接的端口。

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

在代码中执行它?不知道。

+0

您好geoffc,感谢您的回复。根据建议我做了netstat。发现我的编辑部分显示有一个1636的通信。那么这意味着我已经通过SSL进行通信了? – Nivek 2010-08-13 02:29:59

+0

假设您的LDAP服务器仅在1636提供SSL,那么是的,我会很自在地说您正在使用SSL。当然,数据包跟踪将“证明”它超出了疑问的阴影。 – geoffc 2010-08-13 13:39:43