2

LDAP の userCertificate 属性に対して検索フィルターでバイナリ値を使用する方法に精通している人がいるかどうかを調べようとしています。私は古い JNDI API でこれを行う方法を知っていますが、誰かが Netscape Directory SDK (netscape.ldap) でそれを理解するのを手伝ってくれるかどうか知りたいです。

JNDI API の例:

byte[] userCert = Base64.decodeBase64(base64Certificate);
Hashtable<String, String> env = new Hashtable<String, String>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, ldapURL);
env.put(Context.SECURITY_PRINCIPAL, username);
env.put(Context.SECURITY_CREDENTIALS, password);
InitialDirContext context = new InitialDirContext(env);
SearchControls controls = new SearchControls();
controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
controls.setReturningAttributes(fetchArray);
Enumeration<SearchResult> results = context.search(baseDN, "userCertificate={0}", new Object[] {userCert}, controls);

私がやりたいは、次の API を使用することですが、上記のコードでは結果が得られません。

byte[] userCert = Base64.decodeBase64(base64Certificate);
LDAPConnection ld = new LDAPConnection();
ld.connect(ldapURL, ldapPort);

ld.authenticate(username, password);

LDAPSearchResults results = ld.search(baseDN, LDAPConnection.SCOPE_SUB, "(userCertificate;binary=" + base64Certificate + ")",
                fetchArray, false);

;binary 修飾子の有無にかかわらず試し、バイナリ値と base64 値の両方を試しました。ただし、バイト配列を「\ xx」文字列形式に変換するカスタムメソッドを作成するとうまくいきますそれは少しハックに思えますが、おそらく遅いので、このようなバイナリ検索を行う API ネイティブの方法があるかどうか疑問に思っています。

ありがとう。

4

1 に答える 1

2

データ型が 2 進数の 16 進値として表示される属性のフィルターを作成する場合は、まったく別のことです (対応するデータ型は、「オクテット文字列」と呼ばれることがよくあります)。

このようなバイナリ属性をフィルタリングする場合は、比較する必要があるすべてのバイトを 16 進コードで宣言することが必須です。たとえば、値が 0x01AAF5EF の属性「Inventory」を持つオブジェクトを検索する場合、適切なフィルターは次のように読み取る必要があります。

(Inventory=\01\aa\f5\ef)

残念ながら、バイナリ属性を検索する場合、ワイルドカード検索は許可されていません!

詳細については、このリンクを試してください

于 2013-02-03T21:59:41.480 に答える