JavaTM Platform
Standard Ed. 6

javax.security.sasl
インタフェース SaslClient


public interface SaslClient

SASL 認証をクライアントとして実行します。

プロトコルライブラリ (LDAP ライブラリなど) は、特定の SASL 機構によって定義された認証を実行するために、このクラスのインスタンスを取得します。SaslClient インスタンスに対するメソッドを呼び出すと、チャレンジが処理され、SaslClient によって実装された SASL 機構に従って応答が作成されます。認証が処理されるときに、SASL クライアントの認証交換の状態が暗号化されます。

次に、LDAP ライブラリがどのように SaslClient を使用するかの例を示します。まず、SaslClient のインスタンスを取得します。

 SaslClient sc = Sasl.createSaslClient(mechanisms,
     authorizationId, protocol, serverName, props, callbackHandler);
これで、クライアントを認証に使用できます。たとえば、LDAP ライブラリは次のようにクライアントを使用できます。
 // Get initial response and send to server
 byte[] response = (sc.hasInitialResponse() ? sc.evaluateChallenge(new byte[0]) :
     null);
 LdapResult res = ldap.sendBindRequest(dn, sc.getName(), response);
 while (!sc.isComplete() && 
     (res.status == SASL_BIND_IN_PROGRESS || res.status == SUCCESS)) {
     response = sc.evaluateChallenge(res.getBytes());
     if (res.status == SUCCESS) {
         // we're done; don't expect to send another BIND
         if (response != null) {
               throw new SaslException(
                   "Protocol error: attempting to send response after completion");
           }
         break;
     }
     res = ldap.sendBindRequest(dn, sc.getName(), response);
 }
 if (sc.isComplete() && res.status == SUCCESS) {
    String qop = (String) sc.getNegotiatedProperty(Sasl.QOP);
    if (qop != null 
        && (qop.equalsIgnoreCase("auth-int") 
            || qop.equalsIgnoreCase("auth-conf"))) {

      // Use SaslClient.wrap() and SaslClient.unwrap() for future
      // communication with server
        ldap.in = new SecureInputStream(sc, ldap.in);
        ldap.out = new SecureOutputStream(sc, ldap.out);
    }
 }
機構に初期応答が含まれている場合、ライブラリは空のチャレンジで evaluateChallenge() を呼び出し、初期応答を取得します。IMAP4 などのプロトコルは、サーバーへの最初の認証コマンドを持つ初期応答が含まれていないため、最初に hasInitialResponse() または evaluateChallenge() を呼び出さないで認証を開始します。サーバーが認証コマンドに応答すると、初期チャレンジが送信されます。クライアントが最初にデータを送信する SASL 機構では、サーバーはデータを含まないチャレンジを発行しておかなければいけません。それによって、空のチャレンジによる evaluateChallenge() への呼び出しがクライアントで行われます。

導入されたバージョン:
1.5
関連項目:
Sasl, SaslClientFactory

メソッドの概要
 void dispose()
          SaslClient が使用しているシステムリソースまたはセキュリティー上重要な情報を破棄します。
 byte[] evaluateChallenge(byte[] challenge)
          チャレンジデータを評価して、応答を作成します。
 String getMechanismName()
          この SASL クライアントの IANA 登録された機構名(CRAM-MD5、GSSAPI など) を返します。
 Object getNegotiatedProperty(String propName)
          ネゴシエートされたプロパティーを取り出します。
 boolean hasInitialResponse()
          この機構にオプションの初期応答が含まれているかどうかを調べます。
 boolean isComplete()
          認証交換が完了したかどうかを判定します。
 byte[] unwrap(byte[] incoming, int offset, int len)
          サーバーから受信したバイト配列をラップ解除します。
 byte[] wrap(byte[] outgoing, int offset, int len)
          サーバーに送信するバイト配列をラップします。
 

メソッドの詳細

getMechanismName

String getMechanismName()
この SASL クライアントの IANA 登録された機構名(CRAM-MD5、GSSAPI など) を返します。

戻り値:
IANA 登録された機構名を表す null 以外の文字列

hasInitialResponse

boolean hasInitialResponse()
この機構にオプションの初期応答が含まれているかどうかを調べます。true の場合、呼び出し側は初期応答を取得するために空の配列で evaluateChallenge() を呼び出す必要があります。

戻り値:
この機構に初期応答が含まれている場合は true

evaluateChallenge

byte[] evaluateChallenge(byte[] challenge)
                         throws SaslException
チャレンジデータを評価して、応答を作成します。認証プロセス時にチャレンジがサーバーから受信された場合は、サーバーに送信する次の適切な応答を準備するために、このメソッドが呼び出されます。

パラメータ:
challenge - サーバーから送信された null 以外のチャレンジ。 チャレンジ配列の長さは 0 の場合もある
戻り値:
サーバーに送信する応答 (null の場合もある)。 チャレンジが「SUCCESS」状態を伴い、 チャレンジにクライアントがその状態を更新するためのデータしか含まれず、 さらにサーバーに送信する応答がない場合に null になる。クライアントがデータを含まない応答を送信する場合、 応答は長さ 0 のバイト配列となる
例外:
SaslException - 応答の処理時またはチャレンジの作成時に エラーが発生した場合

isComplete

boolean isComplete()
認証交換が完了したかどうかを判定します。このメソッドはいつでも呼び出せますが、通常は呼び出し側がサーバーから交換が完了したという通知を受けるまでは呼び出されません (プロトコル固有の方法)。

戻り値:
認証交換が完了した場合は true、そうでない場合は false

unwrap

byte[] unwrap(byte[] incoming,
              int offset,
              int len)
              throws SaslException
サーバーから受信したバイト配列をラップ解除します。このメソッドは、認証交換が完了した (isComplete() が true を返した) あとで、認証交換の保護品質としてネゴシエートされた整合性または機密性が備わっている場合にのみ呼び出されます。 そうでない場合は、IllegalStateException がスローされます。

incoming は、長さを表す最初の 4 つのオクテットフィールドを除く、 RFC 2222 に定義された SASL バッファーの内容です。 offsetlen は、incoming の使用部分を指定します。

パラメータ:
incoming - クライアントから受信した符号化されたバイトを含む null 以外のバイト配列
offset - 使用するバイトの incoming での開始位置
len - 使用する incoming のバイト数
戻り値:
復号化されたバイトを含む null 以外のバイト配列
例外:
SaslException - incoming を正常に ラップ解除できない場合
IllegalStateException - 認証交換が 完了しなかった場合、またはネゴシエートされた保護品質に 整合性も機密性も備わっていない場合

wrap

byte[] wrap(byte[] outgoing,
            int offset,
            int len)
            throws SaslException
サーバーに送信するバイト配列をラップします。このメソッドは、認証交換が完了した (isComplete() が true を返した) あとで、認証交換の保護品質としてネゴシエートされた整合性または機密性が備わっている場合にのみ呼び出されます。 そうでない場合は、IllegalStateException がスローされます。

このメソッドの結果は、長さを表す最初の 4 つのオクテットフィールドを除く、 RFC 2222 に定義された SASL バッファーの内容を構成します。 offsetlen は、outgoing の使用部分を指定します。

パラメータ:
outgoing - 符号化するバイトを含む null 以外のバイト配列
offset - 使用するバイトの outgoing での開始位置
len - 使用する outgoing のバイト数
戻り値:
符号化されたバイトを含む null 以外のバイト配列
例外:
SaslException - outgoing を正常に ラップ解除できない場合
IllegalStateException - 認証交換が 完了しなかった場合、またはネゴシエートされた保護品質に 整合性も機密性も備わっていない場合

getNegotiatedProperty

Object getNegotiatedProperty(String propName)
ネゴシエートされたプロパティーを取り出します。このメソッドは、認証交換が完了した (isComplete() が true を返した) あとでのみ呼び出すことができます。 そうでない場合は、IllegalStateException がスローされます。

パラメータ:
propName - null 以外のプロパティー名
戻り値:
ネゴシエートされたプロパティーの値。null の場合は、プロパティーが ネゴシエートされなかったか、この機構に適用できない
例外:
IllegalStateException - この認証交換が 完了しなかった場合

dispose

void dispose()
             throws SaslException
SaslClient が使用しているシステムリソースまたはセキュリティー上重要な情報を破棄します。このメソッドを呼び出すと、SaslClient インスタンスが無効になります。このメソッドはべき等です。

例外:
SaslException - リソースを破棄しているときに問題が 発生した場合

JavaTM Platform
Standard Ed. 6

バグの報告と機能のリクエスト
さらに詳しい API リファレンスおよび開発者ドキュメントについては、Java SE 開発者用ドキュメントを参照してください。開発者向けの詳細な解説、概念の概要、用語の定義、バグの回避策、およびコード実例が含まれています。

Copyright 2009 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。