サーバ認証の実装に加えて、相互(クライアントおよびサーバ)認証を実装することもできます。クライアント認証によって、コントローラは、承認および検証されたエージェントのみが接続を確立できることを保証できます。以下の手順に、相互認証を実装するためのワークフローの概略を示します。 

はじめに

次のことに注意。

  • 以下のエージェントはクライアント認証をサポートします。
    • Javaエージェント
    • データベースエージェント
    • スタンドアロンマシンエージェント
  • 最初に1つのエージェントでクライアント認証をセットアップして検証することをお勧めします。そのエージェントに対してクライアント認証が機能することを確認した後、追加のエージェントの構成を続行します。 
  • 一部のエージェントに対してはサーバ認証のみ、その他に対してはサーバ認証およびクライアント認証を行う「ハイブリッド」環境では、Glassfish で複数の HTTP リスナーをセットアップおよび構成し、1 つはサーバ認証のみ、もう 1 つはサーバ認証とクライアント認証の両方を行うこともできます。 
  • 以下の手順では、キーストアのデフォルトキーおよびキーストアパスワード(changeit)を使用します。このワークフローを続行する前に、以下をお勧めします。

    1. コントローラSSLと証明書」の「キーストアパスワードの変更」の説明に従って、このデフォルトパスワードを変更します。
    2. これらの手順を実行する場合は新しいパスワードを使用します。
  • 以下の手順でプレーンテキストのパスワードを使用する代わりに、「エージェントの認証情報を暗号化する」の説明に従って、暗号化されたパスワードを指定できます。  

クライアント認証のセットアップ

以下の手順では、クライアントベース認証をセットアップするためのワークフローの概略を示します。これらの手順は、以下のセクションで詳細に説明されています。

  1. コントローラ:サーバー認証をセットアップします。  
  2. エージェント:サーバー認証をセットアップします。
  3. コントローラ:クライアントキーストアをセットアップします。
  4. エージェント:
    1. コントローラからエージェントにクライアントキーストアをコピーします。
    2. エージェントを構成してキーストアにアクセスします。 
  5. コントローラ:クライアント認証をサポートするようにアプリケーションサーバーを構成します。

コントローラでのサーバー認証のセットアップ

  1. コントローラホストで CLI ウィンドウを開き、cd<controller-keystore-home> ディレクトリの <controller-home>/appserver/glassfish/domains/domain1/config に移動します。
  2. 信頼できるルート証明書ストアを作成して、コントローラの公開鍵を保持します。次のコマンドは、公開鍵(s1as)をエクスポートし、それを新しい証明書ストアファイル server.cer に保存します。 

    <java-home>/bin/keytool -export -alias s1as -file server.cer \
                                 -keystore keystore.jks 
                                 -storepass changeit 
    BASH
  3. オプションkeystore.jks の公開鍵および秘密鍵に関する情報を表示するには、以下のコマンドを入力します。

    <java-home>/bin/keytool -list -v -alias s1as  \
                            -keystore ./keystore.jks \
                            -storepass  changeit
    BASH
  4. コントローラの公開鍵を server.cer からエージェントキーストアにインポートします。以下のコマンドは新しいキーストア(agent-truststore.jks)を作成します。SSL 接続が確立されると、コントローラはこのキーストアからエージェントに公開鍵を送信します。

    <java-home>/bin/keytool -import -v -alias controller_alias -file server.cer \
                            -keystore agent_truststore.jks \
                            -storepass changeit
    BASH
  5. このコマンドは、証明書を表示して信頼するかどうかを確認します。yes と応答します。 

エージェントでのサーバー認証のセットアップ

承認されたエージェントごとに以下を行ってください。

  1. コントローラからエージェントのルートディレクトリ(<machine-agent-home> <java-agent-home> 、または <database-agent-home>)に agent_truststore.jks ファイルをコピーします。 
  2. 承認されたエージェントごとに、<agent-home>/conf/controller-info.xml ファイルの以下のプロパティを次のように指定します。
    • <controller-ssl-enabled>true</controller-ssl-enabled>
    • <controller-port>443</controller-port>
    • <controller-keystore-filename>agent_truststore.jks</controller-keystore-filename>
    • <controller-keystore-password>changeit</controller-keystore-password>

コントローラでのクライアントキーストアのセットアップ

この手順では、署名された証明書を作成してクライアントキーストアにインポートします。以下の手順ではコントローラを使用して証明書に署名しますが、サードパーティ証明機関(CA)を使用することもできます。

  1. オプション)コントローラキーストア内の公開鍵および秘密鍵に関する情報を表示するには、以下のコマンドを入力します。

    <java-home>/bin/keytool -list -v -alias s1as  \
                            -keystore ./keystore.jks \
                            -storepass changeit
    BASH
  2. コントローラの公開鍵/秘密鍵ペアを含むキーストア(clientkeystore.jks)を作成します。<controller-keystore-home> で、次のコマンドを実行します。

    <java-home>/bin/keytool -genkey -alias client-alias -keyalg RSA \
                            -keystore clientkeystore.jks \
                            -storepass changeit \
                            -keypass changeit  
    BASH

    キーツールは、キーを生成するために必要な名前、組織、およびその他の情報を要求します。
    AppDynamicsのアプリエージェントは、デフォルトキーストアファクトリアルゴリズムとしてSunX509を使用します。環境内のキーストアがSunX509以外を使用している場合は、アプリエージェントにアルゴリズムを指定する必要があります。そのために、システムプロパティ appdynamics.agent.ssl.keymanager.factory.algorithm を使用できます。たとえば、アルゴリズムをPKIXに設定するには、エージェントでモニターリングされるJVMの起動コマンドに以下を追加します。

    -Dappdynamics.agent.ssl.keymanager.factory.algorithm=PKIX
    BASH
  3. 証明機関(CA)が署名できる証明書署名リクエスト(client.csr)を生成します。 

    <java-home>/bin/keytool -certreq -v -alias client-alias -file client.csr \
                            -keystore clientkeystore.jks \
                            -storepass changeit \
                            -keypass changeit 
    BASH
  4. 信頼できる CA が署名したリクエスト(client.csr)を取得します。
    以下のコマンドはコントローラを CA として使用し、コントローラが署名した証明書が含まれた新しいファイル(signedClient.cer)を作成します。

    <java-home>/bin/keytool -gencert -infile ./client.csr -outfile signedClient.cer -alias s1as \
                            -keystore ./keystore.jks \
                            -storepass changeit \
                            -keypass changeit 
    BASH
  5. オプション)署名した証明書に関する情報を表示するには、以下のコマンドを入力します。

    <java-home>/bin/keytool -printcert -v -file ./signedClient.cer      
    BASH
  6. 信頼できる証明機関が実際に証明書に署名していることを確認します。これを行う方法は 2 つあります。
          • 署名した機関の公開鍵を信頼できるルートセットにコピーします。
          • 署名した機関の公開鍵をクライアントキーストアにインポートします。

    以下のコマンドは後者を実行するもので、コントローラの公開鍵を server.cer から clientkeystore.jks にインポートします。

    <java-home>/bin/keytool -import -v -alias controller_alias -file server.cer \
                            -keystore clientkeystore.jks \
                            -storepass changeit
    BASH

    このコマンドは証明書を信頼するかどうかを確認します。「yes」を入力すると、メッセージが出力されます。

             Certificate was added to keystore
             [Storing clientkeystore.jks]
  7. オプションclientkeystore.jks の内容を表示するには、次のコマンドを入力します。

    <java-home>/bin/keytool -list -v -keystore clientkeystore.jks -storepass changeit
    BASH

    キーストアには、controller-alias および client-alias(これらはまだ署名されていません)のエントリが表示されます。

  8. 署名された公開鍵証明書をクライアントキーストアにインポートします。次のコマンドは signedClient.cerclientkeystore.jks にインポートします。 

    <java-home>/bin/keytool -importcert -v -alias client-alias -file ./signedClient.cer \
                            -keystore clientkeystore.jks \
                            -storepass changeit \
                            -keypass changeit
    BASH

    これで、コントローラの認証を検証する署名付き証明書によってパスワード保護された clientkeystore.jks ファイルがコントローラ上にあります。 

  9. コントローラ上の信頼できるルート証明書に署名認証局の公開鍵が含まれていることを確認します。この手順では、コントローラを認証局として使用しているため、公開鍵はすでに含まれています。これを確認するには、次のコマンドを実行します。署名認証局の公開鍵がエージェントの公開鍵証明書に含まれるようになりました。

    <java-home>/bin/keytool -list -v -alias client-alias \
                            -keystore clientkeystore.jks -storepass changeit
    BASH

コントローラでクライアントキーストアにアクセスするためのエージェントの構成

承認されたエージェントごとに以下を行ってください。

  1. コントローラからエージェントの以下のディレクトリに clientkeystore.jks ファイルをコピーします。
    • データベースエージェントの場合:<database agent home>/conf
    • Java エージェントの場合:<java-agent-home>/conf
    • マシンエージェントの場合:<machine-agent-home>
  2. <agent-home>/conf/controller-info.xml ファイルで以下のプロパティを次のように指定します。
    • <use-ssl-client-auth>true</use-ssl-client-auth>
    • <asymmetric-keystore-filename>clientkeystore.jks</asymmetric-keystore-filename>
    • <asymmetric-keystore-password>changeit</asymmetric-keystore-password>
    • <asymmetric-key-password>changeit</asymmetric-key-password>
    • <asymmetric-key-alias>client-alias</asymmetric-key-alias>

コントローラでのクライアント認証の有効化

コントローラで以下を行ってください。

  1. 現在実行中ではない場合はコントローラを起動します。
  2. CLI ウィンドウを開き、cd<controller-home>/appserver/glassfish/bin に移動します。 
  3. 以下のコマンドを入力して、AppServer 管理ツールを起動します。./asadmin
    asadmin プロンプトが表示されます。asadmin>
  4. 以下のコマンドを入力します。list-http-listeners
    これによって、使用可能な一連の HTTP リスナーが一覧表示されます。次に例を示します。
            http-listener-1
        http-listener-2
        admin-listener
  5. 以下のコマンドを実行して、これらのリスナーの1つを構成します。この例では、http-listener-2 を構成しています。

    set configs.config.server-config.network-config.protocols.protocol.http-listener-2.ssl.key-store=keystore.jks
    set configs.config.server-config.network-config.protocols.protocol.http-listener-2.ssl.client-auth-enabled=true
    set configs.config.server-config.network-config.protocols.protocol.http-listener-2.ssl.trust-store=cacerts.jks
    CODE
  6. プロパティが正しく設定されたことを確認するために、以下のコマンドを実行します。この例でも、http-listener-2 を前提とします。 

     get configs.config.server-config.network-config.protocols.protocol.http-listener-2.*
    CODE
  7. コントローラを再起動します。