Questa guida fornisce istruzioni per configurare un server Apache per l'utilizzo di una chiave Cloud HSM per la firma TLS su Debian 11 (Bullseye). Potresti dover modificare questi comandi in modo che funzionino con il tuo sistema operativo o la distribuzione Linux.
Prima di iniziare
Come prerequisito, completa la configurazione documentata in OpenSSL setup.
Una volta completata la configurazione di OpenSSL, assicurati che sia installata una versione recente di Apache:
sudo apt-get update
sudo apt-get install apache2
Configurazione
Crea una chiave di firma ospitata su Cloud KMS
Crea una chiave di firma EC-P256-SHA256
di Cloud KMS nel tuo progetto Google Cloud, nel keyring configurato in precedenza per 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 certificato autofirmato con OpenSSL
Genera un certificato autofirmato con la chiave di firma ospitata da Cloud KMS. Puoi utilizzare OpenSSL per usare un URI PKCS #11 anziché un percorso file e identificare la chiave in base all'etichetta. Nella libreria PKCS #11 di Cloud KMS, l'etichetta della chiave è il nome della 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
Sostituisci quanto segue:
CERTIFICATE_NAME
: un nome per il certificato.DIGEST_FLAG
: l'algoritmo digest utilizzato dalla chiave di firma asimmetrica. Usa-sha256
,-sha384
o-sha512
a seconda della chiave.PKCS_KEY_TYPE
: il tipo di identificatore utilizzato per identificare la chiave. Per usare la versione più recente della chiave, usapkcs11:object
con il nome della chiave. Per utilizzare una versione specifica della chiave, usapkcs11:id
con l'ID risorsa completo della versione della chiave.KEY_IDENTIFIER
: un identificatore per la chiave. Se utilizzipkcs11:object
, utilizza il nome della chiave, ad esempioKEY_NAME
. Se utilizzipkcs11:id
, usa l'ID risorsa completo della chiave o della versione della chiave, ad esempioprojects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/KEY_VERSION
.PATH_TO_CERTIFICATE
: il percorso in cui vuoi salvare il file del certificato.
Se questo comando non riesce, è possibile che PKCS11_MODULE_PATH
non sia stato impostato correttamente o che tu non disponga delle autorizzazioni corrette per utilizzare la chiave di firma di Cloud KMS.
Ora dovresti avere un certificato simile al seguente:
-----BEGIN CERTIFICATE-----
...
...
...
-----END CERTIFICATE-----
Configura il server Apache
Crea una directory in
/etc/apache2
in cui archiviare il certificato autofirmato in:sudo mkdir /etc/apache2/ssl sudo mv ca.cert /etc/apache2/ssl
Modifica i
000-default.conf
file di configurazione dell'host virtuale che si trovano in/etc/apache2/sites-available
per fornire il percorso del file del certificato e assicurarti che SSLEngine sia attivo.Ecco una configurazione di esempio in ascolto sulla porta 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>
Assicurati che Apache esporta correttamente le variabili di ambiente aggiungendole al file
/etc/apache2/envvars
utilizzando l'editor di testo che preferisci. Potrebbe essere necessario modificare il file come root utilizzandosudo
. Aggiungi le seguenti righe alla fine del file: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
Sostituisci quanto segue:
PATH_TO_LIBKMSP11
: il percorso perlibkmsp11.so
.PATH_TO_PKCS11_CONFIG
: il percorso perpkcs11-config.yaml
.
GRPC_ENABLE_FORK_SUPPORT
è necessario affinché gRPC includa il supporto per le diramazioni ed esegua correttamente la libreria Cloud KMS PKCS #11 come parte del server Apache.Se vuoi eseguire l'autenticazione utilizzando una chiave dell'account di servizio, devi esportare anche un valore per la variabile di ambiente
GOOGLE_APPLICATION_CREDENTIALS
.
Esegui il server
Abilita il modulo SSL Apache, abilita la configurazione virtualhost e aggiungi una pagina web di test nella cartella 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
Riavvia il server Apache e verifica con curl
che la configurazione funzioni come previsto. Il flag --insecure
è necessario per ignorare i controlli dei certificati autofirmati.
sudo systemctl restart apache2
curl -v --insecure https://127.0.0.1
In caso di errori, il log degli errori Apache è un buon punto di partenza per capire cosa non ha funzionato. I problemi di autenticazione sono una fonte di errori comune. Se vedi errori PERMISSION_DENIED
, assicurati di essere completamente autenticato e che il file delle credenziali disponga delle autorizzazioni corrette. Per assicurarti di avere l'autenticazione completa, esegui questo comando:
gcloud auth application-default login
Per confermare che l'autenticazione è riuscita, l'output deve includere la riga Credentials saved to file: [/path/to/credentials.json]
.