Cloud HSM-Schlüssel zum Bereitstellen von Apache-Traffic verwenden

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 Sie pkcs11:object mit dem Namen des Schlüssels. Bis Wenn Sie eine bestimmte Schlüsselversion verwenden, verwenden Sie pkcs11:id mit der vollständigen Ressourcen-ID der Schlüsselversion.
  • KEY_IDENTIFIER: Eine Kennung für den Schlüssel. Wenn Sie pkcs11:object verwenden, verwenden Sie den Namen des Schlüssels, z. B. KEY_NAME. Wenn Sie pkcs11: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

  1. 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
    
  2. 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>
    
  3. 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 mit sudo 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 zu libkmsp11.so.
    • PATH_TO_PKCS11_CONFIG: Pfad zu pkcs11-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].