Questa guida fornisce istruzioni per configurare un server Apache per utilizzare un Chiave Cloud HSM per la firma TLS in Debian 11 (Bullseye). Potresti dover modificare questi comandi affinché siano compatibili con la distribuzione del tuo sistema operativo o Linux.
Puoi trovare una versione del progetto basata su Terraform di questo tutorial nel Repository GitHub di kms-solutions.
Prima di iniziare
Come prerequisito, completa la configurazione descritta in Configurazione di OpenSSL.
Una volta completata la configurazione di OpenSSL, assicurati che sia disponibile una versione recente di Apache installato:
sudo apt-get update
sudo apt-get install apache2
Configurazione
Crea una chiave di firma ospitata da Cloud KMS
Crea una chiave di firma Cloud KMS EC-P256-SHA256
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"
Creare un certificato autofirmato con OpenSSL
Genera un certificato autofirmato con Cloud KMS ospitata chiave di firma. Puoi usare OpenSSL per usare un URI PKCS #11 anziché un percorso file e identificare la chiave tramite la relativa etichetta. In Cloud KMS PKCS #11 di archiviazione, 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 firma asimmetrica chiave. Utilizza-sha256
,-sha384
o-sha512
a seconda della chiave.PKCS_KEY_TYPE
: 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 della chiave specifica, utilizzapkcs11:id
con l'ID risorsa completo della versione della chiave.KEY_IDENTIFIER
: un identificatore per la chiave. Se utilizzipkcs11:object
, usa il nome della chiave, ad esempioKEY_NAME
. Se usipkcs11:id
, usa l'ID risorsa completo della chiave o della chiave dell'immagine, 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, PKCS11_MODULE_PATH
potrebbe essere stato impostato in modo errato oppure
potresti non avere le autorizzazioni corrette per utilizzare Cloud KMS
chiave di firma.
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 i file autofirmati certificato in:sudo mkdir /etc/apache2/ssl sudo mv ca.cert /etc/apache2/ssl
Modifica i file di configurazione dell'host virtuale
000-default.conf
in/etc/apache2/sites-available
per fornire il percorso del file del certificato e assicurarti che SSLEngine sia attivo.Ecco un esempio di configurazione 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 esegua correttamente l'esportazione delle variabili di ambiente aggiungendole a il file
/etc/apache2/envvars
utilizzando l'editor di testo che preferisci. Potresti devi modificare il file come root utilizzandosudo
. Aggiungi le seguenti righe alla sezione 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 dilibkmsp11.so
.PATH_TO_PKCS11_CONFIG
: il percorso versopkcs11-config.yaml
.
GRPC_ENABLE_FORK_SUPPORT
è necessario per consentire a gRPC di includere il supporto per i fork e di eseguire correttamente la libreria PKCS #11 di Cloud KMS all'interno del server Apache.Se vuoi eseguire l'autenticazione utilizzando una chiave dell'account di servizio, devi inoltre esporta un valore per l'ambiente
GOOGLE_APPLICATION_CREDENTIALS
.
Esegui il server
Abilita il modulo SSL di Apache, abilita la configurazione virtualhost e aggiungi un 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
previsto. Il flag --insecure
è necessario per ignorare il certificato autofirmato
controlli.
sudo systemctl restart apache2
curl -v --insecure https://127.0.0.1
Se riscontri errori, il log degli errori di Apache è un buon punto di partenza per capire cosa è andato storto. I problemi di autenticazione sono una causa comune di errori. Se vedi errori PERMISSION_DENIED
, assicurati di aver eseguito l'autenticazione completa e che il file delle credenziali abbia le autorizzazioni corrette. Per assicurarti di essere completamente
autenticati:
gcloud auth application-default login
Per confermare l'esito positivo dell'autenticazione, l'output deve includere il comando
riga Credentials saved to file: [/path/to/credentials.json]
.