{"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-Service erhalten Sie ein cloudbasiertes HSM mit FIPS 140-2 Level 3-Zertifizierung. Sie können Code sicher, schnell und von überall signieren. Die Kosten pro Operation (Signaturen) sind zudem sehr günstig. Cloud KMS unterstützt das Signieren mit der Microsoft Cryptography API: Next Generation (CNG).

Für die Einrichtung und Signierung von Code sind die folgenden Schritte erforderlich, die wir nacheinander durchgehen:

  • Installieren Sie den CNG-Provider
  • Erstellen Sie einen Schlüsselsatz (Key Ring) 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 erforderlichen Pakete herunter

Google hat seinen CNG-Provider in seinem GitHub-Repository veröffentlicht. Diese Dateien können mit der beigefügten .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 in Windows nutzen). Wir empfehlen, die Erstellung eines privaten Schlüssels und einer CSR unter Linux durchzuführen; obwohl Sie OpenSSL in PowerShell unter Windows installieren können, ist die Wahrscheinlichkeit, auf Komplikationen zu stoßen, unter Linux geringer. Dies ist auch im offiziellen Google-Tutorial der Fall.

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

Erstellen Sie einen Key Ring 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 das Cloud Key Management Service (KMS) API und erstellen Sie darin einen privat geschützten Schlüssel, der hardwaregeschützt durch Cloud HSM ist. Wählen Sie einen asymmetrischen RSA-Algorithmus zum Signieren und eine Schlüssellänge von 3072b, da SignTool EC-Schlüssel nicht in Kombination mit Google Cloud KMS CNG verwenden kann.

Melden Sie sich zunächst unter Linux mit 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 Speicherung des privaten Schlüssels: gcloud kms keyrings create KEYRING-NAME \
--location=europe-west3 \
--project=PROJECT-NAME

In diesen Key Ring platzieren wir den privaten Schlüssel. Dieser wird ebenfalls mit dem gcloud-Tool generiert; fügen Sie die Bezeichnungen (in Großbuchstaben) entsprechend der Realität (Projektname in GCP) und Ihrer Benennung ein.

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

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

Nun zurück nach Windows, wo Sie noch eine config.yaml-Datei mit der Konfiguration für die KMS-Integration erstellen müssen. Geben Sie in PowerShell das Folgende 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 eines CSR

Es ist naturgemäß nicht möglich, ein Zertifikat mit einem privaten Schlüssel in HSM zu importieren, genauso wenig wie es möglich ist, dieses Paar zu exportieren. Der private Schlüssel und die CSR müssen daher in HSM erstellt werden, die CSR dann an SSLmarket übergeben und von DigiCert signieren lassen. Der Import des ausgestellten Zertifikats erfolgt in einem weiteren Schritt.

Die Erstellung des CSR empfehlen wir am besten unter Linux mit der Bibliothek libengine-pkcs11-openssl, libkmsp11 und der API. Natürlich benötigen Sie auch das Paket google-cloud-cli.

Die Erstellung des CSR sieht dann so aus (hinter pkcs11:object= geben Sie den Namen des Schlüssels (CryptoKey) entsprechend GCP an): 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.

Erhalt des Zertifikats

Lassen Sie DigiCert Ihr erstelltes CSR signieren, und Sie erhalten ein neues Code-Signing-Zertifikat. Dieses brauchen Sie nicht in die Google Cloud Console hochladen, es genügt, den privaten Schlüssel dort zu haben. Mit dem Zertifikat arbeiten wir lokal unter Windows, speichern Sie es als Datei irgendwo auf der Festplatte.

Signieren Sie Ihre Artefakte

Fahren Sie unter Windows fort. Google hat ab 2024 einen offiziellen Cloud KMS CNG Provider veröffentlicht, der unter Windows als Crypto Service Provider (CSP) / Key Storage Provider (KSP) mit dem Namen Google Cloud KMS Provider registriert wird. Dadurch kann SignTool Schlüssel im Cloud verwenden und muss sich nicht nur lokal auf einem Token befinden.

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 erhalten Sie es von uns, wenn Sie es für HSM ausstellen lassen.
  • /csp gibt den speziellen CNG-Provider an, da es unter Windows mehrere geben kann. Der Google Cloud KMS Provider ist genauso registriert wie z.B. „Microsoft Software Key Storage Provider“.
  • /kc (Key Container) ist der Pfad zu einem bestimmten Schlüssel und seiner Version (KMS CryptoKeyVersion), entspricht dem bereits erwähnten KEY_ID.

Beim Signieren sehen Sie welches Zertifikat für die Signatur ausgewählt wurde und das Ergebnis. Da SignTool ein Problem mit der Verknüpfung des Zertifikats mit dem privaten Schlüssel in der Cloud (über CSP/KSP) hat, empfehle ich, das Zertifikat lokal in einer Datei zu haben. Die Auswahl über den Namen der Organisation oder den SHA1-Hash des Zertifikats ist problematisch und meist nicht funktional; es funktionierte nur das Zertifikat in der Datei.

The following certificate was selected:
Issued to: ZONER a.s.
Issued by: DigiCert Trusted G4 Code Signing RSA4096 SHA384 2021 CA1
Expires: Wed Nov 12 01:59:59 2025
SHA1 hash: F9BC96AC1764AD9F2072780FFB64940538A3B292

The following additional certificates will be attached:
Issued to: DigiCert Trusted G4 Code Signing RSA4096 SHA384 2021 CA1
Issued by: DigiCert Trusted Root G4
Expires: Tue Apr 29 01:59:59 2036
SHA1 hash: 7B0F360B775F76C94A12CA48445AA2D2A875701C

Done Adding Additional Store
Successfully signed: C:\Users\jindrich.zechmeister\HelloSign.exe

Number of files successfully Signed: 1
Number of warnings: 0
Number of errors: 0

Bonus - Signaturüberprüfung

Den neu erstellten digitalen Signature können wir auch mit SignTool überprüfen.

PS C:\Users\jindrich.zechmeister> signtool verify /pa c:\Users\jindrich.zechmeister\App.exe
File: c:\Users\jindrich.zechmeister\App.exe
Index Algorithm Timestamp
========================================
0 sha256 RFC3161
Successfully verified: c:\Users\jindrich.zechmeister\App.exe

Die signierte EXE-Datei wurde erfolgreich signiert!

Quellen:

War für Sie dieser Artikel nützlich?