このガイドでは、Debian 11(BullsEye)での TLS 署名に Cloud HSM 鍵を使用するように Apache サーバーを設定する方法について説明します。OS または Linux ディストリビューションで動作するように、これらのコマンドの変更が必要になる場合があります。
このチュートリアルの Terraform ベースのブループリント バージョンは、kms-solutions GitHub リポジトリにあります。
始める前に
前提条件として、OpenSSL のセットアップに記載されている構成を完了します。
OpenSSL のセットアップが完了したら、Apache の最新バージョンがインストールされていることを確認します。
sudo apt-get update
sudo apt-get install apache2
構成
Cloud KMS でホストされる署名鍵を作成する
OpenSSL 用に構成済みのキーリングで、Google Cloud プロジェクトの Cloud KMS EC-P256-SHA256
署名鍵を作成します。
gcloud kms keys create "KEY_NAME" --keyring "KEY_RING" \
--project "PROJECT_ID" --location "LOCATION" \
--purpose "asymmetric-signing" --default-algorithm "ec-sign-p256-sha256" \
--protection-level "hsm"
OpenSSL で自己署名証明書を作成する
Cloud KMS でホストされる署名鍵を使用して、自己署名証明書を生成します。OpenSSL を使用すると、ファイルパスの代わりに PKCS #11 URI を使用して、ラベルで鍵を識別できます。Cloud KMS PKCS #11 ライブラリでは、鍵ラベルは CryptoKey 名です。
openssl req -new -x509 -days 3650 -subj '/CN=CERTIFICATE_NAME/' \
DIGEST_FLAG -engine pkcs11 -keyform engine \
-key PKCS_KEY_TYPE=KEY_IDENTIFIER > PATH_TO_CERTIFICATE
以下を置き換えます。
CERTIFICATE_NAME
: 証明書の名前。DIGEST_FLAG
: 非対称署名鍵で使用されるダイジェスト アルゴリズム。鍵に応じて、-sha256
、-sha384
、または-sha512
を使用します。PKCS_KEY_TYPE
: 鍵の識別に使用される識別子のタイプ。最新の鍵バージョンを使用するには、鍵の名前とともにpkcs11:object
を使用します。特定の鍵バージョンを使用するには、鍵バージョンの完全なリソース ID とともにpkcs11:id
を使用します。KEY_IDENTIFIER
: 鍵の識別子。pkcs11:object
を使用している場合は、鍵の名前を使用します(例:KEY_NAME
)。pkcs11:id
を使用している場合は、鍵または鍵バージョンの完全なリソース ID を使用します(例:projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/KEY_VERSION
)。PATH_TO_CERTIFICATE
: 証明書ファイルを保存するパス。
このコマンドが失敗した場合、PKCS11_MODULE_PATH
が正しく設定されていないか、Cloud KMS 署名鍵を使用するための適切な権限がない可能性があります。
次のような証明書が作成されます。
-----BEGIN CERTIFICATE-----
...
...
...
-----END CERTIFICATE-----
Apache サーバーを設定する
自己署名証明書を保存するディレクトリを
/etc/apache2
に作成します。sudo mkdir /etc/apache2/ssl sudo mv ca.cert /etc/apache2/ssl
/etc/apache2/sites-available
にある000-default.conf
仮想ホスト構成ファイルを編集して証明書ファイルのパスを指定し、SSLEngine がオンであることを確認します。ポート 443 でリッスンする構成の例を次に示します。
<VirtualHost *:443> ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined SSLEngine on SSLCertificateFile /etc/apache2/ssl/ca.cert SSLCertificateKeyFile "PKCS_KEY_TYPE=KEY_IDENTIFIER" </VirtualHost>
Apache が環境変数を正しくエクスポートするように、テキスト エディタを使用して
/etc/apache2/envvars
ファイルに追加します。sudo
を使用して root としてファイルを編集する必要がある場合があります。次の行をファイルの末尾に追加します。export PKCS11_MODULE_PATH="<var>PATH_TO_LIBKMSP11</var>" export KMS_PKCS11_CONFIG="<var>PATH_TO_PKCS11_CONFIG</var>" export GRPC_ENABLE_FORK_SUPPORT=1
以下を置き換えます。
PATH_TO_LIBKMSP11
:libkmsp11.so
へのパス。PATH_TO_PKCS11_CONFIG
:pkcs11-config.yaml
へのパス。
gRPC にフォークのサポートを追加し、Apache サーバーの一部として Cloud KMS PKCS #11 ライブラリを正しく実行するには、
GRPC_ENABLE_FORK_SUPPORT
が必要です。サービス アカウント キーを使用して認証する場合は、
GOOGLE_APPLICATION_CREDENTIALS
環境変数の値もエクスポートする必要があります。
サーバーを実行する
Apache SSL モジュールを有効にし、仮想ホストの構成を有効にして、DocumentRoot フォルダにテスト ウェブページを追加します。
sudo a2enmod ssl
sudo a2ensite 000-default.conf
echo '<!doctype html><html><body><h1>Hello World!</h1></body></html>' | \
sudo tee /var/www/html/index.html
Apache サーバーを再起動し、構成が期待どおりに動作することを curl
でテストします。--insecure
フラグは、自己署名証明書のチェックを無視するために必要です。
sudo systemctl restart apache2
curl -v --insecure https://127.0.0.1
エラーが発生した場合は、まず Apache エラーログで原因を確認してください。認証に関する問題がエラーの原因になることがよくあります。PERMISSION_DENIED
エラーが表示された場合は、完全に認証されており、認証情報ファイルに適切な権限があることを確認してください。完全に認証されていることを確認するには、次のコマンドを実行します。
gcloud auth application-default login
認証が成功したことを確認するには、出力に Credentials saved to file: [/path/to/credentials.json]
という行が含まれている必要があります。