JAAS LoginユーティリティおよびJava GSS-APIを使用したセキュアなメッセージ交換

このチュートリアルでは、2つのサンプル・アプリケーションを使って、Java GSS-APIの使用方法を説明します。このAPIは、アプリケーション間のセキュアなメッセージ交換を可能にします。このチュートリアルで使用するサンプルのクライアント・アプリケーションおよびサーバー・アプリケーションは次の2つです。

ノート:

このチュートリアルでは、ポリシー・ファイルとより複雑なログイン構成ファイルを使用します。プログラムの実行にはセキュリティ・マネージャを使用するので、セキュリティ関連の操作は、必要なアクセス権が明示的に付与されていなければ許可されません。このチュートリアルは、JAAS承認によりユーザー中心のアクセス制御を追加する方法も示します。これは、実行中のコードのみでなく、コードを実行するユーザーに基づいて制御を適用します。

警告:

セキュリティ・マネージャおよびそれに関連するAPIは非推奨であり、今後のリリースでは削除されます。セキュリティ・マネージャの代わりとなるものはありません。詳細および代替手段については、JEP 411を参照してください。

作業を開始する前に: 関連チュートリアルの紹介

このJava GSS-APIチュートリアルは、JAAS認証の最初のステップです。前のチュートリアルでは、JAASを使用してユーザーの認証や承認を行う方法や、JAASに必要なポリシー・ファイルとログイン構成ファイル(使用する基盤となる認証技術を指定する)の内容およびサンプルを示しました。JAAS入門用のチュートリアルである「JAAS認証」および「JAAS承認」では、アプリケーションは、JAASメソッドを直接呼び出しました。「JAAS Loginユーティリティの使用」チュートリアルでは、アプリケーションをこの操作から開放するユーティリティ・プログラムの使用方法を示しました。このチュートリアルのクライアントおよびサーバー・アプリケーションでも同じユーティリティ・プログラムを使用しますので、あらかじめLoginユーティリティのチュートリアルの内容を確認してからこのチュートリアルに進むことをお薦めします。

この一連のチュートリアルでは、Kerberosを認証およびアプリケーションのセキュアな通信をサポートする基幹技術として使用しています。「Kerberos要件」を参照してください。

クライアントおよびサーバー・アプリケーションの概要

このチュートリアルで使用するアプリケーションの名前は、SampleClientおよびSampleServerです。

それぞれ、このチュートリアルで提供するLoginユーティリティを実行して呼び出し、引数として、アプリケーションの名前(SampleClientまたはSampleServer)と、続いてアプリケーションが必要とする引数をそれに渡します。Loginユーティリティは、JAAS LoginContextを使用して、Kerberosを使用するユーザーを認証します。最後に、Loginユーティリティはアプリケーション・クラス(ここではSampleClientまたはSampleServer)のmainメソッドを呼び出して、アプリケーションに引数を渡します。

次に、SampleClientおよびSampleServerアプリケーションの実行方法のサマリーを示します。

  1. 引数にSampleServer、続いてSampleServerプログラム用の引数を指定してLoginユーティリティを実行することにより、SampleServerアプリケーションを実行します。Loginユーティリティにより、SampleServerを実行するプリンシパルのパスワード入力が求められます。(「Kerberosユーザー名およびサービス・プリンシパル名」を参照)。認証完了後に、SampleServerが実行されます。
    1. 引数に注目し、クライアントからの接続を待機するポート番号を確認します。
    2. 指定されたポートでのクライアント接続を待機するServerSocketを作成します。
    3. 接続を待機します。
  2. 引数にSampleClient、続いてSampleClientプログラム用の引数を指定してLoginユーティリティを実行することにより、SampleClientアプリケーションを実行します(通常別のマシンを使用)。Loginユーティリティにより、Kerberos名およびパスワードの入力が求められます。認証完了後に、SampleClientが実行されます。次を実行します
    1. その引数を参照してください。(1) SampleServerを表すKerberosプリンシパルの名前。(Kerberosユーザー名およびサービス・プリンシパル名を参照)、(2) SampleServerを実行中のホスト(マシン)の名前、(3) SampleServerがクライアント接続を待機するポート番号。
    2. 引数として渡されたホストおよびポートを使用して、SampleServerへのソケット接続を試みます。
  3. ソケット接続がSampleServerにより受け入れられます。両方のアプリケーションが、ソケット入力および出力ストリームからのDataInputStreamおよびDataOutputStreamを初期化して、将来のデータ交換に使用します。
  4. SampleClientおよびSampleServerは、それぞれGSSContextをインスタンス化し、以後のセキュアなデータ交換を可能にする共有コンテキストを確立します。
  5. これで、SampleClientおよびSampleServerは、メッセージをセキュアに交換できます。
  6. SampleClientおよびSampleServerは、メッセージ交換の完了後に、クリーンアップ操作を実行します。

ノート:

このチュートリアルで使用するコードの詳細は、Java GSS-APIを使用した、JAASプログラミングなしのセキュアなメッセージ交換チュートリアルのSampleClientおよびSampleServerコードの項を参照してください。

Kerberosユーザー名およびサービス・プリンシパル名

このチュートリアルでは、ベースとなる認証およびセキュアな通信技術としてKerberos V5が使用されているため、ユーザーまたはサービスが要求される場合、常にKerberosスタイルのプリンシパル名が使用されます(プリンシパルを参照)。

たとえば、SampleClientを実行する場合、ユーザー名の指定が求められます。Kerberosスタイルのユーザー名は、Kerberos認証用だけに割り当てられたユーザー名です。ベース・ユーザー名(mjonesなど)、「@」およびレルムの順序で構成されます(例、mjones@KRBNT-OPERATIONS.EXAMPLE.COM)。

通常、SampleServerなどのサーバー・プログラムは、「サービス」を提供し、特定の「サービス・プリンシパル」に代わって実行されるプログラムと見なされます。SampleServerのサービス・プリンシパル名が必要とされるのは、次の場合です。

  • SampleServerの実行時に、適切なサービス・プリンシパルとしてログインする必要があります。このチュートリアルのログイン構成ファイルは、実際にサービス・プリンシパル名を指定します(Krb5LoginModuleのオプションとして)。このため、JAAS認証(Loginユーティリティによって実行される)は、そのサービス・プリンシパルのパスワードの指定のみをユーザーに求めます。適切なパスワードを指定すると、認証に成功し、サービス・プリンシパル名からプリンシパルを含むサブジェクトが作成され、新しいアクセス制御コンテキストがサブジェクトに関連付けられます。その後に実行されるコード(SampleServerコード)は、指定されたプリンシパルに代わって実行されたと見なされます。
  • SampleClientを実行する場合、引数の1つはサービス・プリンシパル名です。これは必須です。このため、SampleClientは適切なサービスを使用してセキュリティ・コンテキストの確立を開始できます。
  • クライアントおよびサーバー・ポリシー・ファイルはそれぞれ、サービス・プリンシパル名と等価な名前および「initiate」や「accept」(セキュリティ・コンテキスト確立の開始または受け入れ)と等価なアクションを保持するServicePermissionを必要とします。

このドキュメント全体を通して、および関連するログイン構成ファイルやポリシー・ファイルでは、service_principal@your_realmは、環境内で使用される実際の名前で置換されるプレースホルダーとして使用されます。サービス・プリンシパル名として、任意の Kerberosプリンシパルを実際に使用できます。このため、このチュートリアルを実行してみる場合、クライアント・ユーザー名とサービス・プリンシパル名の両方に自分のユーザー名を使用できます。

通常、本番稼動環境では、システム管理者は、サーバーを特定のプリンシパルのみで実行し、特定の名前を割り当てて使用します。たいてい、割り当てるKerberos形式のサービス・プリンシパル名は、次のようになります。

service_name/machine_name@realm; 

たとえば、KRBNT-OPERATIONS.EXAMPLE.COMというレルム内の「raven」という名前のマシンでnfsサービスを実行する場合、サービス・プリンシパル名は次のようになります

nfs/raven@KRBNT-OPERATIONS.EXAMPLE.COM

ただし、このようなマルチコンポーネント名は必須ではありません。ユーザー・プリンシパル名のような、シングルコンポーネント名も使用できます。たとえば、インストールによって、レルム内のすべてのftpサーバーで同じftpサービス・プリンシパルftp@realmを使用する場合と、ftpサーバーごとに異なるftpプリンシパルを使用する(たとえば、マシンhost1host2のftpプリンシパルがそれぞれftp/host1@realmftp/host2@realmとなる)場合があります。

プリンシパル名にレルムを指定する必要がある場合

ユーザーまたはサービス・プリンシパル名のレルムがデフォルト・レルムの場合は(Kerberos要件を参照)、Kerberosにログインする際、ユーザー名を求めるプロンプトが表示された時点で、レルムを指定しないことも可能です。このため、たとえばユーザー名がmjones@KRBNT-OPERATIONS.EXAMPLE.COMで、SampleClientを実行する場合、ユーザー名が要求されたら、レルムを省略して単にmjonesと指定できます。名前はKerberosプリンシパル名のコンテキストで解釈され、必要に応じてデフォルトのレルムが付けられます。

GSSManagercreateNameメソッドにより、プリンシパル名がGSSNameに変換される場合にも、レルムの指定を省略できます。たとえば、SampleClientの実行時に、引数の1つにサーバー・サービス・プリンシパル名を指定します。この場合、SampleClientが名前をcreateNameメソッドなどに渡し、このメソッドが必要に応じてデフォルトのレルムを追加するため、名前を指定する際にレルムを省略できます。

プリンシパル名をログイン構成ファイルおよびポリシー・ファイルで使用する場合は、常にレルムを含めて名前を指定することをお薦めします。理由は、これらのファイルのパーサーの動作が実装に依存しないため、プリンシパル名の使用前にデフォルトのレルムが追加される場合と、追加されない場合があるためです。名前にレルムが指定されていない場合、以降のアクションは失敗します。

ログイン構成ファイル

JAASを使用する場合は常に、使用する認証テクノロジをログイン構成ファイルに指定する必要があります。(ログイン構成ファイルの詳細は、付録B: JAASログイン構成ファイルを参照してください。)ログイン構成ファイルに、クライアント側が使用するエントリとサーバー側が使用するエントリの2つが含まれる場合、SampleClientSampleServerの両方で同じログイン構成ファイルを使用できます。

このチュートリアルで使用するログイン構成ファイルcsLogin.confを、次に示します。

SampleClient {
  com.sun.security.auth.module.Krb5LoginModule required;
};

SampleServer {
  com.sun.security.auth.module.Krb5LoginModule required storeKey=true 
    principal="service_principal@your_realm";
};

各エントリの名前は、2つのトップレベル・アプリケーションSampleClientおよびSampleServerのクラス名にそれぞれ一致します。これは、アプリケーション用のJAAS操作を実行するLoginユーティリティに渡される名前でもあることに留意してください。Loginユーティリティがログイン構成ファイル内で検索するエントリ名は、渡されたエントリ名と同じになります。

両方のエントリでは、ユーザー認証の成功のため、OracleのKerberos V5ログイン・モジュールを使用する必要があることが指定されています。Krb5LoginModuleが成功するのは、指定されたエンティティでのKerberos KDCへのログインが成功した場合だけです。SampleClientの場合、ユーザーは名前とパスワードの入力を求められます。SampleServerの場合、このログイン構成ファイルに名前(指定されたプリンシパル)が指定されているため、SampleServerを実行するユーザーには、その名前で指定されたエンティティのパスワードの入力だけが求められます。認証が成功するには、正確なパスワードを指定する必要があります。

SampleServerのエントリstoreKey=trueは、ログイン時に指定されたパスワードから秘密キーを計算すること、およびログインにより作成されたサブジェクトのprivateクレデンシャルに秘密キーを格納することを意味します。このキーは、SampleClientSampleServerとの間でセキュリティ・コンテキストを確立する際、相互認証に利用されます。

Krb5LoginModuleにはprincipalオプションがあり、指定されたプリンシパル(エンティティ/ユーザー)だけが特定のプログラムにログインすることを指定するために使用できます。ここでは、SampleClientエントリにプリンシパルが指定されていない(必要に応じて指定可能)ため、ユーザーはユーザー名およびパスワードの入力を求められます。有効なユーザー名およびパスワードを保持するユーザーならだれでもSampleClientを実行できます。一方、SampleServerは特定のプリンシパルを示します。通常、システム管理者は、サーバーを特定のプリンシパルとしてのみ実行することを好むためです。この場合、SampleServerを実行するユーザーは、プリンシパルのパスワードの入力を求められ、認証が成功するには、正しいパスワードを指定する必要があります。

service_principal@your_realmを、SampleServerを表すサービス・プリンシパルの名前で置き換える必要があります。(「Kerberosユーザー名およびサービス・プリンシパル名」を参照)。

サーバーに秘密キーを含むキータブ・ファイルがある場合、次のJAASログイン・エントリを使用します。

SampleServer {
  com.sun.security.auth.module.Krb5LoginModule required
  principal="service_principal@your_realm"
  storeKey=true useKeyTab=true keyTab=keytab.file.name
  isInitiator=false;
  };

キータブ・ファイルですでにキーを指定しているため、パスワードは要求されません。キータブ・ファイルに複数のサービス・プリンシパルのキーが含まれ、サーバーがこれらすべてのサービス・プリンシパルとして機能するように設計されている場合は、プリンシパル・エントリを次のように設定できます。

  principal=*

Krb5LoginModuleに渡すことができるすべてのオプションの詳細は、Krb5LoginModule Javadoc APIドキュメントを参照してください。

ポリシー・ファイル

SampleClientの実行時に使用されるポリシー・ファイルはclient.policySampleServerの実行時に使用されるポリシー・ファイルはserver.policyです。次の各項では、その内容について説明します。

クライアントのポリシー・ファイル

Loginユーティリティ・クラスに必要なアクセス権

Login.java (LoginおよびMyAction)内のクラスでは、多数のアクセス権が必要です。Loginユーティリティの使用に関するJAAS Loginユーティリティの使用で推奨したように、Login.classおよびMyAction.classファイルを含むJARファイルLogin.jarを作成し、ポリシー・ファイルclient.policyLogin.jar AllPermissionを付与します。

grant codebase "file:./Login.jar" {
   permission java.security.AllPermission;
};
SampleClientに必要なアクセス権

SampleClientコードは、アクセス権の必要な2つのタイプの操作を実行します。次を実行します

  • SampleServerアプリケーションを実行するホスト・マシンとのソケット接続を確立します。
  • SampleServerとのセキュリティ・コンテキストの確立を開始します。

ソケット接続を開くのに必要なアクセス権を、次に示します。

permission java.net.SocketPermission "*", "connect";

"*"は、SampleServerを実行するマシンのホスト名またはIPアドレスで置き換えることができます。

セキュリティ・コンテキストの確立を開始するために必要なアクセス権は、基盤となるメカニズムによって異なります。このチュートリアルでは、基盤となるメカニズムとしてKerberosを使用します。このため、アクセス権javax.security.auth.kerberos.ServicePermissionが2つ必要になります。ServicePermissionには、サービス・プリンシパル名およびアクション(またはアクションのリスト)が必要です。セキュリティ・コンテキストの確立を開始するには、アクション「initiate」を指定して2つのServicePermissionsが必要です。それらの名前は次を指定します。

  • 使用するレルムのチケット交付サービス用のサービス・プリンシパル名。このアクセス権を付与することにより、実質的にはクライアントとしてKerberosを使用できるようになります。
  • SampleServerを表すサービス・プリンシパル名。(「Kerberosユーザー名およびサービス・プリンシパル名」を参照)。このアクセス権を付与することにより、Kerberosを使ってサービスSampleServerと対話できるようになります。

SampleClientを実行する、認証済の特定ユーザーにアクセス権を付与します。このために、SampleClientのコード位置(SampleClient.jar内)、およびユーザー名とユーザー(SampleClientを実行するユーザー)のレルムを示すプリンシパル指示部の両方を指定します。(プリンシパル指示部を含むポリシー・ファイルgrant文の詳細は、JAAS承認プリンシパルベースのポリシー・ファイル文の作成方法を参照してください。)

grant文の基本的な書式を、次に示します。

  grant CodeBase "file:./SampleClient.jar", 
    Principal javax.security.auth.kerberos.KerberosPrincipal 
        "your_user_name@your_realm" {

    permission java.net.SocketPermission "*", "connect";

    permission javax.security.auth.kerberos.ServicePermission
        "krbtgt/your_realm@your_realm", 
        "initiate";

    permission javax.security.auth.kerberos.ServicePermission
        "service_principal@your_realm", 
        "initiate";
};

your_user_name@your_realmには、使用するKerberosユーザー名、「@」およびレルムを指定する必要があります。たとえば、ユーザー名がmjones、レルムがKRBNT-OPERATIONS.EXAMPLE.COMの場合、mjones@KRBNT-OPERATIONS.EXAMPLE.COMを指定します。

また、service_principal@your_realmを、krbtgt/your_realm@your_realm内のレルム、およびサーバーを表すサービス・プリンシパルの名前で置き換える必要があります(サーバーを表すサービス・プリンシパルの名前の詳細は、Kerberosユーザー名およびサービス・プリンシパル名を参照)。前者がkrbtgt/KRBNT-OPERATIONS.EXAMPLE.COM@KRBNT-OPERATIONS.EXAMPLE.COM、後者がsample/raven.example.com@KRBNT-OPERATIONS.EXAMPLE.COM、ユーザー名が前の段落で指定したのと同じである場合を考えます。この場合、grant文は次のようになります


grant CodeBase "file:./SampleClient.jar", 
    Principal javax.security.auth.kerberos.KerberosPrincipal 
        "mjones@KRBNT-OPERATIONS.EXAMPLE.COM" {

    permission java.net.SocketPermission "*", "connect";

    permission javax.security.auth.kerberos.ServicePermission
        "krbtgt/KRBNT-OPERATIONS.EXAMPLE.COM@KRBNT-OPERATIONS.EXAMPLE.COM", 
        "initiate";

    permission javax.security.auth.kerberos.ServicePermission
        "sample/raven.example.com@KRBNT-OPERATIONS.EXAMPLE.COM", 
        "initiate";
};

サーバーのポリシー・ファイル

Loginユーティリティ・クラスに必要なアクセス権

サーバー・ポリシー・ファイル内のLoginクラス用grant文は、クライアント・ポリシー・ファイル内のgrant文とまったく同じです(「Loginユーティリティ・クラスに必要なアクセス権」を参照)。

grant codebase "file:./Login.jar" {
   permission java.security.AllPermission;
};
SampleServerに必要なアクセス権

SampleServerコードは、アクセス権の必要な2つのタイプの操作を実行します。次を実行します

  • ソケット接続の受け入れ。
  • セキュリティ・コンテキストの確立の受け入れ。セキュリティ・コンテキスト確立用の「アクセプタ」として機能します。

ソケット接続の受け入れに必要なアクセス権を、次に示します。


permission java.net.SocketPermission "*", "accept";

"*"は、SampleClientを実行するマシンのホスト名またはIPアドレスで置き換えることができます。

セキュリティ・コンテキストの確立を受け入れるのに必要なアクセス権を、次に示します。

permission javax.security.auth.kerberos.ServicePermission
    "service_principal@your_realm", 
    "accept";

ここで、service_principal@your_realmは、SampleServerを表すサービス・プリンシパルのKerberos名です(Kerberosユーザー名およびサービス・プリンシパル名を参照)。

SampleServerを実行する特定の認証済ユーザー(SampleServerを表すと見なされるサービス・プリンシパル)にアクセス権を付与するため、SampleServerのコード位置(SampleServer.jar内)およびサービス・プリンシパルを表すプリンシパル指示部の両方を指定します。この名前が、sample/raven.example.com@KRBNT-OPERATIONS.EXAMPLE.COMである場合を考えましょう。この場合、grant文は次のようになります

  grant CodeBase "file:./SampleServer.jar" 
    Principal javax.security.auth.kerberos.KerberosPrincipal 
        "sample/raven.example.com@KRBNT-OPERATIONS.EXAMPLE.COM" {

    permission java.net.SocketPermission "*", "accept";

    permission javax.security.auth.kerberos.ServicePermission
        "sample/raven.example.com@KRBNT-OPERATIONS.EXAMPLE.COM", "accept";
};

SampleClientおよびSampleServerプログラムの実行

SampleClientおよびSampleServerプログラムを実行するには、次の操作を行います。

SampleServerの実行準備

SampleServerの実行準備では、次の操作を行います。

  1. 次のファイルを、SampleServerを実行するマシンからアクセス可能なディレクトリにコピーします。
  2. csLogin.confservice_principal@your_realmを、SampleServerを表すサービス・プリンシパルの名前で置き換えます(Kerberosユーザー名およびサービス・プリンシパル名を参照)。
  3. 表示される両方の場所で、server.policyservice_principal@your_realmを、SampleServerを表すサービス・プリンシパルのKerberos名で置き換えてください。これは、ログイン構成ファイルで使用する名前と同じ名前です。
  4. Login.javaSampleServer.javaをコンパイルします。
    javac Login.java SampleServer.java
    

    Login.javaには2つのクラスが含まれるため、Login.javaをコンパイルするとLogin.classおよびMyAction.classが生成されます。

  5. Login.class and MyAction.classを含むLogin.jarという名前のJARファイルを作成します。
    jar -cvf Login.jar Login.class MyAction.class
    
  6. SampleServer.classを含むSampleServer.jarという名前のJARファイルを作成します。
    jar -cvf SampleServer.jar SampleServer.class
    

SampleClientの実行準備

SampleClientの実行準備では、次の操作を行います。

  1. 次のファイルを、SampleClientを実行するマシンからアクセス可能なディレクトリにコピーします。
  2. client.policyの各部を置き換えます。
    • your_user_name@your_realmを、実際のユーザー名およびレルムで置き換えます。
    • krbtgt/your_realm@your_realmyour_realmを、実際のレルムで置き換えます。
    • service_principal@your_realmを、SampleServerを表すサービス・プリンシパルのKerberos名で置き換えます(Kerberosユーザー名およびサービス・プリンシパル名を参照)。
  3. Login.javaSampleClient.javaをコンパイルします。
    javac Login.java SampleClient.java
    
  4. Login.class and MyAction.classを含むLogin.jarという名前のJARファイルを作成します。
    jar -cvf Login.jar Login.class MyAction.class
    
  5. SampleClient.classを含むSampleClient.jarという名前のJARファイルを作成します。
    jar -cvf SampleClient.jar SampleClient.class
    

SampleServerの実行

SampleClientを実行する前に、必ずSampleServerを実行してください。SampleClientSampleServerへのソケット接続を試みるため、SampleServerが稼動していないとソケット接続が受け付けられず、失敗します。

SampleServerを実行する場合、SampleServerを稼動する予定のマシンで実行してください。このマシン名(ホスト名)は、SampleClientの引数として指定します。サービス・プリンシパル名は、ログイン構成ファイルやポリシー・ファイルなど、いくつかの場所に表示されます。

SampleServerの実行用に準備したディレクトリに移動します。次を指定して、Loginクラスを実行します。

  • 適切な-classpath節(Login.jarおよびSampleServer.jar JARファイル内のクラスを検索するため)。
  • -Djava.security.manager。セキュリティ・マネージャのインストールを指定します。

    警告:

    セキュリティ・マネージャおよびそれに関連するAPIは非推奨であり、今後のリリースでは削除されます。セキュリティ・マネージャの代わりとなるものはありません。詳細および代替手段については、JEP 411を参照してください。
  • -Djava.security.krb5.realm=<your_realm> (使用するKerberosレルム)。たとえば、レルムがKRBNT-OPERATIONS.EXAMPLE.COMの場合、-Djava.security.krb5.realm=KRBNT-OPERATIONS.EXAMPLE.COMのように指定します。
  • -Djava.security.krb5.kdc=<your_kdc> (使用するKerberos KDC)。たとえば、KDCがsamplekdc.example.comの場合、-Djava.security.krb5.kdc=samplekdc.example.comのように指定します。
  • -Djava.security.policy=server.policy。使用するポリシー・ファイルとしてserver.policyを指定します。
  • -Djava.security.auth.login.config=csLogin.conf。使用するログイン構成ファイルとしてcsLogin.confを指定します。

ノート:

java.security.auth.login.configシステム・プロパティで、(等号を2つ(==)ではなく)等号を1つ(=)使用している場合、このシステム・プロパティおよびjava.securityファイルの両方で指定された構成が使用されます。

Loginの引数として、アプリケーションの名前(ここではSampleServer)を渡します。次に、アプリケーションに必要なすべての引数を追加します。SampleServerの場合、クライアント接続の待機に使用するポート番号を指定する単一の引数です。通常は使用しない大きなポート番号であれば、どの番号でも選択できます。(例、4444)。

次に、Windows、LinuxおよびmacOSで使用する完全なコマンドを示します。クラス・パス項目の区切りとして、LinuxおよびmacOSではコロンを使用するのに対し、Windowsではセミコロンを使用する点のみが異なります。

ノート:

これらのコマンドの、<port_number>を適切なポート番号に、<your_realm>を使用するKerberosレルムに、<your_kdc>を使用するKerberos KDCにそれぞれ置き換えてください。

次に、Windowsのコマンドを示します。

java -classpath Login.jar;SampleServer.jar 
 -Djava.security.manager 
 -Djava.security.krb5.realm=<your_realm> 
 -Djava.security.krb5.kdc=<your_kdc> 
 -Djava.security.policy=server.policy 
 -Djava.security.auth.login.config=csLogin.conf 
 Login SampleServer <port_number>

次に、LinuxおよびmacOSのコマンドを示します。

java -classpath Login.jar:SampleServer.jar 
 -Djava.security.manager 
 -Djava.security.krb5.realm=<your_realm>
 -Djava.security.krb5.kdc=<your_kdc> 
 -Djava.security.policy=server.policy 
 -Djava.security.auth.login.config=csLogin.conf 
 Login SampleServer <port_number>

コマンド全体を1行で入力してください。ここでは、読みやすくするために複数行に分けて表示してあります。システムに対しコマンドが長すぎる場合は、.batファイル(Windowsの場合)または.shファイル(LinuxおよびmacOSの場合)に記述し、そのファイルを実行して、コマンドを実行する必要がある場合があります。

サービス・プリンシパルのKerberosパスワードの入力が求められます。ログイン構成ファイルで指定された基盤となるKerberos認証メカニズムにより、サービス・プリンシパルのKerberosへのログインが行われます。認証が成功すると、SampleServerのコードがサービス・プリンシパルに代わって実行されます。このコードは、指定されたポート上でソケット接続を待機します。

ログイン時のトラブルシューティングについては、「トラブルシューティング」を参照してください。

SampleClientの実行

SampleClientを実行するため、SampleClientの実行準備を行ったディレクトリに移動します。次に、次を指定して、Loginクラスを実行します。

  • 適切な-classpath節(Login.jarおよびSampleClient.jar JARファイル内のクラスを検索するため)。
  • -Djava.security.manager。セキュリティ・マネージャのインストールを指定します。

    警告:

    セキュリティ・マネージャおよびそれに関連するAPIは非推奨であり、今後のリリースでは削除されます。セキュリティ・マネージャの代わりとなるものはありません。詳細および代替手段については、JEP 411を参照してください。
  • -Djava.security.krb5.realm=<your_realm> (使用するKerberosレルム)。
  • -Djava.security.krb5.kdc=<your_kdc> (使用するKerberos KDC)。
  • -Djava.security.policy=client.policy。使用するポリシー・ファイルとしてclient.policyを指定します。
  • -Djava.security.auth.login.config=csLogin.conf。使用するログイン構成ファイルとしてcsLogin.confを指定します。

Loginに、アプリケーションの名前(SampleClient)、その後SampleClientに必要な引数を渡します。SampleClientの引数は、(1) SampleServerを表すサービス・プリンシパルのKerberos名(Kerberosユーザー名およびサービス・プリンシパル名を参照)、(2) SampleServerを実行するホスト(マシン)の名前、(3) SampleServerがクライアント接続を待機するポート番号です。

次に、Windows、LinuxおよびmacOSで使用する完全なコマンドを示します。

ノート:

重要: これらのコマンドの、<service_principal><host><port_number><your_realm>および<your_kdc>を、適切な値で置き換えてください(ポート番号は、SampleServerの引数として渡したポート番号と同じにする必要があります)。値を引用符で囲む必要はありません。

次に、Windowsのコマンドを示します。

java -classpath Login.jar;SampleClient.jar 
 -Djava.security.manager 
 -Djava.security.krb5.realm=<your_realm> 
 -Djava.security.krb5.kdc=<your_kdc> 
 -Djava.security.policy=client.policy 
 -Djava.security.auth.login.config=csLogin.conf 
 Login SampleClient <service_principal> <host> <port_number>

次に、LinuxおよびmacOSのコマンドを示します。

java -classpath Login.jar:SampleClient.jar 
 -Djava.security.manager 
 -Djava.security.krb5.realm=<your_realm> 
 -Djava.security.krb5.kdc=<your_realm> 
 -Djava.security.policy=client.policy 
 -Djava.security.auth.login.config=csLogin.conf 
 Login SampleClient <service_principal> <host> <port_number>

コマンド全体を1行で入力してください。ここでは、読みやすくするために複数行に分けて表示してあります。SampleServerを実行するコマンドと同様、コマンド・ウィンドウに直接入力するにはコマンドが長すぎる場合、.batファイル(Windowsの場合)または.shファイル(LinuxおよびmacOSの場合)に記述して、そのファイルを実行してください。

入力が求められたら、Kerberosユーザー名およびパスワードを入力します。ログイン構成ファイルで指定された基盤となるKerberos認証メカニズムにより、Kerberosへのログインが行われます。認証が成功すると、SampleClientのコードがユーザーに代わって実行されます。このコードは、SampleServerとのソケット接続を要求します。SampleServerが接続を受け付けると、SampleClientおよびSampleServerにより、このチュートリアルで解説した方法で、共有コンテキストの確立およびメッセージの交換が行われます。

ログイン時のトラブルシューティングについては、「トラブルシューティング」を参照してください。