コントローラSSLと証明書

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

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

実稼働環境での使用においては、自己署名証明書をサードパーティの 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 ファイルのパスワードは変更できません。

キーストアの表示方法

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

keytool -list -v -keystore controller_home/appserver/jetty/etc/ keystore.jks

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

はじめに

以下で、コントローラのインストールにバンドルされる Java keytool ユーティリティを使用した SSL の構成方法について説明します。keytool ユーティリティは、<controller_home> と同じレベルのディレクトリにあります。つまり、<controller_home> から ../jre/<version> /bin に移動します。

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

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

証明書の作成とCSRの生成

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

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

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

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

  1. コマンドプロンプトで、以下の場所にディレクトリを変更します。
    <Controller_home>/appserver/jetty/etc
  2. キーストアファイルのバックアップを作成します。たとえば、Linux の場合、次のように実行できます。Windows の場合、同様の方法でコピーコマンドを使用します。
    cp keystore.jks keystore.jks.backup
  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. 署名付き証明書をインポートします。このコマンドは、証明書が mycert.cer という名前のファイルにあることを前提としています。
    keytool -import -trustcacerts -alias s1as -file mycert.cer -keystore keystore.jks
  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 root チェーン: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. キーストアファイルのバックアップを作成します。たとえば、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. [Secure Boot 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 に変更し、ポートをセキュアポートに変更します。REST API を使用してディープリンク URL を更新することもできます。
    - Dappdynamics.controller.ui.deeplink.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>
  2. トラストストアのパスワードを更新します。
    <JRE_HOME>/bin/keytool -storepasswd -keystore <controller_home>/appserver/jetty/etc/cacerts.jks -storepass <current_password> -new <new_password>
  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>
  4. キーストアのパスワード <new_password> 用に難読化されたパスワードを作成します。
    <JRE_HOME>/bin/java -jar <controller_home>/tools/lib/scs-tool.jar obfuscate -plaintext <new_password>
    このコマンドで難読化されたパスワードを作成します。例:
    Example obfuscated password: s_-001-12-H8v0OuZ2X/M=SOMM06ufKVOATetbV2BYxQ==
  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>
    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 キーストアがあるため、次のコマンドを実行して証明書署名リクエストを発行します。新しいキーストアを作成するのではなく、CSR にこのキーストアを使用する必要があります。このキーストアに新しい証明書をインポートします。
    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 キーストアは、サーバの秘密鍵とアイデンティティ証明書を格納するために使用されます。つまり、キーストアを使用してサーバのクレデンシャルを保存します。

証明書の問題のトラブルシューティング

デフォルトの自己署名証明書を使用する際に問題が発生することがあります。以下の手順に従って問題のトラブルシューティングを行ってください。

Issue: 'net::ERR_CERT_COMMON_NAME_INVALID'

net::ERR_CERT_COMMON_NAME_INVALID '

このエラーは、Windows マシンの [Trusted Root Certification Authorities] の [Certificates] にデフォルトの自己署名証明書をインポートしても表示されます。サブジェクト代替名(SAN)が存在しない場合、Chrome 58 以上および Edge ブラウザは TLS 証明書を信頼しません。

この問題のトラブルシュートを行うには、SAN を使用して証明書を再生成し、Windows マシンの [Trusted Root Certification Authorities] の [Certificates] にインポートします。

  1. 以下の keystore.jks ファイルをバックアップします。
    <AppD Home>\Platform\product\controller\appserver\jetty\etc\keystore.jks
  2. keystore.jks から s1as エントリを削除します。
    keytool -delete -alias s1as -keystore <AppD Home>\Platform\product\controller\appserver\jetty\etc\keystore.jks
  3. 新しい鍵ペアと s1as エントリを keystore.jks に作成し、それを keystore.jks に追加します。
    keytool -genkeypair -alias s1as -keyalg RSA -keystore <AppD Home>\Platform\product\controller\appserver\jetty\etc\keystore.jks -keysize 2048 -validity 1825 -storepass changeit -keypass changeit -dname "CN=<hostname>" -ext "SAN=dns:<hostname>"
  4. keystore.jks から証明書をエクスポートします。
    keytool -exportcert -alias s1as -keystore keystore.jks -file <AppD Home>\Platform\product\controller\appserver\jetty\etc\keystore_controller.crt -rfc -storepass changeit
  5. keystore_controller.crt 証明書マネージャを開き、[Trusted Root Certification Authorities] の [Certificates] を選択し、インポートします。

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