Linux での AWS CloudHSM SSL/TLS オフロードに JSSE で Tomcat を使う - AWS CloudHSM

Linux での AWS CloudHSM SSL/TLS オフロードに JSSE で Tomcat を使う

このトピックでは、AWS CloudHSM JCE SDK で Java Secure Socket Extension (JSSE) を使用して SSL/TLS オフロードを設定する手順を段階的に説明します。

概要

AWS CloudHSM では、Tomcat ウェブサーバーは HTTPS をサポートするために Linux 上で動作します。AWS CloudHSM JCE SDK には、JSSE (Java Secure Socket Extension) と併用できるインターフェースが用意されており、このようなウェブサーバーで HSM を使用できるようになります。 AWS CloudHSMJCE は JSSE を AWS CloudHSM クラスターに接続するブリッジです。JSSE は、Secure Socket Layer (SSL) と Transport Layer Security (TLS) プロトコル用の Java API です。

ステップ 1: 前提条件の設定

Linux で SSL/TLS オフロードに AWS CloudHSM を備えた Tomcat ウェブサーバーを使用するには、以下の前提条件に従ってください。クライアント SDK 5 と Tomcat ウェブサーバーでウェブサーバー SSL/TLS オフロードを設定するには、これらの前提条件を満たす必要があります。

注記

プラットフォームごとに、異なる前提条件が必要です。使用しているプラットフォームに適したインストール手順を必ず実行してください。

前提条件

  • Tomcat ウェブサーバーがインストールされた Linux オペレーティングシステムを実行する Amazon EC2 インスタンス。

  • HSM でこのウェブサーバーのプライベートキーを所有および管理する Crypto User (CU)。

  • クライアント SDK 5 向け JCE がインストールされ構成されたハードウェアセキュリティモジュール (HSM) が少なくとも 2 つあるアクティブな AWS CloudHSM クラスター。

    注記

    HSM クラスターは1つでも使用できますが、まずクライアントキーの耐久性を無効にする必要があります。詳細については、クライアントキーの耐久性設定の管理 そして クライアント SDK 5 設定ツール を参照してください。

前提条件を満たすには
  1. 少なくとも 2 つのハードウェアセキュリティモジュール (HSM) があるアクティブな AWS CloudHSM クラスターで AWS CloudHSM の JCE をインストールして設定します。インストールの詳細については、「クライアント SDK 5 向け JCE」を参照してください。

  2. AWS CloudHSM クラスターにアクセスできる EC2 Linux インスタンスで、Apache Tomcat の手順 に従って Tomcat ウェブサーバーをダウンロードしてインストールします。

  3. CloudHSM CLI を使用して Crypto User (CU) を作成します。HSM ユーザーの管理の詳細については、CloudHSM CLI を使用した HSM ユーザー管理について を参照してください。

    ヒント

    CU のユーザー名とパスワードを書き留めます。後に、ウェブサーバーの HTTPS プライベートキーや証明書を生成またはインポートするときに必要になります。

  4. Java キーツールを使用して JCE をセットアップするには、クライアント SDK 5 を使用して AWS CloudHSM を Java Keytool および Jarsigner と統合する に記載されている手順に従ってください。

以上のステップが完了したら、「ステップ 2: プライベートキーと SSL/TLS 証明書を生成またはインポートする」に進みます。

メモ
  • セキュリティ強化 Linux (SELinux) および Web サーバーを使用するには、クライアント SDK 5 が HSM と通信するために使用するポート 2223 でアウトバウンド TCP 接続を許可する必要があります。

  • クラスターを作成してアクティブ化し、EC2 インスタンスにクラスターへのアクセス権を付与するには、AWS CloudHSM の使用開始 の手順を実行します。このセクションでは、1 つの HSM と Amazon EC2 クライアントインスタンスでアクティブなクラスターを作成するためのステップバイステップの手順を提供しています。このクライアントインスタンスをウェブサーバーとして使用することができます。

  • クライアントキーの耐久性を無効化しないようにするには、クラスターに複数の HSM を追加します。詳細については、「HSM の AWS CloudHSM クラスターへの追加」を参照してください。

  • クライアントインスタンスに接続するには、SSH または PuTTY を使用することができます。詳細については、「Amazon EC2 ドキュメント」の「SSH を使用した Linux インスタンスへの接続」または「PuTTY を使用した Windows から Linux インスタンスへの接続」を参照してください。

ステップ 2: プライベートキーと SSL/TLS 証明書を生成またはインポートする

HTTPS を有効にするには、Tomcat ウェブサーバーアプリケーションにプライベートキーと、それに対応する SSL/TLS 証明書が必要です。AWS CloudHSM でウェブサーバー SSL/TLS オフロードを使用するには、プライベートキーを AWS CloudHSM クラスター内の HSM に保存する必要があります。

注記

プライベートキーとそれに対応する証明書を持っていない場合、HSM でプライベートキーを生成できます。このプライベートキーを使用して証明書署名リクエスト (CSR) を作成し、それを使用してSSL/TLS証明書を作成します。

HSM 上のプライベートキーと関連する証明書への参照を含むローカル AWS CloudHSM KeyStore ファイルを作成します。ウェブサーバーは、SSL/TLS オフロード中に AWS CloudHSM KeyStore ファイルを使用して HSM のプライベートキーを識別します。

プライベートキーの生成

このセクションでは、JDK から KeyTool を使用してキーペアを生成する方法について説明します。HSM 内でキーペアを生成したら、それを KeyStore ファイルとしてエクスポートし、それに対応する証明書を生成できます。

ユースケースに応じて、RSA または EC キーペアを生成できます。以下の手順では、RSA キーペアを生成する方法を示します。

KeyTool の genkeypair コマンドを使用して RSA キーペアを生成します
  1. 下の <VARIABLES> を特定のデータに置き換えたら、次のコマンドを使用して jsse_keystore.keystore という名前のキーストアファイルを生成します。このファイルには HSM 上のプライベートキーへの参照が含まれます。

    $ keytool -genkeypair -alias <UNIQUE ALIAS FOR KEYS> -keyalg <KEY ALGORITHM> -keysize <KEY SIZE> -sigalg <SIGN ALGORITHM> \ -keystore <PATH>/<JSSE KEYSTORE NAME>.keystore -storetype CLOUDHSM \ -dname CERT_DOMAIN_NAME \ -J-classpath '-J'$JAVA_LIB'/*:/opt/cloudhsm/java/*:./*' \ -provider "com.amazonaws.cloudhsm.jce.provider.CloudHsmProvider" \ -providerpath "$CLOUDHSM_JCE_LOCATION" \ -keypass <KEY PASSWORD> -storepass <KEYSTORE PASSWORD>
    • <PATH>: キーストアファイルを生成するパス。

    • <UNIQUE ALIAS FOR KEYS>: これは HSM 上でキーを一意に識別するために使用されます。このエイリアスは、キーの LABEL 属性として設定されます。

    • <KEY PASSWORD>: キーへの参照はローカルキーストアファイルに保存され、このパスワードによってローカル参照が保護されます。

    • <KEYSTORE PASSWORD>: これはローカルキーストアファイルのパスワードです。

    • <JSSE KEYSTORE NAME>: キーストアファイルの名前。

    • <CERT DOMAIN NAME>: X.500 識別名。

    • <KEY ALGORITHM>: キーペアを生成するためのキーアルゴリズム (RSA と EC など)。

    • <KEY SIZE>: キーペアを生成するためのキーサイズ (たとえば、2048、3072、4096)。

    • <SIGN ALGORITHM>: キーペアを生成するためのキーサイズ(たとえば、SHA1withRSA、SHA224withRSA、SHA256withRSA、SHA384withRSA、SHA512withRSA)。

  2. コマンドが成功したことを確認するには、次のコマンドを入力し、RSA キーペアが正常に生成されたことを確認します。

    $ ls <PATH>/<JSSE KEYSTORE NAME>.keystore

自己署名証明書を生成します

キーストアファイルとともにプライベートキーを生成したら、このファイルを使用して証明書署名リクエスト (CSR) と証明書を生成できます。

本稼働環境では、通常、認証機関 (CA) を使用して CSR から証明書を作成します。CA は、テスト環境では必要ありません。CA を使用する場合は、CA に CSR ファイルを送信し、HTTPS 用のウェブサーバーで提供される署名付き SSL/TLS 証明書を使用してください。

CA を使用する代わりに、KeyTool を使用して自己署名証明書を作成できます。自己署名証明書はブラウザによって信頼されないため、本稼働環境では使用しないでください。これらは、テスト環境で使用することができます。

警告

自己署名証明書はテスト環境でのみ使用する必要があります。本稼働環境では、証明機関を使用して証明書を作成するなど、より安全な方法を使用してください。

トピック
    証明書を生成する
    1. 前のステップで生成したキーストアファイルのコピーを入手します。

    2. 次のコマンドを実行して、KeyTool を使用して証明書署名リクエスト (CSR) を作成します。

      $ keytool -certreq -keyalg RSA -alias unique_alias_for_key -file certreq.csr \ -keystore <JSSE KEYSTORE NAME>.keystore -storetype CLOUDHSM \ -J-classpath '-J$JAVA_LIB/*:/opt/cloudhsm/java/*:./*' \ -keypass <KEY PASSWORD> -storepass <KEYSTORE PASSWORD>
      注記

      証明書署名リクエストの出力ファイルは certreq.csr です。

    証明書に署名する
    • 下の <VARIABLES> を特定のデータに置き換えた後、次のコマンドを実行して、HSM 上のプライベートキーを使用して CSR に署名します。これにより、自己署名証明書が作成されます。

      $ keytool -gencert -infile certreq.csr -outfile certificate.crt \ -alias <UNIQUE ALIAS FOR KEYS> -keypass <KEY_PASSWORD> -storepass <KEYSTORE_PASSWORD> -sigalg SIG_ALG \ -storetype CLOUDHSM -J-classpath '-J$JAVA_LIB/*:/opt/cloudhsm/java/*:./*' \ -keystore jsse_keystore.keystore
      注記

      certificate.crt は、エイリアスのプライベートキーを使用する署名付き証明書です。

    Keystore に証明書をインポートする
    • 下の <VARIABLES> を特定のデータに置き換えた後、次のコマンドを実行して、署名付き証明書を信頼できる証明書としてインポートします。このステップでは、エイリアスで識別されるキーストアエントリに証明書を保存します。

      $ keytool -import -alias <UNIQUE ALIAS FOR KEYS> -keystore jsse_keystore.keystore \ -file certificate.crt -storetype CLOUDHSM \ -v -J-classpath '-J$JAVA_LIB/*:/opt/cloudhsm/java/*:./*' \ -keypass <KEY PASSWORD> -storepass <KEYSTORE_PASSWORD>
    証明書を PEM に変換する
    • 次のコマンドを実行して、署名付き証明書ファイル (.crt) を PEM に変換します。PEM ファイルは http クライアントからのリクエストの送信に使用されます。

      $ openssl x509 -inform der -in certificate.crt -out certificate.pem

    これらの手順を完了したら、「ステップ 3: ウェブサーバーの設定」に進みます。

    ステップ 3: Tomcat ウェブサーバーを設定する

    前のステップで作成した HTTPS 証明書と PEM ファイルを使用するようにウェブサーバーソフトウェアの設定を更新します。開始する前に、既存の証明書とキーを必ずバックアップしてください。これで、AWS CloudHSM を使用して、Linux ウェブサーバーソフトウェアに SSL/TLS オフロードを設定できます。詳細については、「Apache Tomcat 9 設定リファレンス」を参照してください。

    サーバーを停止します
    • 下の <VARIABLES> を特定のデータに置き換えたら、設定を更新する前に、次のコマンドを実行して Tomcat Server を停止します

      $ /<TOMCAT DIRECTORY>/bin/shutdown.sh
      • <TOMCAT DIRECTORY>: Tomcat のインストールディレクトリ。

    Tomcat のクラスパスを更新してください
    1. クライアントインスタンスに接続します。

    2. Tomcat インストールフォルダを探します。

    3. 下の <VARIABLES> を特定のデータに置き換えたら、次のコマンドを使用して、Tomcat/bin/catalina.sh ファイルにある Tomcat クラスパスに Java ライブラリと Cloudhsm Java パスを追加します。

      $ sed -i 's@CLASSPATH="$CLASSPATH""$CATALINA_HOME"\/bin\/bootstrap.jar@CLASSPATH="$CLASSPATH""$CATALINA_HOME"\/bin\/bootstrap.jar:'" <JAVA LIBRARY>"'\/*:\/opt\/cloudhsm\/java\/*:.\/*@' <TOMCAT PATH> /bin/catalina.sh
      • <JAVA LIBRARY>: Java JRE ライブラリの場所。

      • <TOMCAT PATH>: Tomcat のインストールフォルダー。

    HTTPS コネクタをサーバー設定に追加します。
    1. Tomcat のインストールフォルダーに移動します。

    2. 下の <VARIABLES> を特定のデータに置き換えたら、以下のコマンドを使用して HTTPS コネクタを追加し、前提条件で生成された証明書を使用します。

      $ sed -i '/<Connector port="8080"/i <Connector port=\"443\" maxThreads=\"200\" scheme=\"https\" secure=\"true\" SSLEnabled=\"true\" keystoreType=\"CLOUDHSM\" keystoreFile=\" <CUSTOM DIRECTORY>/<JSSE KEYSTORE NAME>.keystore\" keystorePass=\"<KEYSTORE PASSWORD>\" keyPass=\"<KEY PASSWORD> \" keyAlias=\"<UNIQUE ALIAS FOR KEYS>" clientAuth=\"false\" sslProtocol=\"TLS\"/>' <TOMCAT PATH>/conf/server.xml
      • <CUSTOM DIRECTORY>: キーストアファイルが置かれているディレクトリ。

      • <JSSE KEYSTORE NAME>: キーストアファイルの名前。

      • <KEYSTORE PASSWORD>: これはローカルキーストアファイルのパスワードです。

      • <KEY PASSWORD>: キーへの参照はローカルキーストアファイルに保存され、このパスワードによってローカル参照が保護されます。

      • <UNIQUE ALIAS FOR KEYS>: これは HSM 上でキーを一意に識別するために使用されます。このエイリアスは、キーの LABEL 属性として設定されます。

      • <TOMCAT PATH>: Tomcat フォルダへのパス。

    サーバーの起動
    • 下の <VARIABLES> を特定のデータに置き換えたら、以下のコマンドを使用して Tomcat サーバーを起動します。

      $ /<TOMCAT DIRECTORY>/bin/startup.sh
      注記

      <TOMCAT DIRECTORY> は、Tomcat のインストールディレクトリの名前です。

    ウェブサーバー設定を更新したら、「ステップ 4: HTTPS トラフィックを有効にして証明書を検証する」に移動します。

    ステップ 4: HTTPS トラフィックを有効にして証明書を検証する

    AWS CloudHSM でウェブサーバーを SSL/TLS オフロード用に設定したら、ウェブサーバーインスタンスを、インバウンドの HTTPS トラフィックを許可するセキュリティグループに追加します。これにより、ウェブブラウザなどのクライアントがウェブサーバーと HTTPS 接続を確立できるようになります。次に、ウェブサーバーに HTTPS 接続を行い、SSL/TLS オフロードを AWS CloudHSM で構成した証明書が使用されていることを確認します。

    インバウンド HTTPS 接続の有効化

    クライアント (ウェブブラウザなど) からウェブサーバーに接続するには、インバウンド HTTPS 接続を許可するセキュリティグループを作成します。具体的には、ポート 443 でインバウンドの TCP 接続を許可する必要があります。このセキュリティグループをウェブサーバーに割り当てます。

    HTTPS のセキュリティグループを作成してウェブサーバーに割り当てるには
    1. Amazon EC2 コンソール (https://console.aws.amazon.com/ec2/) を開きます。

    2. ナビゲーションペインで、[セキュリティグループ] を選択します。

    3. [Create Security Group] を選択します。

    4. [Create Security Group] で、以下の操作を行います。

      1. [Security group name] に、作成するセキュリティグループの名前を入力します

      2. (オプション) 作成するセキュリティグループの説明を入力します。

      3. [VPC] で、ウェブサーバーのAmazon EC2インスタンスが含まれている VPC を選択します。

      4. [Add rule (ルールの追加)] を選択します。

      5. [タイプ] で、ドロップダウンウィンドウから [HTTPS] を選択します。

      6. [ソース] には、ソースの場所を入力します。

      7. [セキュリティグループの作成] を選択します。

    5. ナビゲーションペインで、[インスタンス] を選択します。

    6. ウェブサーバーインスタンスの横にあるチェックボックスを選択します。

    7. ページの上部で [アクション] ドロップダウンメニューを選択します。[セキュリティ] を選択し、[セキュリティグループの変更] を選択します。

    8. [関連付けられたセキュリティグループ] で、検索ボックスを選択して HTTPS 用に作成したセキュリティグループを選択します。次に、[セキュリティグループの追加] を選択します。

    9. [Save] を選択します。

    設定した証明書が HTTPS で使用されていることを検証する

    ウェブサーバーをセキュリティ グループに追加した後、SSL/TLS オフロードが自己署名証明書を使用していることを確認できます。この検証には、ウェブブラウザ、または OpenSSL s_client などのツールを使用できます。

    ウェブブラウザで SSL/TLS オフロードを確認するには
    1. ウェブブラウザを使用し、サーバーの公開 DNS 名または IP アドレスを使用してウェブサーバーに接続します。アドレスバーの URL が https:// で始まっていることを確認します。例えば、https://ec2-52-14-212-67.us-east-2.compute.amazonaws.com/ と指定します。

      ヒント

      Amazon Route 53 などの DNS サービスを使用して、ウェブサイトのドメイン名 (https://www.example.com/ など) をウェブサーバーにルーティングできます。詳細については、Amazon Route 53 開発者ガイドAmazon EC2 インスタンスへのトラフィックのルーティング または DNS サービスのドキュメントを参照してください。

    2. ウェブブラウザを使用して、ウェブサーバー証明書を表示します。詳細については、次を参照してください:

      • Mozilla Firefox の場合は、Mozilla サポートウェブサイトの「証明書を見る」を参照してください。

      • Google Chrome の場合は、ウェブ開発者向け Google ツールのウェブサイトで「セキュリティの問題を理解する」を参照してください。

      他のウェブブラウザでも、同様の機能を使用してウェブサーバー証明書を表示できる場合があります。

    3. SSL/TLS 証明書が、ウェブサーバーに設定したものであることを確認してください。

    OpenSSL s_client で SSL/TLS オフロードを確認するには
    1. HTTPS を使用してウェブサーバーに接続するには、次の OpenSSL コマンドを実行します。<サーバー名> は、ウェブサーバーの公開 DNS 名または IP アドレスに置き換えます。

      openssl s_client -connect <server name>:443
      ヒント

      Amazon Route 53 などの DNS サービスを使用して、ウェブサイトのドメイン名 (https://www.example.com/ など) をウェブサーバーにルーティングできます。詳細については、Amazon Route 53 開発者ガイドAmazon EC2 インスタンスへのトラフィックのルーティング または DNS サービスのドキュメントを参照してください。

    2. SSL/TLS 証明書が、ウェブサーバーに設定したものであることを確認してください。

    これで、ウェブサイトが HTTPS で保護されるようになりました。ウェブサーバーのプライベートキーは、AWS CloudHSM クラスターの HSM に保管されています。

    ロードバランサーを追加するには、「AWS CloudHSM に対して、Elastic Load Balancing を使用してロードバランサーを追加する (オプション)」を参照してください。