En esta guía, se proporcionan instrucciones para configurar un servidor Apache a fin de usar un Clave de Cloud HSM para la firma de TLS en Debian 11 (Bullseye). Es posible que debas modificar estos comandos para que funcionen con tu SO o distribución de Linux.
Puedes encontrar una versión de este instructivo basada en un modelo de Terraform en el repositorio de GitHub de kms-solutions.
Antes de comenzar
Como requisito previo, completa la configuración documentada en Configuración de OpenSSL.
Una vez que se complete la configuración de OpenSSL, asegúrate de instalar una versión reciente de Apache:
sudo apt-get update
sudo apt-get install apache2
Configuración
Crea una clave de firma alojada en Cloud KMS
Crea una clave de firma EC-P256-SHA256
de Cloud KMS en tu
Proyecto de Google Cloud, en el llavero de claves que configuraste previamente
para OpenSSL:
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"
Crea un certificado autofirmado con OpenSSL
Genera un certificado autofirmado con el servicio alojado en Cloud KMS clave de firma de Google. Puedes usar OpenSSL para utilizar un URI de PKCS #11 en lugar de una ruta de archivo. e identificarla por su etiqueta. En el PKCS #11 de Cloud KMS la etiqueta de la clave es el nombre de la 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
Reemplaza lo siguiente:
CERTIFICATE_NAME
: un nombre para el certificadoDIGEST_FLAG
: El algoritmo de resumen que usa la firma asimétrica . Usa-sha256
,-sha384
o-sha512
, según la clave.PKCS_KEY_TYPE
: Es el tipo de identificador que se usa para identificar la clave. Para usar la versión de clave más reciente, usapkcs11:object
con el nombre de la clave. Para usa una versión de clave específica, usapkcs11:id
con el ID de recurso completo de la y la versión de clave.KEY_IDENTIFIER
: Es un identificador para la clave. Si utilizaspkcs11:object
, usa el nombre de la clave, por ejemplo,KEY_NAME
. Si usaspkcs11:id
, utiliza el ID de recurso completo de la clave o clave. de la versión, por ejemplo,projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/KEY_VERSION
PATH_TO_CERTIFICATE
: Es la ruta de acceso en la que deseas guardar el archivo del certificado.
Si este comando falla, es posible que PKCS11_MODULE_PATH
no se haya establecido correctamente.
es posible que no tengas los permisos adecuados para usar Cloud KMS
clave de firma de Google.
Ahora debería tener un certificado que se vea así:
-----BEGIN CERTIFICATE-----
...
...
...
-----END CERTIFICATE-----
Configura el servidor Apache
Crea un directorio en
/etc/apache2
para almacenar tu certificado en:sudo mkdir /etc/apache2/ssl sudo mv ca.cert /etc/apache2/ssl
Edita los archivos de configuración de host virtual
000-default.conf
ubicados en/etc/apache2/sites-available
para proporcionar la ruta del archivo del certificado y asegurarse de que el SSLEngine esté activado.A continuación, se muestra una configuración de ejemplo que escucha en el puerto 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>
Asegúrate de que Apache exporte las variables de entorno de forma correcta; para ello, agrégalas al archivo
/etc/apache2/envvars
con el editor de texto que prefieras. Quizás deberás editar el archivo como raíz consudo
. Agrega las siguientes líneas al final del archivo: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
Reemplaza lo siguiente:
PATH_TO_LIBKMSP11
: Es la ruta de acceso alibkmsp11.so
.PATH_TO_PKCS11_CONFIG
: Es la ruta de acceso apkcs11-config.yaml
.
Se necesita
GRPC_ENABLE_FORK_SUPPORT
para que gRPC incluya compatibilidad con la bifurcación y ejecute de forma correcta la biblioteca PKCS #11 de Cloud KMS como parte del servidor Apache.Si quieres autenticarte con una clave de cuenta de servicio, también debes exporta un valor para el entorno
GOOGLE_APPLICATION_CREDENTIALS
de salida.
Ejecuta tu servidor
Habilita el módulo SSL de Apache, habilita la configuración de host virtual y agrega una página web de prueba en tu carpeta 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
Reinicia tu servidor Apache y prueba con curl
que la configuración funcione como se espera. La marca --insecure
es necesaria para ignorar las verificaciones de certificados autofirmados.
sudo systemctl restart apache2
curl -v --insecure https://127.0.0.1
Si encuentras algún error, el registro de errores de Apache es un buen punto de partida para ver qué salió mal. Los problemas de autenticación son una fuente común de errores. Si
verás los errores PERMISSION_DENIED
, asegúrate de estar completamente autenticado y
de que el archivo de credenciales tenga los permisos adecuados. Para asegurarte de que tienes la autenticación completa, ejecuta el siguiente comando:
gcloud auth application-default login
Para confirmar que la autenticación se realizó correctamente, el resultado debe incluir la línea Credentials saved to file: [/path/to/credentials.json]
.