2010-08-12 82 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