モジュール java.security.jgss
パッケージ org.ietf.jgss

インタフェースGSSContext

既知のすべてのサブインタフェース:
ExtendedGSSContext

public interface GSSContext
このインタフェースは、GSS-APIのセキュリティ・コンテキストをカプセル化し、そのコンテキストで利用できるセキュリティ・サービスを提供します。 セキュリティ・コンテキストは、ローカルに取得した資格を使用してピア間に確立されます。 1組のピア間には、同じ資格または異なる資格を使用する複数のコンテキストが同時に存在する場合があります。 GSS-APIは、ピア間のセキュリティ・コンテキストによって生成されるトークンを転送するときに、配下の転送プロトコルには依存せず、その呼出し側アプリケーションに依存します。

呼出し側がデフォルトのGSSManagerインスタンスを使用してコンテキストをインスタンス化する場合は、Kerberos v5 GSS-APIメカニズムを使用してコンテキストが確立されます。 このメカニズムは、OID「1.2.840.113554.1.2.2」として識別され、RFC 1964に定義されています。

コンテキストの確立処理が開始される前に、確立されるコンテキストの特性を起動側が要求する場合があります。 呼出し側が要求した特性が、配下のメカニズムによってサポートされていないことがあります。 コンテキストが確立すると、呼出し側はさまざまなクエリー・メソッドを使用して、そのコンテキストから提供された実際の特性やサービスを確認できます。 デフォルトのGSSManagerインスタンスから提供されるKerberos v5 GSS-APIメカニズムを使用しているときは、すべてのオプション・サービスをローカルに利用できます。 たとえば、相互認証、資格の委譲、機密性と整合性の保護、メッセージごとのリプレイ検出や順序付けなどを利用できます。 GSS-APIでは、メッセージの機密性を保護するには、メッセージの整合性を保護する必要があります。

コンテキストが確立するまで、起動側によるinitSecContext呼出しと受入れ側によるacceptSecContext呼出しが繰り返されます。このループは、コンテキストが確立すると終了します。 このループの処理中に、initSecContextおよびacceptSecContextメソッドがトークンを生成し、アプリケーションはそのトークンをピアに送信します。 場合によっては、ピアはacceptSecContextまたはinitSecContextに対して適切なトークンを入力として渡します。

コンテキストが完全に確立する前でも、isProtReadyメソッドを呼び出して、wrapおよびgetMICによるメッセージごとの操作にコンテキストを使用できるかどうかを確認できます。 この方法を使えば、完全に確立される前のコンテキストに対してメッセージごとの操作を使用できます。

コンテキストの確立が完了したあと、つまりisProtReadyメソッドからtrueが返されたあとには、確立されたコンテキストの実際の特性やサービスを確認するためにクエリー・ルーチンを呼び出せます。 また、wrapおよびgetMICのメッセージごとのメソッドを使用して、アプリケーションが提供するデータに対して暗号化操作を行うこともできます。

コンテキストが不要になったら、disposeを呼び出して、そのコンテキストが使用しているシステム・リソースをすべて解放する必要があります。

セキュリティ・コンテキストは通常、処理するトークンに関する順序付けとリプレイ検出情報を保持しています。 このため、トークンがこのコンテキストに渡されて処理される順序が重要になります。 また、このインタフェース内のメソッドは同期化されません。 複数のスレッド間でGSSContextを共有するときは、なんらかのアプリケーション・レベルの同期化を行う必要があります。

GSS-APIコンテキストを使用するときのセキュリティ制限は、GSS-APIメカニズム・プロバイダによって異なります。 これらの制限については、各メカニズム・プロバイダのドキュメントを参照してください。 これらのセキュリティ制限をメカニズム層で検査する場合は、アプリケーションに適切な権限が付与されている必要があります。

GSSContextのストリーム・ベースのメソッドは、Java SE 11では非推奨です。 これらのメソッドも(第11項を参照してください。)の次の理由で「RFC 8353: 一般的なセキュリティ・サービスAPIバージョン2: Javaバインディング更新」から削除されました: RFC 5653の5.15項で説明されているように、入力および出力ストリームを使用するGSSContextのオーバーロードされたメソッドは、ライブラリではなくアプリケーションで定義されるワイヤー・プロトコルとして、この更新で削除されます。 また、トークンの自己フレーミング(ここで、終了を判別できません)がない場合、またはライブラリにトークン・フォーマット(たとえば、別のGSSライブラリと通信するブリッジとして)の知識が含まれていない場合にこれらのメソッドを正しく実装することもできません。 これらのメソッドには、initSecContext(InputStream, OutputStream)acceptSecContext(InputStream, OutputStream)wrap(InputStream, OutputStream, MessageProp)unwrap(InputStream, OutputStream, MessageProp)getMIC(InputStream, OutputStream, MessageProp)およびverifyMIC(InputStream, InputStream, MessageProp)があります。

次に示すコード例は、起動側ピアのGSSContextインタフェースの使用法を示しています。 GSSContextオブジェクトに対して、オブジェクトのインスタンス化、指定するフラグの設定、コンテキストの確立、実際のコンテキスト・フラグの照会、アプリケーション・データに対するメッセージごとの操作、コンテキストの最終検出などを行っています。

    // Create a context using default credentials
    // and the implementation specific default mechanism
    GSSManager manager = ...
    GSSName targetName = ...
    GSSContext context = manager.createContext(targetName, null, null,
                                           GSSContext.INDEFINITE_LIFETIME);

    // set desired context options prior to context establishment
    context.requestConf(true);
    context.requestMutualAuth(true);
    context.requestReplayDet(true);
    context.requestSequenceDet(true);

    // establish a context between peers

    byte[] inToken = new byte[0];
    byte[] outToken;

    // Loop while there still is a token to be processed

    while (!context.isEstablished()) {

        outToken = context.initSecContext(inToken, 0, inToken.length);

        // send the output token if generated
        if (outToken != null) {
            sendToken(outToken);
        }

        if (!context.isEstablished()) {
            inToken = readToken();
        }
    }

     // display context information
     System.out.println("Remaining lifetime in seconds = "
                                          + context.getLifetime());
     System.out.println("Context mechanism = " + context.getMech());
     System.out.println("Initiator = " + context.getSrcName());
     System.out.println("Acceptor = " + context.getTargName());

     if (context.getConfState()) {
         System.out.println("Confidentiality (i.e., privacy) is available");
     }

     if (context.getIntegState()) {
         System.out.println("Integrity is available");
     }

     // perform wrap on an application supplied message, appMsg,
     // using QOP = 0, and requesting privacy service
     byte[] appMsg = ...

     MessageProp mProp = new MessageProp(0, true);

     outToken = context.wrap(appMsg, 0, appMsg.length, mProp);

     sendToken(outToken);

     // perform unwrap on an incoming application message, and check
     // its privacy state and supplementary information
     inToken = readToken();

     mProp = new MessageProp(0, true);

     appMsg = context.unwrap(inToken, 0, inToken.length, mProp);

     System.out.println("Was it encrypted? " + mProp.getPrivacy());
     System.out.println("Duplicate Token? " + mProp.isDuplicateToken());
     System.out.println("Old Token? " + mProp.isOldToken());
     System.out.println("Unsequenced Token? " + mProp.isUnseqToken());
     System.out.println("Gap Token? " + mProp.isGapToken());

     // the application determines if the privacy state and supplementary
     // information are acceptable

     // release the local-end of the context
     context.dispose();

 

導入されたバージョン:
1.4