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:
- Artikel: Sie können jetzt Microsoft Windows-Artefakte mit Schlüsseln signieren, die durch Cloud HSM geschützt sind, verfügbar auf dem Google Cloud Blog.
- GCP-Dokumentation: Provider for Microsoft Cryptography API: Next Generation (CNG)
- GCP-Dokumentation: CNG-Provider und SignTool verwenden, 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.