1

ldapsearch を使用して特定の LDAP サーバーで基本レベルのネーミング コンテキストを検索すると、検索は正常に機能します。

$ ldapsearch -h myhealthisp.com -p 10389 -x -s base -b "" namingContexts
# extended LDIF
#
# LDAPv3
# base <> (default) with scope baseObject
# filter: (objectclass=*)
# requesting: namingContexts
#

#
dn:
namingContexts: dc=myhealthisp,dc=com

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1`

ただし、JNDI を使用すると、次の応答が得られます。

No Results for: myhealthisp.com. Problem: [LDAP: error code 32 - No Such Object] null

コードは次のとおりです。

private Attribute getCertFromLdap(SRVRecord srvRec, CertificateInfo certInfo) throws CertLookUpException{
    env.put(DirContext.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
    sc1 = new SearchControls();
    sc1.setSearchScope(SearchControls.ONELEVEL_SCOPE);

try {
        env.put(DirContext.PROVIDER_URL, "ldap://" + targetDomain + ":" + srvRec.getPort());        
        System.out.println("ldap://" + targetDomain + ":" + srvRec.getPort());

        DirContext dc = new InitialDirContext(env);
        NamingEnumeration directoryNE = null;

        System.out.println("Got HERE!");
        directoryNE= dc.search("", "objectClass=*", sc1);

        System.out.println("SC1 :" + sc1);
        while (directoryNE.hasMore()){
                        SearchResult result1 = (SearchResult) directoryNE.next();

            // print DN of entry
            System.out.println("Result.getNameInNamespace: " + result1.getName());
            Attribute foundMail = findMailAttribute(result1.getNameInNamespace()); 

            if(foundMail != null){
                return foundMail;
            }
        }       
        dc.close(); 
} catch (NamingException e) {
    System.out.println("No Results for: " + targetDomain + "\nProblem: " +     e.getLocalizedMessage() + "  " + e.getCause());
} return null;

}

myhealthisp.com のベース ディレクトリを返すことができる唯一の方法は、ディレクトリ名 (dc=myhealthisp,dc=com) をベース ディレクトリ検索フィルターにハード コーディングすることです (コードのベースとなるものについては、こちらを参照してください)。 : http://directory.apache.org/apacheds/manuals/basic-user-guide-1.5.8-SNAPSHOT/html/ch03s03.html#LDAP操作検索)

コードが onctest.org LDAP サーバーを検索すると、それぞれの NamingContext が返されます。

onctest.org サーバーと myhealthisp.com サーバーの両方の Eclipse コンソールへの出力を次に示します。

ldap://onctest.org.:10389
Got HERE!
SC1 :javax.naming.directory.SearchControls@4c408bfc
Result.getNameInNamespace: ou=config
Result.getNameInNamespace: dc=example,dc=com
Result.getNameInNamespace: ou=system
Search Result: cn=dts556: null:null:{mail=mail: dts556@onctest.org,     usercertificate=userCertificate: [B@35e06ba6, objectclass=objectClass: organizationalPerson,     person, inetOrgPerson, top, o=o: onctest, sn=sn: Test Case, cn=cn: dts556}

Service Record: _ldap._tcp.onctEst.org. 86400   IN  SRV 0 0 10389 onctest.org.
ldap://myhealthisp.com.:10389
Got HERE!
No Results for: myhealthisp.com.
Problem: [LDAP: error code 32 - No Such Object]  null
Unable to find certificate at LDAP for: steve.tripp@myhealthisp.com
_ldap._tcp.myhealthisp.com. 3600    IN  SRV 0 0 10389 myhealthisp.com.

以下が問題の原因であると考えられます。

  • JDNI は、OpenLDAProotDSE objectClass ディレクトリのベース検索を実行できません。
4

2 に答える 2

2

通常、匿名バインドには、ルートで LDAP 検索を行う権限がありません。すべてのディレクトリには、匿名バインドとルート検索のための OOTB 権限があります。Apache DS の場合、ネーミング コンテキストの検索は LDAP クエリを介して実行できます。

ldapsearch -h localhost -p 10389 -s base -b "" "(objectclass=*)" 命名コンテキスト

ただし、次のようなサブツリー検索の 1 レベル検索

ldapsearch -h localhost-p 10389 -s one -b "" -D "uid=admin,ou=system" -w secret "(objectclass=*)"

次の結果が得られます: これは、jndi プログラムで実行していることです: typesOnly : false サイズ制限 : 制限なし 時間制限 : 制限なし Deref Aliases : 決して Deref Aliases attributes : : null

最初の ldapsearch コマンドの JNDI コード:

import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;

public class SampleLDAPSearch {

  private Attribute getCertFromLdap() {
      String targetDomain = "localhost";
      String port = "10389";

      Hashtable env = new Hashtable();
      env.put(DirContext.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
      SearchControls sc1 = new SearchControls();
      sc1.setSearchScope(SearchControls.OBJECT_SCOPE);
      sc1.setReturningAttributes(new String[] { "namingContexts" });

      try {
          env.put(DirContext.PROVIDER_URL, "ldap://" + targetDomain + ":" + port);

          System.out.println("ldap://" + targetDomain + ":" + port);

          DirContext dc = new InitialDirContext(env);
          NamingEnumeration directoryNE = null;

          System.out.println("Got HERE!");
          directoryNE = dc.search("", "objectclass=*", sc1);

          System.out.println("SC1 :" + sc1);
          while (directoryNE.hasMore()) {
              SearchResult result1 = (SearchResult) directoryNE.next();

              // print DN of entry
              System.out.println("Result.getNameInNamespace: " + result1.getName());
              Attributes attrs = result1.getAttributes();
              Attribute attr = attrs.get("namingContexts");
              System.out.println(attr);

          }
          dc.close();
      } catch (NamingException e) {
          System.out.println("No Results for: " + targetDomain + "\nProblem: " + e.getLocalizedMessage() + "  "
                  + e.getCause());
      }
      return null;

  }

  public static void main(String[] args) {
      SampleLDAPSearch sls = new SampleLDAPSearch();
      sls.getCertFromLdap();
  }
}
于 2012-11-19T23:14:52.673 に答える
0

検索レベルが ではない場合、ルート DSE は表示されませんbase。さらに、LDAP クライアントはルート DSE に含まれる情報に依存してはなりません。これらの属性はアクセス制御によって保護されている可能性があるためです。RFC4512から:

These attributes are retrievable, subject to access control and other
restrictions, if a client performs a Search operation [RFC4511] with
an empty baseObject, scope of baseObject, the filter
"(objectClass=*)" [RFC4515], and the attributes field listing the
names of the desired attributes.  It is noted that root DSE
attributes are operational and, like other operational attributes,
are not returned in search requests unless requested by name.

検索範囲を に変更しますbase。さらに良いことに、ルート DSE から取得されるオブジェクトに依存するコードを記述しないでください。

こちらもご覧ください

于 2012-11-20T08:29:11.743 に答える