このチュートリアルでは、2つのサンプル・アプリケーションを使って、Java GSS-APIの使用方法を説明します。 このAPIは、アプリケーション間のセキュアなメッセージ交換を可能にします。 このチュートリアルで使用するサンプルのクライアント・アプリケーションおよびサーバー・アプリケーションは次の2つです。
内容:
SampleServerプログラムの実行この一連のチュートリアルでは、Kerberosを認証およびアプリケーションのセキュアな通信をサポートする基幹技術として使用しています。 Kerberos要件を参照してください。
このチュートリアルで使用するアプリケーションの名前は、SampleClientおよびSampleServerです。
それぞれ、このチュートリアルで提供するLoginユーティリティを実行して呼び出し、引数として、アプリケーションの名前(SampleClientまたはSampleServer)と、続いてアプリケーションが必要とする引数をそれに渡します。 Loginユーティリティは、JAAS LoginContextを使用して、Kerberosを使用するユーザーを認証します。 最後に、Loginユーティリティはアプリケーション・クラス(ここではSampleClientまたはSampleServer)のmainメソッドを呼び出して、アプリケーションに引数を渡します。
次に、SampleClientおよびSampleServerアプリケーションの実行方法のサマリーを示します。
SampleServer」、続いてSampleServerプログラム用の引数を指定してLoginユーティリティを実行することにより、SampleServerアプリケーションを実行します。 Loginユーティリティにより、SampleServerを実行するプリンシパルのパスワード入力が求められます。 (「Kerberosユーザー名およびサービス・プリンシパル名」を参照)。 認証完了後に、SampleServerが実行されます。
SampleClient」、続いてSampleClientプログラム用の引数を指定してLoginユーティリティを実行することにより、SampleClientアプリケーションを実行します(通常別のマシンを使用)。 Loginユーティリティにより、Kerberos名およびパスワードの入力が求められます。 認証完了後に、SampleClientが実行されます。 次のとおりです。
SampleServerを表すKerberosプリンシパルの名前。 (「Kerberosユーザー名およびサービス・プリンシパル名」を参照)、(2) SampleServerを実行中のホスト(マシン)の名前、(3) SampleServerがクライアント接続を待機するポート番号。 SampleServerへのソケット接続を試みます。SampleServerにより受け入れられます。両方のアプリケーションが、ソケット入力および出力ストリームからのDataInputStreamおよびDataOutputStreamを初期化して、将来のデータ交換に使用します。SampleClientおよびSampleServerは、それぞれGSSContextをインスタンス化し、以後のセキュアなデータ交換を可能にする共有コンテキストを確立します。SampleClientおよびSampleServerは、メッセージをセキュアに交換できます。SampleClientおよびSampleServerは、メッセージ交換の完了後に、クリーンアップ操作を実行します。SampleClientおよびSampleServerコード」のセクションで詳しく解説します。
このチュートリアルでは、ベースとなる認証およびセキュアな通信技術としてKerberos V5が使用されているため、ユーザーまたはサービスが要求される場合、常にKerberosスタイルのプリンシパル名が使用されます。
たとえば、SampleClientを実行する場合、ユーザー名の指定が求められます。 Kerberosスタイルのユーザー名は、Kerberos認証用だけに割り当てられたユーザー名です。 このユーザー名は、ベース・ユーザー名(例、「mjones」)、「@」、およびレルムの順序で構成されます(例、「mjones@KRBNT-OPERATIONS.EXAMPLE.COM」)。
通常、SampleServerなどのサーバー・プログラムは、「サービス」を提供し、特定の「サービス・プリンシパル」に代わって実行されるプログラムと見なされます。 SampleServerのサービス・プリンシパル名が必要とされるのは、次の場合です。
SampleServerの実行時に、適切なサービス・プリンシパルとしてログインする必要があります。 このチュートリアルのログイン構成ファイルは、実際にサービス・プリンシパル名を指定します(Krb5LoginModuleのオプションとして)。このため、JAAS認証(Loginユーティリティによって実行される)は、そのサービス・プリンシパルのパスワードの指定のみをユーザーに求めます。 適切なパスワードを指定すると、認証に成功し、サービス・プリンシパル名からプリンシパルを含むサブジェクトが作成され、新しいアクセス制御コンテキストがサブジェクトに関連付けられます。 その後に実行されるコード(SampleServerコード)は、指定されたプリンシパルに代わって実行されたと見なされます。 SampleClientを実行する場合、引数の1つはサービス・プリンシパル名です。 これは必須です。このため、SampleClientは適切なサービスを使用してセキュリティ・コンテキストの確立を開始できます。 このドキュメントおよび付属のログイン構成ファイルやポリシー・ファイルを通じて、
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プリンシパルを使用する(たとえば、マシンhost1、host2のftpプリンシパルがそれぞれftp/host1@realm、ftp/host2@realmとなる)場合があります。
ユーザーまたはサービス・プリンシパル名のレルムがデフォルト・レルムの場合は(「Kerberos要件」を参照)、Kerberosにログインする際、ユーザー名を求めるプロンプトが表示された時点で、必ずしもレルムを指定する必要はありません。 このため、たとえばユーザー名が「mjones@KRBNT-OPERATIONS.EXAMPLE.COM」で、SampleClientを実行する場合、ユーザー名が要求されたら、レルムを省略して「mjones」とだけ入力できます。 名前はKerberosプリンシパル名のコンテキストで解釈され、必要に応じてデフォルトのレルムが付けられます。
GSSManagerのcreateNameメソッドにより、プリンシパル名がGSSNameに変換される場合にも、レルムの指定を省略できます。 たとえば、SampleClientの実行時に、引数の1つにサーバー・サービス・プリンシパル名を指定します。 この場合、SampleClientが名前をcreateNameメソッドなどに渡し、このメソッドが必要に応じてデフォルトのレルムを追加するため、名前を指定する際にレルムを省略できます。
プリンシパル名をログイン構成ファイルおよびポリシー・ファイルで使用する場合は、常にレルムを含めて名前を指定することをお薦めします。理由は、これらのファイルのパーサーの動作が実装に依存しないため、プリンシパル名の使用前にデフォルトのレルムが追加される場合と、追加されない場合があるためです。名前にレルムが指定されていない場合、以降のアクションは失敗します。
JAASを使用する場合は常に、使用する認証テクノロジをログイン構成ファイルに指定する必要があります。 ログイン構成ファイルの詳細は、「JAASログイン構成ファイル」を参照してください。 ログイン構成ファイルに、クライアント側が使用するエントリとサーバー側が使用するエントリの2つが含まれる場合、SampleClientとSampleServerの両方で同じログイン構成ファイルを使用できます。
このチュートリアルで使用するログイン構成ファイル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ユーティリティがログイン構成ファイル内で検索するエントリ名は、渡されたエントリ名と同じになります。
両方のエントリでは、ユーザー認証の成功のため、SunのKerberos V5ログイン・モジュールを使用する必要があることが指定されています。 Krb5LoginModuleが成功するのは、指定されたエンティティでのKerberos KDCへのログインが成功した場合だけです。 SampleClientの場合、ユーザーは名前とパスワードの入力を求められます。 SampleServerの場合、ログイン構成ファイルに名前(指定されたプリンシパル、詳細は後述)が指定されているため、SampleServerを実行するユーザーにはその名前で指定されたエンティティのパスワードの入力だけが求められます。 認証が成功するには、正確なパスワードを指定する必要があります。
SampleServerのエントリstoreKey=trueは、ログイン時に指定されたパスワードから秘密キーを計算すること、およびログインにより作成されたサブジェクトのprivateクレデンシャルに秘密キーを格納することを意味します。 このキーは、SampleClientとSampleServerとの間でセキュリティ・コンテキストを確立する際、相互認証に利用されます。
Krb5LoginModuleにはprincipalオプションがあり、指定されたプリンシパル(エンティティ/ユーザー)だけが特定のプログラムにログインすべきであることを指定するために使用できるます。 ここでは、SampleClientエントリにプリンシパルが指定されていない(必要に応じて指定可能)ため、ユーザーはユーザー名およびパスワードの入力を求められます。有効なユーザー名およびパスワードを保持するユーザーならだれでもSampleClientを実行できます。 一方、SampleServerは特定のプリンシパルを示します。通常、システム管理者は、サーバーを特定のプリンシパルとしてのみ実行することを好むためです。 この場合、SampleServerを実行するユーザーは、プリンシパルのパスワードの入力を求められ、認証が成功するには、正しいパスワードを指定する必要があります。
「service_principal@your_realm」を、SampleServerを表すサービス・プリンシパルの名前で置き換える必要があります。 (「Kerberosユーザー名およびサービス・プリンシパル名」を参照)。
Krb5LoginModuleに引渡し可能なすべてのオプションの詳細は、Krb5LoginModuleドキュメントを参照してください。
SampleClientの実行時に使用されるポリシー・ファイルはclient.policy、SampleServerの実行時に使用されるポリシー・ファイルはserver.policyです。 各ファイルの内容を、以降で説明します。
Login.java (LoginおよびMyAction)内のクラスでは、多数のアクセス権が必要です。 Loginの使用に関する前のチュートリアルで推奨したように、Login.classおよびMyAction.classファイルを含むJARファイルLogin.jarを作成し、ポリシー・ファイルclient.policyでLogin.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つのServicePermissionが必要です。それらの名前は次を指定します。
SampleServerを表すサービス・プリンシパル名。 (「Kerberosユーザー名およびサービス・プリンシパル名」を参照)。 このアクセス権を付与することにより、Kerberosを使ってサービスSampleServerと対話できるようになります。 SampleClientを実行する、認証済の特定ユーザーにアクセス権を付与します。このために、SampleClientのコード位置(SampleClient.jar内)、およびユーザー名とユーザー(SampleClientを実行するユーザー)のレルムを示すプリンシパル指示部の両方を指定します。 プリンシパル指示部を含むポリシー・ファイルgrant文の詳細は、このシリーズの2番目のチュートリアルの「プリンシパルベースのポリシー・ファイル文の作成方法」を参照してください。
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」内のレルムおよびサーバーを表すサービス・プリンシパルの名前で置き換える必要もあります。 前者が「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クラス用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名です。
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の実行準備では、次の操作を行います。
SampleServerを実行するマシンからアクセス可能なディレクトリにコピーします。
csLogin.confの「service_principal@your_realm」を、SampleServerを表すサービス・プリンシパルの名前で置き換えます。server.policyの「service_principal@your_realm」を、SampleServerを表すサービス・プリンシパルのKerberos名で置き換えてください。 これは、ログイン構成ファイルで使用する名前と同じ名前です。 Login.javaとSampleServer.javaをコンパイルします。
javac Login.java SampleServer.java
Login.javaには2つのクラスが含まれるため、Login.javaをコンパイルするとLogin.classおよびMyAction.classが生成されます。
Login.class and MyAction.classを含むLogin.jarという名前のJARファイルを作成します。
jar -cvf Login.jar Login.class MyAction.class
SampleServer.classを含むSampleServer.jarという名前のJARファイルを作成します。
jar -cvf SampleServer.jar SampleServer.class
SampleClientの実行準備SampleClientの実行準備では、次の操作を行います。
SampleClientを実行するマシンからアクセス可能なディレクトリにコピーします。
client.policyの各部を置き換えます。
your_realmを、実際のレルムで置き換えます。SampleServerを表すサービス・プリンシパルのKerberos名で置き換えます。Login.javaとSampleClient.javaをコンパイルします。
javac Login.java SampleClient.java
Login.class and MyAction.classを含むLogin.jarという名前のJARファイルを作成します。
jar -cvf Login.jar Login.class MyAction.class
SampleClient.classを含むSampleClient.jarという名前のJARファイルを作成します。
jar -cvf SampleClient.jar SampleClient.class
SampleServerの実行SampleClientを実行する前に、必ずSampleServerを実行してください。SampleClientはSampleServerへのソケット接続を試みるため、SampleServerが稼動していないとソケット接続が受け付けられず、失敗します。
SampleServerを実行する場合、SampleServerを稼動する予定のマシンで実行してください。 このマシン名(ホスト名)は、SampleClientの引数として指定します。 サービス・プリンシパル名は、ログイン構成ファイルやポリシー・ファイルなど、いくつかの場所に表示されます。
SampleServerの実行用に準備したディレクトリに移動します。 次を指定して、Loginクラスを実行します。
-classpath節(Login.jarおよびSampleServer.jar JARファイル内のクラスを検索するため)。-Djava.security.manager。セキュリティ・マネージャのインストールを指定します。-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を指定します。Loginの引数として、アプリケーションの名前(ここでは「SampleServer」)を渡します。 次に、アプリケーションに必要なすべての引数を追加します。SampleServerの場合、クライアント接続の待機に使用するポート番号を指定する単一の引数です。 通常は使用しない大きなポート番号であれば、どの番号でも選択できます。 (例、4444)。
次に、Microsoft WindowsおよびSolaris、LinuxおよびMac OS Xシステムで使用するすべてのコマンドを示します。 classpath項目の区切りとして、Solaris、LinuxおよびMac OS Xシステムではコロンを使用するのに対し、Microsoft Windowsシステムではセミコロンを使用する点のみが異なります。
重要: これらのコマンドの、<port_number>を適切なポート番号に、<your_realm>を使用するKerberosレルムに、<your_kdc>を使用するKerberos KDCにそれぞれ置き換えてください。
次に、Microsoft 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>
次に、Solaris、LinuxおよびMac OS Xシステムのコマンドを示します。
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ファイル(Microsoft Windowsの場合)または.shファイル(Solaris、LinuxおよびMac OS Xの場合)に記述し、そのファイルを実行して、コマンドを実行する必要がある場合があります。
サービス・プリンシパルのKerberosパスワードの入力が求められます。 ログイン構成ファイルで指定された基盤となるKerberos認証メカニズムにより、サービス・プリンシパルのKerberosへのログインが行われます。 認証が成功すると、SampleServerのコードがサービス・プリンシパルに代わって実行されます。 このコードは、指定されたポート上でソケット接続を待機します。
ログイン時のトラブルシューティングについては、「トラブルシューティング」を参照してください。
SampleClientの実行SampleClientを実行するため、SampleClientの実行準備を行なったディレクトリに移動します。 次に、次を指定して、Loginクラスを実行します。
-classpath節(Login.jarおよびSampleClient.jar JARファイル内のクラスを検索するため)。-Djava.security.manager。セキュリティ・マネージャのインストールを指定します。-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名、(2) SampleServerを実行するホスト(マシン)の名前、(3) SampleServerがクライアント接続を待機するポート番号です。
次に、Microsoft WindowsおよびSolaris、LinuxおよびMac OS Xシステムで使用するすべてのコマンドを示します。
重要: これらのコマンドの<service_principal>、<host>、<port_number>、<your_realm>、および<your_kdc>の位置には、適切な値を指定してください (ポート番号は、SampleServerの引数として渡したポート番号と同じにする)。 値を引用符で囲む必要はありません。
次に、Microsoft 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>
次に、Solaris、LinuxおよびMac OS Xシステムのコマンドを示します。
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>
コマンド全体を1行で入力してください。 ここでは、読みやすくするために複数行に分けて表示してあります。 SampleServerを実行するコマンドと同様、コマンド・ウィンドウに直接入力するにはコマンドが長すぎる場合、.batファイル(Microsoft Windowsの場合)または.shファイル(Solaris、LinuxおよびMac OS Xの場合)に記述して、そのファイルを実行します。
入力が求められたら、Kerberosユーザー名およびパスワードを入力します。 ログイン構成ファイルで指定された基盤となるKerberos認証メカニズムにより、Kerberosへのログインが行われます。 認証が成功すると、SampleClientのコードがユーザーに代わって実行されます。 このコードは、SampleServerとのソケット接続を要求します。 SampleServerが接続を受け付けると、SampleClientおよびSampleServerにより、このチュートリアルで解説した方法で、共有コンテキストの確立およびメッセージの交換が行われます。
ログイン時のトラブルシューティングについては、「トラブルシューティング」を参照してください。