第II部: Java SE Security APIを使用したセキュアな通信

ここでは、セキュアな通信を実行するアプリケーションを構築する方法について説明します。Java SE プラットフォームは、アプリケーションがセキュアな通信を実行できるようにする3つの標準API(Java Generic Security Service (GSS)、Java SASL APIおよびJava Secure Socket Extension (JSSE))を提供します。アプリケーションを構築する場合、これらのAPIのうちのどれを使用すべきでしょうか。その答えは、プロトコルまたはサービスの要件、配備インフラストラクチャ、他のセキュリティ・サービスとの統合など、数多くの要因によって異なります。たとえば、LDAPクライアント・ライブラリを構築する場合は、Java SASL APIを使用する必要があります。SASLの使用は、LDAPのプロトコル定義の一部であるためです。別の例として、サービスがSSLをサポートする場合、サービスにアクセスしようとするクライアント・アプリケーションはJSSEを使用する必要があります。

課題3: Java Generic Security Service (GSS) APIの使用

この課題の目標

この課題の目標は、Java GSS APIを使用してセキュアな認証および通信を実行する方法について学習することです。

この課題の内容

Generic Security Service APIは、認証、メッセージの整合性、メッセージの機密性などのさまざまなセキュリティ・サービスにアクセスするための、統一されたCインタフェースを提供します。Java GSS APIは、対応するインタフェースをJavaアプリケーションに提供します。これを使用すると、アプリケーションは認証を実行してピアとのセキュアな通信を確立できます。GSS-APIおよびJava GSS-APIによってアクセスされるもっとも一般的なセキュリティ・サービスの1つは、Kerberosです。

この課題の概要

この課題では、Java GSS APIを使用してセキュアに通信する方法を示すクライアント・サーバー・アプリケーションを扱います。クライアント部分とサーバー部分は、課題1: JAAS APIの使用に示されているように、最初にKerberosに対して認証します。これにより、資格がサブジェクトに格納されます。アプリケーションは、サブジェクトを使用してSubject.callAs内で、(基礎となるGSSメカニズムとしてKerberosを使用して)Java GSS操作を実行するアクションを実行します。Java GSS KerberosメカニズムはcallAsの内部で実行されるため、Kerberos資格証明をサブジェクトから取得し、それらを使用してピアとの認証およびメッセージのセキュアな交換を行います。

実行ステップ

  1. GssServer.javaコードを参照してください。

    このコード・フラグメントは、サービス・プリンシパルがKDCに対して認証した後に実行するアクションを定義します。これによって、課題1: JAAS APIの使用MyActionが置き換えられます。このコードは、最初にGSSManagerのインスタンスを作成し、それを使用して独自の資格証明を取得してGSSContextのインスタンスを作成します。このコンテキストを使用して認証を実行します。認証が完了すると、暗号化された入力をクライアントから受け入れ、確立されたセキュリティ・コンテキストを使用してデータを復号化します。次に、セキュリティ・コンテキストを使用して元の入力と日付を含む応答を暗号化し、クライアントに返信します。

  2. サンプル・コードをコンパイルします。

  3. GssClient.javaコードを参照してください。

    このコードは、クライアント・プリンシパルがKDCに対して認証したあとに実行するアクションを定義します。これによって、課題1: JAAS APIの使用MyActionが置き換えられます。このコードは、最初にGSSManagerのインスタンスを作成し、それを使用して通信対象のサービスのプリンシパル名を取得します。次に、GSSContextのインスタンスを作成し、サービスとの認証を実行します。認証が完了すると、確立されたセキュリティ・コンテキストを使用してメッセージを暗号化し、サーバーに送信します。次に、暗号化されたメッセージをサーバーから読み取り、確立されたセキュリティ・コンテキストを使用して復号化します。

  4. サンプル・コードをコンパイルします。

  5. 新規のウィンドウを起動してサーバーを起動します。

    % java -Djava.security.auth.login.config=jaas-krb5.conf GssServer
  6. クライアント・アプリケーションを実行します。GssClientは、サービス名とそのサービスが実行されているサーバーの名前の2つのパラメータを取ります。たとえば、サービスがマシンj1hol-001上で実行されているhostの場合は、次のように入力します。

    % java -Djava.security.auth.login.config=jaas-krb5.conf GssClient host j1hol-001

    パスワードの入力を求められた場合は、change_itを入力します。

  7. クライアントおよびサーバー・アプリケーションのウィンドウにそれぞれ次の出力が表示されます。

    GssServerを実行した出力の例:

    Authenticated principal: [host/j1hol-001@J1LABS.EXAMPLE.COM]
    Waiting for incoming connections..
    Got connection from client /192.0.2.102
    Context Established!
    Client principal is test@J1LABS.EXAMPLE.COM
    Server principal is host/j1hol-001@J1LABS.EXAMPLE.COM
    Mutual authentication took place!
    Received data "Hello There!" of length 12
    Confidentiality applied: true
    Sending: Hello There! Thu May 06 12:11:15 PDT 2005

    GssClientを実行した出力の例:

    Kerberos password for test: change_it
    Authenticated principal: [test@J1LABS.EXAMPLE.COM]
    Connected to address j1hol-001/192.0.2.102
    Context Established!
    Client principal is test@J1LABS.EXAMPLE.COM
    Server principal is host@j1hol-001
    Mutual authentication took place!
    Sending message: Hello There!
    Will read token of size 93
    Received message: Hello There! Thu May 06 12:11:15 PDT 2005

サマリー

この課題では、Java GSS APIを使用してお互いセキュアに認証および通信を行うクライアント/サーバー・アプリケーションを記述する方法について学習しました。

次のステップ

  1. 課題4: Java SASL APIの使用に進み、Java SASL APIを使用してお互いセキュアに認証および通信を行うクライアント/サーバー・アプリケーションを記述する方法について学習します。

  2. 「例5: シングル・サインオンの配備」に進み、Kerberos環境でシングル・サインオンを行う場合に使用したサンプル・プログラムを構成する方法について学習します。

課題4: Java SASL APIの使用

この課題の目標

この課題の目標は、Java SASL APIを使用してセキュアな認証および通信を実行する方法について学習することです。 

この課題の内容

SASL (Simple Authentication and Security Layer)は、チャレンジ・レスポンス・プロトコルを指定します。このプロトコルでは、1つには認証目的、もう1つには認証後通信を続行するセキュリティ・レイヤーを確立する目的(オプション)で、クライアントとサーバーがデータを交換します。SASLでは異なるメカニズムを使用できます。このようなメカニズムはそれぞれ、交換されるデータと名前を定義するプロファイルによって識別されます。SASLは、LDAPv3やIMAPv4などの接続ベースのプロトコルで使用されます。SASLは、RFC 4422で説明されています。

Java SASL APIは、メカニズムに依存しない方法でSASLを使用するアプリケーション用のAPIを定義します。たとえば、SASLを使用するネットワーク・プロトコルのライブラリを記述する場合、Java SASL APIを使用して、ピアと交換するデータを生成できます。ライブラリが配備されるときに、ライブラリで使用するメカニズムを動的に構成できます。

認証以外に、SASLを使用して認証後に使用されるセキュリティ層とのネゴシエーションを行うことができます。ただし、GSS-APIとは異なり、セキュリティ層のプロパティ(整合性を求めるか機密性を求めるかなど)はネゴシエーション時に決定されます(GSS-APIでは、メッセージごとに機密性をオンまたはオフにできます)。

この課題の概要

この課題では、Java SASL APIを使用してセキュアに通信する方法を示すクライアント・サーバー・アプリケーションを扱います。クライアント部分とサーバー部分は、課題1: JAAS APIの使用を使用して最初にKerberosに対して認証します。これにより、資格がサブジェクトに格納されます。アプリケーションは、サブジェクトを使用してSubject.callAs内で、(基盤となるSASLメカニズムとしてKerberosを使用して)Java SASL API操作を実行するアクションを実行します。SASL/Kerberosメカニズムは、callAsの内部で実行されるため、Kerberos資格証明をサブジェクトから取得し、それらを使用してピアとの認証およびメッセージのセキュアな交換を行います。

この例は、AppConnectionクラスによって実装される単純なプロトコルを使用します。このプロトコルは、認証コマンドおよびデータ・コマンドを交換します。各コマンドは、タイプ(AppConnection.AUTH_CMDなど)、後続のデータの長さおよびデータ自体で構成されています。データが認証または暗号化された/整合性が保護されたアプリケーション・データ用の場合、そのデータはSASLバッファです。それ以外の場合は、プレーンなアプリケーション・データです。

実行ステップ

  1. SaslTestServer.javaサンプル・コードを参照してください。

    このコード・フラグメントは、サービス・プリンシパルがKDCに対して認証した後に実行するアクションを定義します。これによって、課題1: JAAS APIの使用MyActionが置き換えられます。サーバーは、サポートする保護の品質(QOP)を指定し、SaslServerのインスタンスを作成して認証を実行します。SASLのチャレンジ応答プロトコルは、whileループの中で実行されています。そこでサーバーは、チャレンジをクライアントに送信しクライアントからの応答を処理します。認証後、認証されたクライアントのアイデンティティをgetAuthorizedID()メソッドの呼出しによって取得できます。セキュリティ層がネゴシエーションされた場合、サーバーはクライアントとセキュアにデータを交換できます。

  2. サンプル・コードをコンパイルします。

  3. SaslTestClient.javaサンプル・コードを参照してください。

    このコードは、クライアント・プリンシパルがKDCに対して認証したあとに実行するアクションを定義します。これによって、課題1: JAAS APIの使用のMyActionが置き換えられます。プログラムは、必要な保護の品質(この場合は、機密性)を最初に指定し、次に認証に使用するSaslClientのインスタンスを作成します。次に、メカニズムに初期応答があるかどうかをチェックし、ある場合は、空のバイト配列でevaluateChallenge()メソッドを呼び出すことによって応答を取得します。次に、応答をサーバーに送信して認証を開始します。SASLのチャレンジ応答プロトコルは、whileループの中で実行されています。そこでクライアントは、サーバーから取得したチャレンジを評価してチャレンジに対応する応答をサーバーに送信します。認証後、クライアントは、ネゴシエーションされたセキュリティ層を使用してサーバーとの通信に進むことができます。

  4. サンプル・コードをコンパイルします。

  5. 新規のウィンドウを起動してサーバーを起動します。SaslTestServerは、サービス名とそのサービスが実行されているサーバーの名前の2つのパラメータを取ります。たとえば、サービスがマシンj1hol-001上で実行されているhostの場合は、次のように入力します。

    % java -Djava.security.auth.login.config=jaas-krb5.conf SaslTestServer host j1hol-001
  6. クライアント・アプリケーションを実行します。SaslTestClientは、サービス名とそのサービスが実行されているサーバーの名前の2つのパラメータを取ります。たとえば、サービスがマシンj1hol-001上で実行されているhostの場合は、次のように入力します。

    % java -Djava.security.auth.login.config=jaas-krb5.conf SaslTestClient host j1hol-001

    セキュアなパスワードを指定します。

  7. クライアントおよびサーバー・アプリケーションのウィンドウにそれぞれ次の出力が表示されます。

    SaslTestServerを実行した出力の例:

    Authenticated principal: [host/j1hol-001@J1LABS.EXAMPLE.COM]
    Waiting for incoming connections...
    Got connection from client /192.0.2.102
    Client authenticated; authorized client is: test@J1LABS.EXAMPLE.COM
    Negotiated QOP: auth-conf
    Received: Hello There!
    Sending: Hello There! Fri May 07 15:32:37 PDT 2005
    Received data "Hello There!" of length 12

    SaslTestClientを実行した出力の例(passwordは、指定したパスワードに置き換えられます):

    Kerberos password for test: password
    Authenticated principal: [test@J1LABS.EXAMPLE.COM]
    Connected to address j1hol-001/192.0.2.102
    Client authenticated.
    Negotiated QOP: auth-conf
    Sending: Hello There!
    Received: Hello There! Fri May 07 15:32:37 PDT 2005

サマリー

この課題では、Java SASL APIを使用してお互いセキュアに認証および通信を行うクライアント/サーバー・アプリケーションを記述する方法について学習しました。

次のステップ

「例5: シングル・サインオンの配備」に進み、Kerberos環境でシングル・サインオンを行う場合に使用したサンプル・プログラムを構成する方法について学習します。