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

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

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

コントローラ SSL 証明書

コントローラの SSL 証明書は、コマンドラインか、[Configurations] の Enterprise Console UI を使用して管理できます。この UI では、[Appserver Configurations] ページ、[Reports Service Configurations] ページ、[Fleet Management Configurations] ページに、SSL 証明書情報を表示し、[Edit Certificate] オプションを提供するセクションが含まれています。 

コマンドラインを使用した既存のキーペアのキーストアへのインポート」および「Enterprise Console UI を使用した既存のキーペアのキーストアへのインポート」を参照してください。

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

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

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

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

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

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

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

キーストアの表示方法

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

keytool -list -v -keystore <Controller_home>/appserver/jetty/etc/keystore.jks

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

はじめに

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

  • <controller_home>/jre/bin

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

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

証明書の作成と CSR の生成

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


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

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

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

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

    <Controller_home>/appserver/jetty/etc


  2. キーストアファイルのバックアップを作成します。たとえば、Linuxの場合は以下を実行します。

    cp keystore.jks keystore.jks.backup

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

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

    keytool -delete -alias s1as -keystore keystore.jks

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

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

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

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

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

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

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

    keytool -certreq -alias s1as -keystore keystore.jks -file AppDynamics.csr

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

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

    このコマンドは、証明書が次の名前のファイルにあることを前提としています。 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/jetty/etc/cacerts.jks

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

コマンドラインを使用した既存のキーペアのキーストアへのインポート

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

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

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

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

次の手順で使用する秘密鍵は、プレーンテキスト形式である必要があります。秘密キーを PKCS12 キーストア形式に変換する場合、デフォルトのパスワード(changeit)を秘密キーに割り当てる必要があります。 

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

    openssl pkcs12 -inkey private.key -in cert.crt -export -out keystore.p12

  2. コントローラが実行中の場合は停止します。
  3. keystoreディレクトリに移動します。

    cd <Controller_home>/appserver/jetty/etc/

  4. keystoreファイルのバックアップを作成します。たとえば、Linuxの場合は以下を実行します。

    cp keystore.jks keystore.jks.backup

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

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

    keytool -delete -alias s1as -keystore keystore.jks

  6. PKCS #12キーをデフォルトのキーストアにインポートします。

    keytool -importkeystore -srckeystore keystore.p12 -srcstoretype pkcs12 -destkeystore keystore.jks -deststoretype JKS

  7. インポートした鍵ペアのエイリアス名を更新します。

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

    keytool -changealias -alias "1" -destalias "s1as" -keystore keystore.jks

  8. インポートした秘密鍵のパスワードを変更します。

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

    変更した場合、新しい秘密鍵のパスワードにデフォルト(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/jetty/etc/cacerts.jks

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

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

Enterprise Console UI を使用した既存のキーペアのキーストアへのインポート

  1. Enterprise Console にログインします。
  2. [Configurations] > [Controller Settings] > [Appserver Configurations] に移動します。
  3. [SSL Certificate Management] タブをクリック。
  4. [ Edit Certificate] をクリックします。
  5. [Edit Certificate] ポップアップウィンドウで [Certificate Body]、[Certificate Chain (optional)]、および [Private Key] を追加します。
  6. [Edit Certificate ] ポップアップウィンドウで [Save] をクリックします。
  7. [Appserver Configurations] ページで、[Save] をクリックします。
  8. [Appserver Configurations] ポップアップウィンドウが表示されたら、[OK] をクリックします。
  9. Controller Configurations Update ジョブが完了するまで待ちます。[ Jobs ] ページでステータスを確認できます。

SSL使用の確認

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

https://<controller_host>:8181/controller

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

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

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

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

    platform-admin.sh stop-controller-appserver

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

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

    -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

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

    platform-admin.exe cli start-controller-appserver

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

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

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

キーストアのパスワードを変更する場合は、すべてのキーに同じパスワードを設定する必要があります。

デフォルトでは、keystore.jks には s1as および reporting-instance キーが含まれています。

  1. キーストアのパスワードを更新します。

    <JRE_HOME>/bin/keytool -storepasswd -keystore <controller_home>/appserver/jetty/etc/keystore.jks -storepass <current_password> -new <new_password>
    CODE
  2. トラストストアのパスワードを更新します。

    <JRE_HOME>/bin/keytool -storepasswd -keystore <controller_home>/appserver/jetty/etc/cacerts.jks -storepass <current_password> -new <new_password>
    CODE
  3. キーのパスワードを更新します。

    <JRE_HOME>/bin/keytool -keypasswd -keystore <controller_home>/appserver/jetty/etc/keystore.jks -storepass <new_password> -alias s1as -keypass <current_password> -new <new_password>
    <JRE_HOME>/bin/keytool -keypasswd -keystore <controller_home>/appserver/jetty/etc/keystore.jks -storepass <new_password> -alias reporting-instance -keypass <current_password> -new <new_password>
    CODE
  4. キーストアのパスワード <new_password> 用に難読化されたパスワードを作成します。

    <JRE_HOME>/bin/java -jar <controller_home>/tools/lib/scs-tool.jar obfuscate -plaintext <new_password>
    CODE

    このコマンドで難読化されたパスワードを作成します。次に例を示します。

    Example obfuscated password: s_-001-12-H8v0OuZ2X/M=SOMM06ufKVOATetbV2BYxQ==
    CODE
  5. Enterprise Console UI で難読化されたパスワードを更新します。
    1. Configurations > Controller Settings > Appserver Configurations にアクセスします。
    2. [JVM Options] タブで、[SSL Context Config] の下にある次のセクションを更新します。

      <Set name="KeyStorePassword">
            <Call class="com.singularity.ee.util.security.credentialstore.ObfuscationWrapper" name="deobfuscateString">
              <Arg>[Obfuscated Password]</Arg>
            </Call>
        </Set>
      
      
        <Set name="TrustStorePassword">
          <Call class="com.singularity.ee.util.security.credentialstore.ObfuscationWrapper" name="deobfuscateString">
            <Arg>[Obfuscated Password]</Arg>
          </Call>
        </Set>
      
        <Call class="java.lang.System" name="setProperty">
          <Arg>javax.net.ssl.keyStorePassword</Arg>
          <Arg>
            <Call class="com.singularity.ee.util.security.credentialstore.ObfuscationWrapper" name="deobfuscateString">
              <Arg>[Obfuscated Password]</Arg>
            </Call>
          </Arg>
        </Call>
      
        <Call class="java.lang.System" name="setProperty">
          <Arg>javax.net.ssl.trustStorePassword</Arg>
          <Arg>
            <Call class="com.singularity.ee.util.security.credentialstore.ObfuscationWrapper" name="deobfuscateString">
              <Arg>[Obfuscated Password]</Arg>
            </Call>
          </Arg>
        </Call>
      CODE
    3. Save をクリックします。
  6. Enterprise Console で新しいキーストアのパスワードを更新します。
    1. Configurations > Controller Settings > Appserver Configurations にアクセスします。
    2. [SSL Certificate Management] で、新しいコントローラのキーストアのパスワードを更新し、確認します。
    3. Save をクリックします。

期限切れ証明書の更新

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

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

    <controller_home>/appserver/jetty/etc/

  3. キーストアファイルのバックアップを作成します。 

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

      cp keystore.jks keystore.jks.backup

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

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

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

    keytool -certreq -alias s1as -keystore keystore.jks -file AppDynamics.csr

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

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

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

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

    keytool -printcert -v -file <your obtained certificate>

  7. 取得した署名済み証明書を既存のキーストアにインポートします。 

    keytool -import -alias s1as -file <your obtained certificate> -keystore keystore.jks

    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/jetty/etc/cacerts.jks

信頼ストアとキーストア

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