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

Code Signing 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 aus signieren. Die Kosten pro Vorgang (Signaturen) sind zudem sehr günstig. Cloud KMS unterstützt das Signieren mit Microsoft Cryptography API: Next Generation (CNG).

Um Code einzurichten und zu signieren, müssen die folgenden Schritte durchgeführt werden, die wir nacheinander durchgehen:

  • Installieren Sie den CNG-Provider
  • Erstellen Sie einen Key Ring und einen privaten Schlüssel
  • Erstellen Sie ein 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 Repository auf GitHub veröffentlicht. Diese Dateien können mit der beiliegenden .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.

Gehen Sie nun zu Linux (Sie können WSL unter Windows verwenden). Es wird empfohlen, den privaten Schlüssel und das CSR unter Linux zu erstellen; auch wenn Sie OpenSSL auf Windows PowerShell installieren können, ist die Wahrscheinlichkeit, auf Komplikationen zu stoßen, unter Linux geringer. Dies folgt auch der offiziellen Anleitung von Google.

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

Erstellen Sie einen Key Ring und privaten Schlüssel im Cloud HSM

Führen Sie die folgenden Schritte unter Linux aus. Erstellen Sie einen neuen 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 zum Signieren und eine Schlüssellänge von 3072b, da SignTool keine EC-Schlüssel in Kombination mit Google Cloud KMS CNG verwenden kann.

Melden Sie sich zuerst unter Linux bei Ihrem Google-Konto an und autorisieren Sie die Session (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 Dienstprogramm gcloud; füllen Sie die Namen (in Großbuchstaben) entsprechend 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 seinem Detail in der Cloud Console den Copy resource name zu kopieren, da Sie diese Information für KEY_ID benötigen werden. Sie sieht so aus: projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/1

Nun zurück zu Windows, wo noch eine Datei config.yaml mit der Konfiguration für die 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 eines CSR

In das HSM kann selbstverständlich kein Zertifikat mit einem privaten Schlüssel importiert werden, ebenso wenig kann dieses Paar exportiert werden. Der private Schlüssel und das CSR müssen daher im HSM entstehen, das CSR geben Sie dann an SSLmarket und lassen es von DigiCert signieren. Der Import des ausgestellten Zertifikats erfolgt in einem weiteren Schritt.

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

Die Erstellung des CSR sieht dann so aus (geben Sie beim pkcs11:object= den Namen des Schlüssels (CryptoKey) gemäß 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

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

Erhalten des Zertifikats

Lassen Sie das erstellte CSR von DigiCert signieren und Sie erhalten ein neues Code Signing-Zertifikat. Dieses muss nicht in die Google Cloud Console eingefügt werden, dort genügt der private Schlüssel. Mit dem Zertifikat arbeiten wir lokal auf Windows, speichern Sie es irgendwo auf der Festplatte als Datei.

Signieren Sie Ihre Artefakte

Weiter geht es unter Windows. Google hat seit 2024 einen offiziellen Cloud KMS CNG Provider veröffentlicht, der sich als Crypto Service Provider (CSP) / Key Storage Provider (KSP) mit dem Namen Google Cloud KMS Provider in Windows registriert. Dadurch kann SignTool Schlüssel im Cloud verwenden und sie müssen nicht nur lokal auf einem Token sein.

Wir signieren mit SignTool aus dem Windows SDK und der x64-Version des Tools; die neueste Version wird empfohlen. 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 spezifischen CNG-Provider an, da es unter Windows mehrere geben kann. Google Cloud KMS Provider ist ebenso registriert wie z.B. „Microsoft Software Key Storage Provider“.
  • /kc (Key Container) ist der Pfad zum spezifischen Schlüssel und dessen Version (KMS CryptoKeyVersion), entspricht bereits erwähntem KEY_ID.

Beim Signieren sehen Sie welches Zertifikat für die Signatur ausgewählt wurde und das Ergebnis. Da SignTool Probleme mit der Verbindung des Zertifikats zu einem privaten Schlüssel in der Cloud über CSP/KSP hat, empfehle ich, das Zertifikat lokal in einer Datei gespeichert zu haben. Die Auswahl des Zertifikats über den Namen der Organisation oder den SHA1-Hash ist problematisch und meist nicht funktional; funktionsfähig war 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 - Überprüfung der Signatur

Die neu erstellte digitale Signatur kann auch mit SignTool überprüft werden.

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 ist erfolgreich signiert!

Quellen:

War für Sie dieser Artikel nützlich?