InfoDirectory使用手引書
目次 索引 前ページ次ページ

第5部 保守編> 第14章 トラブル事例

14.7 JNDIに関するトラブル

■事例1

【トラブル現象】

 特殊文字を含むDNの操作で以下のエラーが発生した。

javax.naming.InvalidNameException: o=test#a,c=jp: [LDAP: error code 34 - ILW3_SHf_ldap2HS]; remaining name '"ユーザが指定したDN"'

【原因】

 特定の特殊文字をDNに使用する場合は、エスケープする必要があります。

【対処方法】

 以下の特殊文字をDNに使用する場合は、エスケープしてください。
 “\"、 """、 ","、 "="、 "+"、 "<"、 ">"、 "#"、 ";"
なお、ソースコード中では\は\\と入力する必要があります。

■事例2

【トラブル現象】

 /(スラッシュ)を含むDNの操作で以下のエラーが発生した。

javax.naming.NameNotFoundException: [LDAP: error code 32 - Name Error: No Such Object]; remaining name '"ユーザが指定したDN"'

【原因】

 JNDIではRFC2533で定められている特殊文字のほかに/(スラッシュ)も特殊文字として扱います。

【対処方法】

 \(エスケープシーケンス)を付加してください。なお、ソースコード中では\は\\と入力する必要があります。

■事例3

【トラブル現象】

 InfoDirectoryサーバに接続する際、以下のエラーが発生した。

javax.naming.CommunicationException: [LDAP: error code 2 - ILW3_EDf_GetOption]; remaining name '"ユーザが指定したDN"'

【原因】

 Java2を使用している場合でかつ、JNDIの環境プロパティ"java.naming.referral"を設定していない場合、クライアントからサーバに対しManagerDsaITコントロールが送出されます。InfoDirectoryサーバではサポートされていないコントロールのためクライアントにエラーが返却されました。

【対処方法】

 JNDIの環境プロパティ "java.naming.referral"に"follow"か"throw"を設定してください。

■事例4

【トラブル現象】

 エントリに設定されているバイナリ属性値を取得する際、値が格納されているにも関わらず"[0]"が返される。

【原因】

 JNDIの環境プロパティ "java.naming.ldap.attributes.binary"に、該当するバイナリ属性名が指定されていない可能性があります。このプロパティを指定しない場合、デフォルトでは以下の属性だけが非文字列構文を保持するとみなされます。
photo personalSignature audio jpegPhoto javaSerializedData thumbnailPhoto thumbnailLogo userPassword userCertificate cACertificate authorityRevocationList certificateRevocationList crossCertificatePair x500UniqueIdentifier

【対処方法】

 JNDIの環境プロパティ "java.naming.ldap.attributes.binary"を使用して非文字列構文を保持する属性が指定します。
以下に例を示します。
 env.put("java.naming.ldap.attributes.binary","mpegVideo myspecialkey");
これは、プロバイダに対し、mpegVideo 属性および myspecialkey 属性の値を byte[] として返すことを通知します。

■事例5

【トラブル現象】

 LDAPv3拡張機能であるページングとサーバサイドソートの機能を同時に指定して検索したところ、以下のエラーが表示された。
SearchControl setting failed javax.naming.NamingException [Root exception is com.sun.jndi.ldap.Ber$DecodeException: Encountered ASN.1 tag 2 (expected tag 10)]

【原因】

 ページングとサーバサイドソートを同時に使用することはできません。

【対処方法】

 どちらか1つのコントロールを使用するようにしてください。

■事例6

【トラブル現象】

 InitialDirContextのcreateSubcontextメソッドでエントリ登録時に発生する、オブジェクトクラス関係のエラーの意味が分からない。

【原因】

 エントリ登録時にエラーが発生する場合、以下の原因によってLDAPエラーコードに準拠したメッセージが出力されます。

Exceptionのタイプ

詳細情報

原因

javax.naming.InvalidNameException : DN名:

[LDAP: error code 34 - ILW3_SHf_ldap2HS]

DNの形式に誤りがあります。

javax.naming.directory.SchemaViolationException

[LDAP: error code 65 - Update Error: Object Class Violation]

オブジェクトクラスの必須属性を設定しない場合
オブジェクトクラスに存在しない属性を設定した場合

javax.naming.directory.InvalidNameException

[LDAP: error code 64 - Update Error: Naming Violation]

ネームバインドが設定されていない場合

javax.naming.directory.NamingException

[LDAP: error code 1 - ILW3_EDf_AttrDesc2Type]

存在しないオブジェクトクラスを設定した場合

javax.naming.directory.NoSuchAttributeException:

[LDAP: error code 16 - No Such Attribute]

存在しない属性を設定した場合

javax.naming.directory.InvalidAttributeValueException

[LDAP: error code 21 - ILW3_SHf_ldap2HS]

シンタックスに合わない値を設定した場合

javax.naming.directory.InvalidAttributeValueException

[LDAP: error code 19 - Attribute Error: Constraint Violation]

属性値のサイズが規定値を超える場合

【対処方法】

 表のエラー原因について、オブジェクトクラス/属性の定義、ネームバインドの設定を確認してください。
 オブジェクトクラスの定義については、付録A サポートオブジェクトクラスを参照してください。
 属性の定義については、付録B サポート属性を参照してください。
 ネームバインドの設定については、付録C サポートネームバインドを参照してください。

■事例7

【トラブル現象】

 InitialDirContextのclose()メソッドを使用しているが、ディレクトリサーバにUNBINDが送出されない。

【原因】

 以下の場合、InitialDirContextのclose()メソッドを実行しても即時UNBINDは送出されません。

 この場合、以下のタイミングでコネクションが破棄されるまで、クライアントおよびサーバ間でコネクションが累積します。以下のタイミングでは実際にはUNBINDではなくDISCONNECTが送出されます。

【対処方法】

 コネクションが累積しないようにするために、以下のいずれかの方法で検索結果をクリアし、確実にUNBINDが送出されるようにしてください。

■事例8

【トラブル現象】

 InitialDirContextのmodifyAttributesにおいて、以下のようなエントリに対して、sn属性の値"フジツウ"を"ふじつう"に置換えようとしたところ、属性値"富士通"がなくなってしまった。

 dn: cn=富士通タロウ,o=fujitsu,c=jp
 cn: 富士通タロウ
 sn: 富士通
 sn: フジツウ

【原因】

 複数の属性値の中から一つだけを置換えようとしているが、処理後に残したい値“富士通”を記述していないため。

【対処方法】

 以下のいずれかの方法を参考にしてください。

■事例9

【トラブル現象】

 JNDIでroot DSEの検索ができない。

【原因】

 指定方法を以下に示します。

【対処方法】

検索範囲をOBJECT_SCOPEに設定します。

SearchControls constraints = new SearchControls();
constraints.setSearchScope(SearchControls.OBJECT_SCOPE);

検索開始位置に""を設定します。

NamingEnumeration results
= ctx.search("", "objectClass=*", constraints);

■事例10

【トラブル現象】

 JNDIでチェンジログの検索ができない。

【原因】

 指定方法を以下に示します。

【対処方法】

 管理者権限でアクセスします。以下のJNDIの環境変数プロパティを使用します。

env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, "管理者DN");
env.put(Context.SECURITY_CREDENTIALS, "管理者パスワード");

検索範囲をOBJECT_SCOPEに設定します。

SearchControls constraints = new SearchControls();
constraints.setSearchScope(SearchControls.OBJECT_SCOPE);

検索開始位置に""を設定します。

NamingEnumeration results
= ctx.search("cn=changelog", "objectClass=*", constraints);

■事例11

【トラブル現象】

 JNDIのSSL通信で応答が返ってこない。

【原因】

 ディレクトリサーバが起動していないか、またはディレクトリサーバ、クライントどちらかがSSLの設定になっていない場合があります。

【対処方法】

 InfoDirectoryサーバがSSLで起動しているか確認してください。
 クライント側は、ソースコードにSSL用の環境プロパティが設定されているか、SSL環境ファイルの設定が正しいか確認してください。


目次 索引 前ページ次ページ

All Rights Reserved, Copyright(C) 富士通株式会社 2004