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

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

14.8 SDK(JNDI)に関するトラブル

事例1 特殊文字を含むDN操作でエラーが発生した。

【トラブル現象】
 特殊文字を含むDN操作で以下のエラーが発生した。

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

【原因】
 特定の特殊文字を含むDNを処理する場合、エスケープする必要があります。

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

 

事例2 /(スラッシュ)を含むDN操作でエラーが発生した。

【トラブル現象】
  /(スラッシュ)を含むDNの操作で以下のエラーが発生した。

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

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

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

 

事例3 DSAに接続するとエラーが発生した。

【トラブル現象】
 DSAに接続したとき、以下のエラーが発生した。

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

【原因】
 Java2を使用して、かつ、JNDIの環境プロパティ"java.naming.referral"を設定していない場合、クライアントからDSAに対し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メソッドでエントリ登録時、エラーが発生した。

【トラブル現象】
 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 DSAにアクセスするとLDAPエラーコード(0x33 DSA is Busy)が通知される。

【トラブル現象】
 DSAに対してアクセスするとLDAPエラーコード(0x33 DSA is Busy)が通知されて、接続に失敗する。

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

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

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

事例8 InitialDirContextのmodifyAttributesで、属性値の置換処理が正常に行われない。

【トラブル現象】
 InitialDirContextのmodifyAttributesにおいて、以下のエントリに対して、sn属性の値"フジツウ"を"ふじつう"に置換した場合、属性値"富士通"が削除された。

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

【原因】
 複数の属性値から一つだけを置換する場合、属性の置換後も保持したい“富士通”を記述していないため属性値が削除されています。

【対処方法】
 以下のいずれかの方法で対処してください。

事例9 root DSEの情報が検索できない。

【トラブル現象】
 root DSEの情報が検索できない。

【対処方法】
 検索範囲をOBJECT_SCOPEに設定します。

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

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

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

 

事例10 チェンジログの情報が検索できない。

【トラブル現象】
 チェンジログの情報が検索できない。

【対処方法】
 管理者権限でアクセスします。以下の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 SSLを使用すると正常に動作しない。

【トラブル現象】
 SSLを使用するとDSAから応答が通知されず、正常に動作しない。

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

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

 

事例12 LDAPで認証後、セションがタイムアウトして切断される。

【トラブル現象】
 LDAPで認証後、セションをクローズしない状態で、しばらく通信しない場合、タイムアウトが発生してセションがクローズされます。その後、以前取得していたセションハンドルを使用して、LDAP認証せずにLDAP検索を行うとエラー(CommunicationException)が発生します。

【原因】
 該当セションが無通信状態の場合、デフォルト900秒 (環境変数: INFODIR_IDLETIME)で、DSAはセションを切断します。そのために以前取得したセションハンドルを使用して検索するとエラー(CommunicationException)が発生します。

【対処方法】
 DSAからクライアントへタイムアウトを通知する方法はありませんので、セションが切断されているかどうかはクライアント側で判断する必要があります。
 JNNDIを利用している場合、セションのタイムアウト発生後、次に再接続するときにCommunicationExceptionが発生します。アプリケーション内で、これをcatchするようにし、InitialDirContextを再作成するか、InitialLdapContextクラスのreconnectメソッドを使用して再接続してください。

 また、DSA側では、デフォルトで900秒(環境変数: INFODIR_IDLETIME)で、セションを切断しています。この設定値を大きくする方法もあります。INFODIR_IDLETIMEの値を変更した場合、[管理ツール]の[サーバ管理]-[ネットワークパラメータ]からタイムアウト/DAPのデフォルトも適切な値に設定してください。

 


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

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