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 設定ツール を参照してください。
前提条件を満たすには
-
少なくとも 2 つのハードウェアセキュリティモジュール (HSM) があるアクティブな AWS CloudHSM クラスターで AWS CloudHSM の JCE をインストールして設定します。インストールの詳細については、「クライアント SDK 5 向け JCE」を参照してください。
-
AWS CloudHSM クラスターにアクセスできる EC2 Linux インスタンスで、Apache Tomcat の手順
に従って Tomcat ウェブサーバーをダウンロードしてインストールします。 -
CloudHSM CLI を使用して Crypto User (CU) を作成します。HSM ユーザーの管理の詳細については、CloudHSM CLI を使用した HSM ユーザー管理について を参照してください。
ヒント
CU のユーザー名とパスワードを書き留めます。後に、ウェブサーバーの HTTPS プライベートキーや証明書を生成またはインポートするときに必要になります。
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 キーペアを生成します
下の
<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)。
-
コマンドが成功したことを確認するには、次のコマンドを入力し、RSA キーペアが正常に生成されたことを確認します。
$
ls
<PATH>
/<JSSE KEYSTORE NAME>
.keystore
自己署名証明書を生成します
キーストアファイルとともにプライベートキーを生成したら、このファイルを使用して証明書署名リクエスト (CSR) と証明書を生成できます。
本稼働環境では、通常、認証機関 (CA) を使用して CSR から証明書を作成します。CA は、テスト環境では必要ありません。CA を使用する場合は、CA に CSR ファイルを送信し、HTTPS 用のウェブサーバーで提供される署名付き SSL/TLS 証明書を使用してください。
CA を使用する代わりに、KeyTool を使用して自己署名証明書を作成できます。自己署名証明書はブラウザによって信頼されないため、本稼働環境では使用しないでください。これらは、テスト環境で使用することができます。
警告
自己署名証明書はテスト環境でのみ使用する必要があります。本稼働環境では、証明機関を使用して証明書を作成するなど、より安全な方法を使用してください。
トピック
証明書を生成する
-
前のステップで生成したキーストアファイルのコピーを入手します。
-
次のコマンドを実行して、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 のクラスパスを更新してください
-
クライアントインスタンスに接続します。
-
Tomcat インストールフォルダを探します。
-
下の
<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 コネクタをサーバー設定に追加します。
Tomcat のインストールフォルダーに移動します。
下の
<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 のセキュリティグループを作成してウェブサーバーに割り当てるには
-
Amazon EC2 コンソール (https://console.aws.amazon.com/ec2/
) を開きます。 -
ナビゲーションペインで、[セキュリティグループ] を選択します。
-
[Create Security Group] を選択します。
-
[Create Security Group] で、以下の操作を行います。
-
[Security group name] に、作成するセキュリティグループの名前を入力します
-
(オプション) 作成するセキュリティグループの説明を入力します。
-
[VPC] で、ウェブサーバーのAmazon EC2インスタンスが含まれている VPC を選択します。
-
[Add rule (ルールの追加)] を選択します。
-
[タイプ] で、ドロップダウンウィンドウから [HTTPS] を選択します。
-
[ソース] には、ソースの場所を入力します。
-
[セキュリティグループの作成] を選択します。
-
-
ナビゲーションペインで、[インスタンス] を選択します。
-
ウェブサーバーインスタンスの横にあるチェックボックスを選択します。
-
ページの上部で [アクション] ドロップダウンメニューを選択します。[セキュリティ] を選択し、[セキュリティグループの変更] を選択します。
-
[関連付けられたセキュリティグループ] で、検索ボックスを選択して HTTPS 用に作成したセキュリティグループを選択します。次に、[セキュリティグループの追加] を選択します。
-
[Save] を選択します。
設定した証明書が HTTPS で使用されていることを検証する
ウェブサーバーをセキュリティ グループに追加した後、SSL/TLS オフロードが自己署名証明書を使用していることを確認できます。この検証には、ウェブブラウザ、または OpenSSL s_client
ウェブブラウザで SSL/TLS オフロードを確認するには
-
ウェブブラウザを使用し、サーバーの公開 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 サービスのドキュメントを参照してください。
-
ウェブブラウザを使用して、ウェブサーバー証明書を表示します。詳細については、次を参照してください:
-
Mozilla Firefox の場合は、Mozilla サポートウェブサイトの「証明書を見る
」を参照してください。 -
Google Chrome の場合は、ウェブ開発者向け Google ツールのウェブサイトで「セキュリティの問題を理解する
」を参照してください。
他のウェブブラウザでも、同様の機能を使用してウェブサーバー証明書を表示できる場合があります。
-
-
SSL/TLS 証明書が、ウェブサーバーに設定したものであることを確認してください。
OpenSSL s_client で SSL/TLS オフロードを確認するには
-
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 サービスのドキュメントを参照してください。
-
SSL/TLS 証明書が、ウェブサーバーに設定したものであることを確認してください。
これで、ウェブサイトが HTTPS で保護されるようになりました。ウェブサーバーのプライベートキーは、AWS CloudHSM クラスターの HSM に保管されています。
ロードバランサーを追加するには、「AWS CloudHSM に対して、Elastic Load Balancing を使用してロードバランサーを追加する (オプション)」を参照してください。