Dieser Leitfaden enthält Anweisungen zum Einrichten eines Apache-Servers zur Verwendung eines Cloud HSM-Schlüssel für die TLS-Signatur unter Debian 11 (Bullseye). Möglicherweise müssen Sie können Sie diese Befehle an Ihr Betriebssystem oder Ihre Linux-Distribution anpassen.
Eine Terraform-basierte Blueprint-Version dieser Anleitung finden Sie in der kms-solutions GitHub-Repository
Hinweise
Führen Sie zuerst die in OpenSSL-Einrichtung dokumentierte Konfiguration aus.
Prüfen Sie nach Abschluss der OpenSSL-Einrichtung, ob eine aktuelle Version von Apache installiert ist:
sudo apt-get update
sudo apt-get install apache2
Konfiguration
Von Cloud KMS gehosteten Signaturschlüssel erstellen
Erstellen Sie einen EC-P256-SHA256
-Signaturschlüssel für Cloud KMS in Ihrem
Google Cloud-Projekt im zuvor konfigurierten Schlüsselbund
für 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"
Selbst signiertes Zertifikat mit OpenSSL erstellen
Generieren Sie ein selbst signiertes Zertifikat mit dem von Cloud KMS gehosteten Signaturschlüssel. Sie können OpenSSL verwenden, um einen PKCS #11-URI anstelle eines Dateipfads zu verwenden und identifizieren den Schlüssel anhand seiner Beschriftung. Im Cloud KMS PKCS #11 ist das Schlüssellabel der CryptoKey-Name.
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
Ersetzen Sie Folgendes:
CERTIFICATE_NAME
ist ein Name für das Zertifikat.DIGEST_FLAG
: der von der asymmetrischen Signatur verwendete Digest-Algorithmus . Verwenden Sie je nach Schlüssel-sha256
,-sha384
oder-sha512
.PKCS_KEY_TYPE
: der ID-Typ, der zur Identifizierung des Schlüssels verwendet wird. Wenn Sie die neueste Schlüsselversion verwenden möchten, verwenden Siepkcs11:object
mit dem Namen des Schlüssels. Bis Wenn Sie eine bestimmte Schlüsselversion verwenden, verwenden Siepkcs11:id
mit der vollständigen Ressourcen-ID der Schlüsselversion.KEY_IDENTIFIER
: Eine Kennung für den Schlüssel. Wenn Siepkcs11:object
verwenden, verwenden Sie den Namen des Schlüssels, z. B.KEY_NAME
. Wenn Siepkcs11:id
verwenden, geben Sie die vollständige Ressourcen-ID des Schlüssels oder Schlüssels an. Version, z. B.projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/KEY_VERSION
.PATH_TO_CERTIFICATE
: Der Pfad, unter dem Sie die Zertifikatsdatei speichern möchten.
Wenn dieser Befehl fehlschlägt, wurde PKCS11_MODULE_PATH
möglicherweise falsch festgelegt oder Sie haben nicht die erforderlichen Berechtigungen zur Verwendung des Cloud KMS-Signaturschlüssels.
Sie sollten jetzt ein Zertifikat haben, das so aussieht:
-----BEGIN CERTIFICATE-----
...
...
...
-----END CERTIFICATE-----
Apache-Server einrichten
Erstellen Sie ein Verzeichnis in
/etc/apache2
, in dem Sie Ihr selbst signiertes Zertifikat speichern können:sudo mkdir /etc/apache2/ssl sudo mv ca.cert /etc/apache2/ssl
Bearbeiten Sie die virtuellen Hostkonfigurationsdateien
000-default.conf
in/etc/apache2/sites-available
, um den Pfad der Zertifikatsdatei anzugeben und sicherzustellen, dass SSLEngine aktiviert ist.Hier ist eine Beispielkonfiguration, die Port 443 überwacht:
<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>
Achten Sie darauf, dass Apache die Umgebungsvariablen korrekt exportiert, indem Sie sie Erstellen Sie die Datei
/etc/apache2/envvars
mit dem Texteditor Ihrer Wahl. Möglicherweise müssen Sie die Datei mitsudo
als Root bearbeiten. Fügen Sie am Ende der Datei die folgenden Zeilen hinzu: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
Ersetzen Sie Folgendes:
PATH_TO_LIBKMSP11
: der Pfad zulibkmsp11.so
.PATH_TO_PKCS11_CONFIG
: Pfad zupkcs11-config.yaml
.
GRPC_ENABLE_FORK_SUPPORT
ist erforderlich, damit gRPC eine Fork-Unterstützung enthält und die Cloud KMS PKCS #11-Bibliothek als Teil des Apache-Servers korrekt ausführt.Wenn Sie sich mit einem Dienstkontoschlüssel authentifizieren möchten, müssen Sie auch einen Wert für die Umgebungsvariable
GOOGLE_APPLICATION_CREDENTIALS
exportieren.
Server ausführen
Aktivieren Sie das Apache SSL-Modul, aktivieren Sie die virtualhost-Konfiguration und fügen Sie ein Webseite in Ihrem DocumentRoot-Ordner testen:
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
Starten Sie Ihren Apache-Server neu und testen Sie mit curl
, ob die Konfiguration wie erwartet funktioniert. Das Flag --insecure
ist erforderlich, um selbst signierte Zertifikatsprüfungen zu ignorieren.
sudo systemctl restart apache2
curl -v --insecure https://127.0.0.1
Wenn Fehler auftreten, können Sie das Apache-Fehlerlog aufrufen, um den Fehler zu sehen. Authentifizierungsprobleme sind eine häufige Fehlerquelle. Wenn PERMISSION_DENIED
-Fehler auftreten, prüfen Sie, ob Sie vollständig authentifiziert sind und die Anmeldedatendatei die richtigen Berechtigungen hat. Führen Sie den folgenden Befehl aus, um sicherzustellen, dass Sie vollständig authentifiziert sind:
gcloud auth application-default login
Um zu bestätigen, dass die Authentifizierung erfolgreich war, sollte die Ausgabe den Parameter
Zeile Credentials saved to file: [/path/to/credentials.json]
.