{"copy":"Kopieren","expand":"Einblenden","collapse":"Ausblenden","copy_success":"Kopiert!","copy_error":"Kopieren fehlgeschlagen!"}

Signieren von Code mit Google Cloud KMS

Mit dem Google Cloud KMS-Dienst erhalten Sie ein Cloud-HSM mit FIPS 140-2 Level 3-Zertifizierung. Sie können Code sicher, schnell und von überall signieren. Die Kosten für die Anzahl der Operationen (Signaturen) sind zudem sehr günstig. Cloud KMS unterstützt das Signieren mit der Microsoft Cryptography API: Next Generation (CNG).

Um den Code einzurichten und zu signieren, müssen folgende Schritte durchgeführt werden, die wir schrittweise durchgehen:

  • Installieren Sie den CNG-Provider
  • Erstellen Sie einen Schlüsselsatz und einen privaten Schlüssel
  • Erstellen Sie eine CSR und erhalten Sie ein Zertifikat
  • Signieren Sie Ihr Artefakt

Laden Sie den CNG-Provider und die benötigten Pakete herunter

Google hat seinen CNG-Provider in seinem Repository auf GitHub veröffentlicht. Diese Dateien können mit der bereitgestellten .msi-Installationsdatei auf Ihrem Windows-System installiert werden. Dieses Programm benötigt eine Konfiguration in Form einer YAML-Datei, die Sie in einem der Schritte dieser Anleitung finden.

Wechseln Sie nun zu Linux (Sie können WSL unter Windows verwenden). Die Erstellung des privaten Schlüssels und des CSR wird empfohlen, unter Linux durchzuführen; obwohl Sie unter Windows OpenSSL in PowerShell installieren können, ist die Wahrscheinlichkeit, auf Komplikationen zu stoßen, unter Linux geringer. So geht auch das offizielle Google-Handbuch vor.

Zur Kommunikation mit der Cloud verwenden wir die Anwendung gcloud aus dem Paket google-cloud-cli.

Erstellen Sie einen Schlüsselsatz und einen privaten Schlüssel in Cloud HSM

Führen Sie die folgenden Schritte unter Linux aus. Erstellen Sie einen neuen Schlüsselsatz (Key Ring) für den Cloud Key Management Service (KMS) API und erstellen Sie darin einen privaten Schlüssel, der hardwaremäßig durch Cloud HSM geschützt ist. Wählen Sie den asymmetrischen RSA-Algorithmus für die Signatur und die Schlüssellänge von 3072b, da SignTool EC-Schlüssel in Verbindung mit Google Cloud KMS CNG nicht verwenden kann.

Melden Sie sich zuerst unter Linux bei Ihrem Google-Konto an und autorisieren Sie die Sitzung (gilt auch für Windows PowerShell): gcloud auth application-default login

So erstellen Sie einen Key Ring für die Platzierung des privaten Schlüssels: gcloud kms keyrings create KEYRING-NAME \
--location=europe-west3 \
--project=PROJECT-NAME

In diesem Key Ring platzieren wir den privaten Schlüssel. Diesen generieren wir ebenfalls mit dem Tool gcloud; die Namen (in Großbuchstaben) füllen Sie gemäß der Realität (Projektname in GCP) und Ihrer Benennung aus.

gcloud kms keys create KEY-NAME --keyring=KEYRING-NAME --location=europe-west3 --purpose=asymmetric-signing --protection-level=hsm --default-algorithm=rsa-sign-pkcs1-3072-sha256 --project=PROJECT-NAME

Nachdem Sie die erste Version des Schlüssels erstellt haben, empfehlen wir, in dessen Detail in der Cloud Console den Copy resource name zu kopieren, da Sie diese Information für KEY_ID benötigen. Er sieht so aus: projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/1

Nun zurück zu Windows, wo noch die Datei config.yaml mit der Konfiguration für KMS-Integration erstellt werden muss. Geben Sie in PowerShell folgendes ein: $yaml = @"
resources:
- crypto_key_version: "projects/PROJECT-NAME/locations/europe-west3/keyRings/KEYRING-NAME/cryptoKeys/KEY-NAME/cryptoKeyVersions/1" "@

$yaml = $yaml -replace "`t"," "

$utf8NoBom = New-Object System.Text.UTF8Encoding($false)
[System.IO.File]::WriteAllText('C:\Windows\KMSCNG\config.yaml', $yaml, $utf8NoBom)

Erstellung von CSR

In das HSM kann natürlich kein Zertifikat mit privatem Schlüssel importiert werden, ebenso kann dieses Paar nicht exportiert werden. Der private Schlüssel und das CSR müssen daher im HSM entstehen, das CSR geben Sie dann an SSLmarket weiter und lassen es von DigiCert signieren. Der Import des ausgestellten Zertifikats erfolgt im nächsten Schritt.

Die Erstellung des CSR wird am besten unter Linux durchgeführt, mithilfe der Bibliothek libengine-pkcs11-openssl, libkmsp11 und API. Selbstverständlich benötigen Sie auch das Paket google-cloud-cli.

Die Erstellung des CSR sieht dann folgendermaßen aus (hinter pkcs11:object= ergänzen Sie den Schlüssel-Namen (CryptoKey) gemäß GCP): openssl req -new \
-subj "/C=CZ/O=ZONER /CN=ZONER" \
-sha256 -engine pkcs11 -keyform engine \
-key "pkcs11:object=KEY_NAME;type=private" \
-reqexts v3_req -config <(cat /etc/ssl/openssl.cnf; printf "\n[v3_req]\nextendedKeyUsage=codeSigning\n") \
-out cs-request.csr

Den Antrag für DigiCert haben Sie dann in der Datei cs-request.csr im Ordner, in dem Sie gerade arbeiten. Senden Sie uns dieses CSR.

Einholen des Zertifikats

Lassen Sie das erstellte CSR von DigiCert signieren und erhalten Sie ein neues Code-Signing-Zertifikat zurück. Dieses muss nicht in die Google Cloud Console eingefügt werden, dort reicht es, den privaten Schlüssel zu haben. Mit dem Zertifikat werden wir unter Windows lokal arbeiten, speichern Sie es irgendwo auf Ihrer Festplatte als Datei.

Signieren Sie Ihre Artefakte

Wir fahren unter Windows fort. Google hat ab 2024 den offiziellen Cloud KMS CNG Provider veröffentlicht, der in Windows als Crypto Service Provider (CSP) / Key Storage Provider (KSP) mit dem Namen Google Cloud KMS Provider registriert wird. Dadurch kann SignTool den/die Schlüssel in der Cloud verwenden und muss nicht nur lokal auf einem Token vorhanden sein.

Wir signieren mit SignTool aus dem Windows SDK und der x64-Version des Tools; wir empfehlen die neueste Version. Stellen Sie sicher, dass Sie die richtigen Parameter eingeben (siehe Erklärung unter dem Beispiel).

Beispiel für das Signieren mit SignTool und PowerShell: & $SignTool sign `
/v /debug `
/fd sha256 /td sha256 `
/tr http://timestamp.digicert.com `
/f "PATH_TO_CERT" `
/csp "Google Cloud KMS Provider" `
/kc "projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/1" `
"PATH_TO_FILE_TO_SIGN"

Erklärung:

  • /f PATH_TO_CERT ist der Pfad zur Datei mit dem Code-Signing-Zertifikat (öffentlicher Teil). So kombiniert erhalten Sie es von uns, wenn Sie es für HSM ausstellen lassen.
  • /csp gibt den spezifischen CNG-Provider an, da in Windows mehrere vorhanden sein können. Der Google Cloud KMS Provider ist registriert ebenso wie z.B. „Microsoft Software Key Storage Provider“.
  • /kc (Key Container) ist der Pfad zum spezifischen Schlüssel und dessen Version (KMS CryptoKeyVersion), entspricht der bereits erwähnten KEY_ID.

Beim Signieren sehen Sie welches Zertifikat zum Signieren gewählt wurde und das Ergebnis. Da SignTool ein Problem mit der Bindung des Zertifikats an den privaten Schlüssel in der Cloud (über CSP/KSP) hat, empfehlen wir, das Zertifikat lokal in einer Datei zu speichern. Die Wahl über den Namen der Organisation oder den SHA1-Hash des Zertifikats ist problematisch und meist nicht funktionsfähig; ein Zertifikat in einer Datei funktionierte jedoch.

Das folgende Zertifikat wurde ausgewählt:
Ausgestellt für: ZONER a.s.
Ausgestellt von: DigiCert Trusted G4 Code Signing RSA4096 SHA384 2021 CA1
Gültig bis: Mi Nov 12 01:59:59 2025
SHA1-Hash: F9BC96AC1764AD9F2072780FFB64940538A3B292

Die folgenden zusätzlichen Zertifikate werden beigefügt:
Ausgestellt für: DigiCert Trusted G4 Code Signing RSA4096 SHA384 2021 CA1
Ausgestellt von: DigiCert Trusted Root G4
Gültig bis: Di Apr 29 01:59:59 2036
SHA1-Hash: 7B0F360B775F76C94A12CA48445AA2D2A875701C

Zusätzlicher Speicher erfolgreich hinzugefügt
Erfolgreich signiert: C:\Users\jindrich.zechmeister\HelloSign.exe

Anzahl der erfolgreich signierten Dateien: 1
Anzahl der Warnungen: 0
Anzahl der Fehler: 0

Boni - Überprüfung der Signatur

Die neu erstellte digitale Signatur können wir auch mit SignTool überprüfen.

PS C:\Users\jindrich.zechmeister> signtool verify /pa c:\Users\jindrich.zechmeister\App.exe
Datei: c:\Users\jindrich.zechmeister\App.exe
Index Algorithmus Zeitstempel
========================================
0 sha256 RFC3161
Erfolgreich überprüft: c:\Users\jindrich.zechmeister\App.exe

Die signierte EXE-Datei ist erfolgreich signiert!

Quellen:

War für Sie dieser Artikel nützlich?