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:
- Artikel: You can now sign Microsoft Windows artifacts with keys protected by Cloud HSM, verfügbar auf Google Cloud Blog.
- GCP Docs: Provider für Microsoft Cryptography API: Next Generation (CNG)
- GCP Docs: Verwenden Sie CNG Provider und SignTool, um Windows-Artefakte zu signieren
Es tut uns leid, dass Sie hier für Ihren Bedarf nichts Passendes gefunden haben.
Helfen Sie uns, diesen Artikel zu verbessern. Schreiben Sie uns bitte, was Sie hier erwartet und nicht erfahren haben.