コントローラには事前構成されたHTTPSポート(デフォルトではポート8181)があり、自己署名証明書で保護されています。このページでは、デフォルトの証明書を独自のカスタム証明書に置き換える方法について説明します。

コントローラのSSLと証明書について

実稼働環境での使用においては、AppDynamics は自己署名証明書をサードパーティの CA または独自の内部 CA により署名された証明書に置き換えることを強く推奨します。.NET エージェントをデプロイしている場合は、自己署名証明書では .NET エージェントが動作しないため、自己署名証明書を CA による署名済み証明書に置き換える必要があります。 

コントローラ SSL 証明書

コントローラのSSL証明書はEnterprise Console UIのConfigurationsで管理できます。Appserver Configurations および Reports Service Configurations のページには、どちらも SSL 証明書の情報が表示されるセクションがあり、Edit Certificate というオプションを利用できます。

コントローラキーストアおよびアーティファクト

このページでは、デフォルトのキーストア内の既存の鍵を置き換える方法について説明します。デフォルトのキーストアから既存のアーティファクトを初めてエクスポートし、それを独自のキーストアにインポートする場合を除いては、キーストアの内容をすべて置き換えることは推奨されません。 

デフォルトのコントローラキーストアには、次のアーティファクトが含まれています。

  • glassfish-instance:Glassfish アプリケーションサーバに提供する自己署名された秘密鍵。
  • s1as:Glassfish アプリケーションサーバとともに提供される自己署名済み秘密鍵。コントローラはこの鍵を使用してポート 8181 で安全な通信を行う。
  • reporting-instance:スケジュールされた報告を有効にする、レポートサービスで使用する秘密鍵。 

キーストアのパスワードの更新

キーストアアーティファクトの生成に使用される keystore.jks および cacert.jks ファイルのパスワードを変更できます。両方のファイルのパスワードは同じである必要があります。

ただし、キーストアアーティファクト reporting-instance によって生成され、レポーティングサービスによって使用される reporting-service.pfx ファイルのパスワードを変更することはできません。

キーストアの表示方法

キーツールユーティリティを使用してキーストアの内容を確認することができます。これを行うには、<controller_home>/jre/bin ディレクトリから次のコマンドを実行します。プロンプトが表示されたら、デフォルトのキーストアパスワードである changeit を入力してください。 

keytool -list -v -keystore /home/ec2-user/appDplatform/product/controller/appserver/glassfish/domains/domain1/config/keystore.jks 

セキュリティを実装する正確な手順は、通常、組織のセキュリティポリシーにより異なります。たとえば、組織のドメインに使用するワイルドカード証明書など、使用する証明書が組織にすでに存在する場合は、既存の証明書をコントローラキーストアにインポートできます。それ以外の場合は、証明書署名リクエストで新しく生成する必要があります。次のセクションでは、これらのシナリオについて説明します。 

はじめに

以下で、コントローラのインストールにバンドルされるJavaキーツールユーティリティを使用したSSLの構成方法について説明します。キーツールユーティリティは次の場所にあります。

  • <controller_home>/jre/bin

この手順では、キーツールがオペレーティングシステムのパス変数にあることを想定しています。このコマンドを実行するには、まずシステムパスにキーツールユーティリティを置く必要があります。オペレーティングシステムに適した方法でキーツールをパスに追加してください。

このトピックのディレクトリパスにはスラッシュを使用していますが、この手順はLinuxおよびWindowsオペレーティングシステムの環境に適用されます。オペレーティングシステム間でのコマンドの使用方法に違いがある場合は、注意書きがあります。 

証明書の作成とCSRの生成

コントローラに使用する証明書がない場合は、次の手順で作成します。 

AppDynamics では、任意のファイルタイプで機能する X.509 デジタル証明書を使用する必要があります。

この手順では、コントローラのアクティブなキーストア内に新しい証明書が生成され、すぐに有効となります。

この手順はステージング環境で使用するためのものであり、コントローラをシャットダウンして再起動する必要があります。また、ここで説明するように、コントローラのアクティブなキーストアではなく一時的なキーストアにキーを生成することもできます。証明書の署名を受けた後で、キーを一時的なキーストアからコントローラのキーストアにインポートすることができます。

  1. コマンドプロンプトで、以下の場所にディレクトリを変更します。

    <controller_home>/appserver/glassfish/domains/domain1/config
    CODE
  2. キーストアファイルのバックアップを作成します。たとえば、Linuxの場合は以下を実行します。

    cp keystore.jks keystore.jks.backup
    CODE

    Windowsの場合、同様の方法でコピーコマンドを使用します。  

  3. コントローラがまだ実行中の場合は停止します。
  4. キーストアからエイリアスs1asを持つ既存の証明書を削除します。

    keytool -delete -alias s1as -keystore keystore.jks
    CODE
  5. 次のコマンドを使用してキーストアに新しい鍵ペアを作成します。このコマンドは、有効期間が 1825 日(5 年)の鍵ペアを作成します。必要に応じて、1825 を使用環境に適した有効期間に置き換えてください。  

    keytool -genkeypair -alias s1as -keyalg RSA -keystore keystore.jks -keysize 2048 -validity 1825
    CODE

    画面の指示に従い証明書を構成します。注:

    • 姓名には、コントローラが実行しているドメイン名を入力します。(例:controller.example.com)
    • この鍵のデフォルトパスワードchangeitを入力します。

    これにより、キーストアに自己署名証明書が生成されます。次に証明書の署名リクエストを生成します。これにより、コントローラを再起動して引き続き使用することができます。一時的な自己署名証明書がまだ存在しているため、コントローラ UI に接続しようとするブラウザは、証明書を検証できなかったという影響に対する警告を受け取ります。

    キーストアと証明書のデフォルトパスワードを変更する方法については、「キーストアパスワードの変更」を参照してください。

  6. 作成した証明書の証明書署名リクエストを次のように生成します。

    keytool -certreq -alias s1as -keystore keystore.jks -file AppDynamics.csr
    CODE
  7. コマンド(この例ではAppDynamics.csr)で生成された証明書署名リクエストファイルを、選択した認証局に提出します。
    準備ができ次第、CAは署名済み証明書とトラストチェーンに必要なルート証明書および中間証明書を発行します。認証局からの返信には、必要に応じて証明書をインポートするための特別な指示が含まれている場合があります。証明書がCAからテキスト形式で提供される場合は、その内容をコピーしてテキストファイルに貼り付けます。
  8. 署名済み証明書をインポートします。

    keytool -import -trustcacerts -alias s1as -file mycert.cer -keystore keystore.jks
    CODE

    このコマンドは、証明書が次の名前のファイルにあることを前提としています。 mycert.cer.

  9. 「Failed to establish chain from reply(返信からチェーンを確立できません)」というエラーが表示された場合は、発行元の認証ルートと中間証明書をキーストアにインストールします。ルートCAチェーンは、証明書のCA署名の有効性を確立します。ほとんどの一般的なルートCAチェーンはバンドルされたJVMのトラストストアに含まれていますが、プライベートCAに属する証明書などは、追加でルート証明書のインポートが必要になる場合があります。インポートを行うには以下を実行します。

    keytool -import -alias [Any_alias] -file <path_to_root_or_intermediate_cert> -keystore <controller_home>/appserver/glassfish/domains/domain1/config/cacerts.jks
    CODE

証明書チェーンのインポートが完了したら、署名済み証明書のインポートを再度試行してください。

既存の鍵のペアのキーストアへのインポート

ここでは、既存の公開鍵と秘密鍵をコントローラキーストアにインポートする方法について説明します。既存の公開鍵と秘密鍵をJavaキーストアと互換性のある形式、たとえばDER形式からPKCS#12に変換する必要があると仮定してこのシナリオを進めます。OpenSSL を使用して公開鍵と秘密鍵を結合し、次にキーツールを使用して結合キーをコントローラのキーストアにインポートする必要があります。

ほとんどのLinuxディストリビューションにはOpenSSLが付属しています。Windows を使用している場合、または Linux ディストリビューションに OpenSSL が付属していない場合は、OpenSSL の Web サイトから詳細情報を入手してください。

以下のファイルがあることが前提となります。

  • 秘密鍵:private.key
  • 署名済み公開鍵:cert.crt
  • CA rootチェーン:ca.crt

次の手順で使用する秘密鍵は、プレーンテキスト形式である必要があります。また、次の手順を実行する場合は、パスワードを PKCS12 キーストア形式に変換する際に、秘密鍵にパスワードを関連付けないようにしてください。関連付けた場合、次の手順を説明どおりに完了できますが、コントローラを起動する際に例外が発生し、エラーメッセージ「java.security.UnrecoverableKeyException: Cannot recover key」が表示されます。

既存の鍵ペアをコントローラキーストアにインポートするには
  1. OpenSSLを使用して、既存の秘密鍵と公開鍵を互換性のあるJavaキーストアに結合します。

    openssl pkcs12 -inkey private.key -in cert.crt -export -out keystore.p12
    CODE
  2. コントローラが実行中の場合は停止します。
  3. キーストアディレクトリに変更します。

    cd <controller_home>/appserver/glassfish/domains/domain1/config/
    CODE
  4. キーストアファイルのバックアップを作成します。たとえば、Linuxの場合は以下を実行します。

    cp keystore.jks keystore.jks.backup
    CODE

    Windowsの場合、同様の方法でコピーコマンドを使用します。

  5. デフォルトのキーストアから、エイリアスs1asを持つ自己署名証明書を削除します。

    keytool -delete -alias s1as -keystore keystore.jks
    CODE
  6. PKCS #12キーをデフォルトのキーストアにインポートします。

    keytool -importkeystore -srckeystore keystore.p12 -srcstoretype pkcs12 -destkeystore keystore.jks -deststoretype JKS
    CODE
  7. インポートした鍵ペアのエイリアス名を更新します。

    エイリアス名は s1as にする必要があります。この名前から変更しないでください。

    keytool -changealias -alias "1" -destalias "s1as" -keystore keystore.jks
    CODE
  8. インポートした秘密鍵のパスワードを変更します。

    keytool -keypasswd -keystore keystore.jks -alias s1as -keypass <.p12_file_password> -new <password>
    CODE

    変更した場合、新しい秘密鍵のパスワードにデフォルト(changeit)の設定を使用するか、「キーストアパスワードの変更」の説明に従ってマスターパスワードを設定します。

  9. 「Failed to establish chain from reply(返信からチェーンを確立できません)」というエラーが表示された場合は、発行元の認証ルートと中間証明書をキーストアにインストールします。ルートCAチェーンは、証明書のCA署名の有効性を確立します。ほとんどの一般的なルートCAチェーンはcacerts.jksトラストストアに含まれますが、追加でルート証明書のインポートが必要になる場合があります。インポートを行うには以下を実行します。

    keytool -import -alias <Any_alias> -file <path_to_root_or_intermediate_cert> -keystore <controller_home>/appserver/glassfish/domains/domain1/config/cacerts.jks
    CODE

    完了したら署名済み証明書のインポートを再試行します。

  10. コントローラを起動します。 

SSL使用の確認

構成が正常に動作していることを確認するには、ブラウザを使用してデフォルトのセキュアポートであるポート8181を介してコントローラに接続します。

https://<controller_host>:8181/controller
CODE

コントローラのエントリページがブラウザに正しくロードされていることを確認します。また、ブラウザが安全な接続を確立していることも確認してください。ほとんどのブラウザでは、URLの横のロックアイコンが安全な接続であることを示しています。

コントローラの証明書を変更したら、証明書の公開鍵をエージェントトラストストアにインポートする必要があります。この方法については、エージェントの種類別に用意されているトピックを参照してください。

プロキシが構成されておらず、エージェントがコントローラ自体の管理下にある場合は、以下の変更も必要になります。

  1. 次のコマンドを実行します。

    platform-admin.sh stop-controller-appserver
    CODE

    Windows の場合は、管理者特権でのコマンドプロンプトから次のコマンドを実行します(Windows のスタートメニューでコマンド プロンプト アイコンを右クリックし、Run as administrator を選択)。

    platform-admin.exe cli stop-controller-appserver
  2. <controller_home>/appserver/glassfish/domains/domain1/config/domain.xml内で以下のプロパティを検索し、そのポートをSSLポートに置き換えます(非セキュアなポートは無効であるため)。

    設定内容を保持するには、Enterprise ConsoleのController Settingsページでdomain.xmlの構成を編集する必要があります。詳細については、プラットフォーム構成の更新を参照してください。

    -Dappdynamics.controller.port=
    -Dappdynamics.controller.services.port=
  3. 次のプロパティで、プロトコルをHTTPからHTTPSに変更し、ポートをセキュアポートに変更します。

    -Dappdynamics.controller.ui.deeplink.url=

    REST APIを使用してディープリンクのURLを更新することもできます。

    curl -k --basic --user root@system --header "Content-Type: application/json" --data '
    { "controllerURL": "https://<controller>:<ssl_port>" }' https://<controller>:<ssl_port>/controller/rest/accounts/<ACCOUNT-NAME>/update-controller-url
  4. 次のJVM引数を前述のJVM引数の前後に追加して、内部エージェントがSSLで接続するようにします。

    -Dappdynamics.controller.ssl.enabled=true
  5. 次のコマンドを実行します。

    platform-admin.sh start-controller-appserver
    CODE

    Windowsの場合は、管理者特権のコマンドプロンプトで以下のコマンドを実行します。

    platform-admin.exe cli start-controller-appserver

この変更作業は modifyJVMOptions.sh スクリプトを利用して行うこともできます。

キーストアパスワードの変更

コントローラが使用するキーストアのデフォルトのパスワードは、changeit です。これは Glassfish キーストアのデフォルトのパスワードであり、良く知られている(つまり安全でない)パスワードです。安全にインストールするには、このパスワードを変更する必要があります。

この方法でパスワードを変更しても、Glassfish 管理コンソールへのアクセスに使用する管理パスワードには影響しません。このパスワードの変更について詳しくは、「ルートユーザと Glassfish 管理者のパスワードの更新」を参照してください。

パスワードを変更するには、(キーツールユーティリティではなく)Glassfish管理ツールを使用する必要があります。Glassfish管理ツールを使用すると、Glassfishインスタンスが実行時にキーにアクセスできます。

keytool を使用してキーストアのパスワードを直接変更すると、コントローラの起動時に以下のエラーメッセージが出力されます。

Caused by: java.lang.IllegalStateException: Keystore was tampered with,
or password was incorrect
CODE

このケースが発生した場合は、asadmin ユーティリティを使用してパスワードを変更します。

Glassfishのパスワードを変更するには
  1. コントローラを停止します。
  2. Glassfishのマスターパスワードを変更します。

    <controller_home>/appserver/glassfish/bin/asadmin change-master-password --savemasterpassword=true
    CODE

asadmin を使用してマスターパスワードを変更すると、domain-password、cacerts.jks、および keystore.jks ストアのパスワードが変更されます(keystore.jks の s1as、reporting-instance、および glassfish-instance の秘密キーを含む)。

ただし、追加のキーまたは既存のキーのパスワードをカスタマイズしていて、マスターパスワードと一致しない場合、マスターパスワードを変更すると次のエラーが生成されます。

./asadmin change-master-password --savemasterpassword=true
Enter the new master password&gt; 
Enter the new master password again&gt; 
Caught an Exception: {0}
Command change-master-password executed successfully.
CODE

これは、keystore.jks のストアパスワードがマスターパスワードに設定されていますが、1 つ以上の秘密キーに異なるキーパスワードがまだあり、マスターパスワードと一致しないことを示しています。これにより、コントローラ アプリケーションの起動が妨げられ、次のエラーが生成されます。

java.lang.Error: java.security.UnrecoverableKeyException: Cannot recover key

  1. この問題を解決するには、次の  keytool コマンドを入力して、keystore.jks の各秘密キーのパスワード(s1as、reporting-instance、および glassfish-instance)を更新して、マスターパスワードと一致させます。

    keytool コマンドを実行する前に、<JRE_HOME>、<alias_name>、および <controller_home> の変数を自分の情報に置き換えます。

    <JRE_HOME>/bin/keytool -keypasswd -alias <alias_name> -keystore <controller_home>/appserver/glassfish/domains/domain1/config/keystore.jks -storepass <master_password>
  2. <alias_name> のデフォルト値が s1as、reporting-instance、および glassfish-instance であることを確認するために、次のコマンドを実行して keystore.jks の内容を一覧表示します。

    keytool コマンドを実行する前に、<JRE_HOME>、<alias_name>、および <controller_home> の変数を自分の情報に置き換えます。

    <JRE_HOME>/bin/keytool -list -keystore <controller_home>/appserver/glassfish/domains/domain1/config/keystore.jks -storepass <master_password>

    キーパスワードがマスターパスワードと一致する場合、新しいキーパスワードを入力すると "Passwords must differ*"* というメッセージが表示されます。これにより、キーパスワードが正しく設定されていることが検証されます。

  3. コントローラを再起動し、エラーが発生していないことを確認します。

期限切れ証明書の更新

期限切れまたは期限の近づいた証明書を更新する手順は、「証明書の作成と CSR の生成」で説明するデフォルトの証明書を置き換える手順と似ています。期限切れの証明書を更新するには、次の手順を実行します。

  1. 既存のキーストアをバックアップします。
  2. コマンドプロンプトで、以下の場所にディレクトリを変更します。

    <controller_home>/appserver/glassfish/domains/domain1/config
    CODE
  3. キーストアファイルのバックアップを作成します。 

    1. Linux では、次のコマンドを実行できます。

      cp keystore.jks keystore.jks.backup
      CODE
    2. Windowsの場合、同様の方法でコピーコマンドを使用します。  

      コントローラが実行中の場合は停止します。 

  4. すでに Java キーストアがあるため、次のコマンドを実行して証明書署名リクエストを発行します。このキーストアは、csrnot create a new one に使用する必要があります。このキーストアに新しい証明書をインポートします。 

    keytool -certreq -alias s1as -keystore keystore.jks -file AppDynamics.csr
    CODE
  5. 上記例のコマンドで生成された証明書署名リクエストファイル(Appdynamics.csr)を、選択した認証局に提出します。

    1. 準備ができ次第、認証局は署名済み証明書とトラストチェーンに必要なルート証明書および中間証明書を発行します。 
    2. 認証局からの返信には、必要に応じて証明書をインポートするための指示が含まれている場合があります。 

    証明書が認証局からテキスト形式で提供される場合は、その内容をコピーしてテキストファイルに貼り付けます。 

  6. 取得した証明書がテキスト形式でない場合は、次のようにリストできます。

    keytool -printcert -v -file <your obtained certificate> 
    CODE
  7. 取得した署名済み証明書を既存のキーストアにインポートします。 

    keytool -import -alias s1as -file <your obtained certificate> -keystore keystore.jks
    CODE
    1. 以前の証明書と同じエイリアスを使用すると、インポートした証明書が古い証明書に置き換わります。 

    2. 認証局のルート証明書と中間証明書も期限切れになることがあります。その場合は、「Failed to establish chain from reply」というメッセージが表示されます。 

  8. 認証局のルート証明書と中間証明書が期限切れになった場合は、cacerts.jks にもインポートして信頼チェーンを確立できるようにする必要があります。認証局の指示に従って、ルート証明書と中間証明書をダウンロードできます。 

    1. これらの証明書を cacerts.jks にインポートするときは、いずれも以前と同じエイリアスを保持します。

    keytool -import -alias <previous alias used for the certificate> -file <path_to_root_or_intermediate_cert> -keystore <controller_home>/appserver/glassfish/domains/domain1/config/cacerts.jks
    CODE

信頼ストアとキーストア

  • Java 信頼ストアである cacerts には、既知の認証局のルート証明書が含まれています。TLS/SSL(Transport Layer Security/Secure Sockets Layer)セッション中に提示された証明書の有効性は、cacerts.jks で確認されます。cacerts には秘密鍵やパスワードがありません。これらには、認証局の中間証明書とルート証明書が含まれます。 
  • Java キーストアは、サーバの秘密鍵とアイデンティティ証明書を格納するために使用されます。つまり、キーストアを使用してサーバのクレデンシャルを保存します。