使用 Cloud HSM 密钥处理 Apache 流量

本指南介绍了如何设置 Apache 服务器以使用 用于 Debian 11 (Bullseye) 上的 TLS 签名的 Cloud HSM 密钥。您可能需要 修改这些命令,以配合您的操作系统或 Linux 发行版。

您可以在 kms-solutions GitHub 代码库

准备工作

您必须先完成 OpenSSL 设置

OpenSSL 设置完成后,请确保安装了最新版本的 Apache:

sudo apt-get update
sudo apt-get install apache2

配置

创建 Cloud KMS 托管的签名密钥

创建一个 Cloud KMSEC-P256-SHA256签名密钥 Google Cloud 项目(位于您之前配置的密钥环中) :

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 和密钥名称。接收者 使用特定密钥版本,请使用 pkcs11:id 以及相应密钥的完整资源 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 服务器

  1. /etc/apache2 中创建目录以存储您的自签名请求 证书 ID:

    sudo mkdir /etc/apache2/ssl
    sudo mv ca.cert /etc/apache2/ssl
    
  2. 修改位于以下位置的 000-default.conf 虚拟主机配置文件: /etc/apache2/sites-available,用于提供证书文件路径和 确保 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>
    
  3. 将环境变量添加到 /etc/apache2/envvars 文件。您可能会 需要使用 sudo 以根用户身份修改该文件。将以下代码行添加到 :

    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_LIBKMSP11libkmsp11.so 的路径。
    • PATH_TO_PKCS11_CONFIG:指向 pkcs11-config.yaml

    gRPC 需要 GRPC_ENABLE_FORK_SUPPORT 才能添加分支支持,并作为 Apache 服务器的一部分正确运行 Cloud KMS PKCS #11 库。

    如果您想使用服务账号密钥进行身份验证,还必须 导出 GOOGLE_APPLICATION_CREDENTIALS 环境的值 变量。

运行服务器

启用 Apache SSL 模块,启用 virtualhost 配置,并添加 在您的 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] 行。