Ce guide explique comment configurer un serveur Apache afin d'utiliser une clé Cloud HSM pour la signature TLS sur Debian 11 (Bullseye). Vous devrez peut-être modifier ces commandes pour qu'elles fonctionnent avec votre OS ou votre distribution Linux.
Vous trouverez une version de ce tutoriel basée sur un plan Terraform dans le dépôt GitHub kms-solutions.
Avant de commencer
Au préalable, terminez la configuration décrite dans la section Configuration d'OpenSSL.
Une fois la configuration d'OpenSSL terminée, assurez-vous qu'une version récente d'Apache est installée :
sudo apt-get update
sudo apt-get install apache2
Configuration
Créer une clé de signature hébergée par Cloud KMS
Créez une clé de signature EC-P256-SHA256
Cloud KMS dans votre projetGoogle Cloud , dans le trousseau de clés que vous avez précédemment configuré pour 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"
Créer un certificat autosigné avec OpenSSL
Générez un certificat autosigné avec la clé de signature hébergée par Cloud KMS. Vous pouvez utiliser OpenSSL pour utiliser un URI PKCS #11 au lieu d'un chemin de fichier et identifier la clé par son libellé. Dans la bibliothèque PKCS #11 de Cloud KMS, le libellé de clé correspond au nom 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
Remplacez les éléments suivants :
CERTIFICATE_NAME
: nom du certificat.DIGEST_FLAG
: algorithme de condensé utilisé par la clé de signature asymétrique. Utilisez-sha256
,-sha384
ou-sha512
en fonction de la clé.PKCS_KEY_TYPE
: type d'identifiant utilisé pour identifier la clé. Pour utiliser la dernière version de la clé, utilisezpkcs11:object
avec le nom de la clé. Pour utiliser une version de clé spécifique, utilisezpkcs11:id
avec l'ID de ressource complet de la version de clé.KEY_IDENTIFIER
: identifiant de la clé. Si vous utilisezpkcs11:object
, utilisez le nom de la clé (par exemple,KEY_NAME
). Si vous utilisezpkcs11:id
, utilisez l'ID de ressource complet de la clé ou de la version de la clé (projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/KEY_VERSION
, par exemple).PATH_TO_CERTIFICATE
: chemin d'accès au fichier de certificat.
Si cette commande échoue, il est possible que PKCS11_MODULE_PATH
ait été défini de manière incorrecte ou que vous ne disposiez pas des autorisations nécessaires pour utiliser la clé de signature Cloud KMS.
Vous devriez maintenant avoir un certificat semblable à celui-ci :
-----BEGIN CERTIFICATE-----
...
...
...
-----END CERTIFICATE-----
Configurer le serveur Apache
Créez un répertoire dans
/etc/apache2
pour stocker votre certificat autosigné dans:sudo mkdir /etc/apache2/ssl sudo mv ca.cert /etc/apache2/ssl
Modifiez les fichiers de configuration de l'hôte virtuel
000-default.conf
situés dans/etc/apache2/sites-available
pour fournir le chemin du fichier de certificat et vous assurer que SSLEngine est activé.Voici un exemple de configuration écoutant sur le port 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>
Assurez-vous qu'Apache exporte correctement les variables d'environnement en les ajoutant au fichier
/etc/apache2/envvars
à l'aide de l'éditeur de texte de votre choix. Vous devrez peut-être modifier le fichier en tant que racine à l'aide desudo
. Ajoutez les lignes suivantes à la fin du fichier: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
Remplacez les éléments suivants :
PATH_TO_LIBKMSP11
: chemin d'accès àlibkmsp11.so
.PATH_TO_PKCS11_CONFIG
: chemin d'accès àpkcs11-config.yaml
.
GRPC_ENABLE_FORK_SUPPORT
est nécessaire pour que gRPC prenne en charge la duplication et exécute correctement la bibliothèque PKCS #11 de Cloud KMS au sein du serveur Apache.Si vous souhaitez vous authentifier à l'aide d'une clé de compte de service, vous devez également exporter une valeur pour la variable d'environnement
GOOGLE_APPLICATION_CREDENTIALS
.
Exécuter votre serveur
Activez le module SSL Apache, activez la configuration virtualhost et ajoutez une page Web de test dans votre dossier 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
Redémarrez votre serveur Apache et vérifiez que la configuration fonctionne comme prévu en procédant au test avec curl
. L'option --insecure
est nécessaire pour ignorer les vérifications de certificat autosigné.
sudo systemctl restart apache2
curl -v --insecure https://127.0.0.1
Si vous rencontrez des erreurs, le journal d'erreurs Apache est un bon point de départ pour identifier le problème. Les problèmes d'authentification sont une source courante d'erreurs. Si des erreurs PERMISSION_DENIED
s'affichent, assurez-vous d'être entièrement authentifié et que le fichier d'identifiants dispose des autorisations appropriées. Pour vous assurer d'être entièrement authentifié, exécutez la commande suivante:
gcloud auth application-default login
Pour vérifier que l'authentification a abouti, la sortie doit inclure la ligne Credentials saved to file: [/path/to/credentials.json]
.