本指南介绍了如何设置 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 服务器
在
/etc/apache2
中创建目录以存储您的自签名请求 证书 ID:sudo mkdir /etc/apache2/ssl sudo mv ca.cert /etc/apache2/ssl
修改位于以下位置的
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>
将环境变量添加到
/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_LIBKMSP11
:libkmsp11.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]
行。