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 ディレクトリのベース検索を実行できません。