Kód aláírása a Google Cloud KMS segítségével
A Google Cloud KMS szolgáltatásával FIPS 140-2 Level 3 tanúsítvánnyal rendelkező felhőalapú HSM-et kap. Biztonságosan, gyorsan és bárhonnan aláírhatja a kódot. Az aláírások számához kötött költségek ráadásul nagyon kedvezőek. A Cloud KMS támogatja az aláírást a Microsoft Cryptography API: Next Generation (CNG) segítségével.
A kód beállításához és aláírásához a következő lépéseket kell végrehajtani, amelyeket sorban végigvesszük:
- Telepítse a CNG providert
- Hozzon létre Key Ringet és privát kulcsot
- Hozzon létre CSR-t és szerezzen tanúsítványt
- Írja alá az szoftverkomponensét
Töltse le a CNG providert és a szükséges csomagokat
A Google közzétette a CNG providerét a saját GitHub-tárolójában. Ezeket a fájlokat a mellékelt .msi telepítő segítségével telepítheti a Windows rendszerébe. Ez a program YAML-fájl formájú konfigurációt igényel, amelyet az útmutató egyik lépésében talál.
Most lépjen át Linuxra (használhatja a Windows alatti WSL-t is). A privát kulcs és a CSR létrehozását javasoljuk Linux alatt elvégezni; bár a Windows alatti PowerShellbe is telepíthető az OpenSSL, Linux alatt kisebb az esélye a bonyodalmaknak. A hivatalos Google-útmutató is így jár el.
A felhővel való kommunikációhoz a google-cloud-cli csomagban található gcloud alkalmazást fogjuk használni.
Hozzon létre Key Ringet és privát kulcsot a Cloud HSM-ben
A következő lépéseket hajtsa végre Linux alatt. Hozzon létre egy új kulcscsomót (Key Ring) a Cloud Key Management Service (KMS) API-hoz, és hozzon létre benne egy privát kulcsot, amelyet hardveresen véd a Cloud HSM. Válasszon aszimmetrikus RSA algoritmust az aláíráshoz és 3072 bites kulcshosszt, mert a SignTool nem tud EC kulcsokat használni a Google Cloud KMS CNG-vel.
Először jelentkezzen be Linux alatt a Google-fiókjába, és autorizálja a munkamenetet (ez a Windows PowerShellre is vonatkozik):
gcloud auth application-default login
Így hozhat létre Key Ringet a privát kulcs elhelyezéséhez:
gcloud kms keyrings create KEYRING-NAME \
--location=europe-west3 \
--project=PROJECT-NAME
Ebben a Key Ringben fogjuk elhelyezni a privát kulcsot. A kulcsot szintén a gcloud segédprogrammal generáljuk; a neveket (NAGYBETŰKKEL) töltse ki a valóságnak megfelelően (GCP-projektnév) és az ön által használt elnevezésekkel.
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
Miután létrehozta a kulcs első verzióját, javasoljuk a Cloud Console részleteinél a Copy resource name (forrásnév másolása) érték kimásolását, mert erre lesz szüksége KEY_ID-ként. Így néz ki: projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/1
Most térjen vissza Windowsra, ahol létre kell hoznia egy config.yaml fájlt a KMS-integráció konfigurációjához. A PowerShellbe írja be a következőt:
$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)
CSR létrehozása
HSM-be természetesen nem lehet privát kulccsal együtt tanúsítványt importálni, ahogy a kulcspárt sem lehet exportálni. A privát kulcsnak és a CSR-nak tehát a HSM-ben kell létrejönnie; a CSR-t ezután nyújtsa be az SSLmarkethez, és a DigiCert aláírja. A kiadott tanúsítvány importálása a következő lépésben történik.
A CSR létrehozását legjobb Linux alatt elvégezni a libengine-pkcs11-openssl, a libkmsp11 és az API használatával. Természetesen szüksége lesz a google-cloud-cli csomagra is.
A CSR létrehozása így néz ki (a pkcs11:object= után töltse ki a kulcs nevét (CryptoKey) a GCP szerint):
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
A DigiCert számára készült kérelem ezután a cs-request.csr fájlban lesz abban a mappában, ahol éppen dolgozik. Küldje el nekünk ezt a CSR-t.
Tanúsítvány beszerzése
Az elkészített CSR-t hagyja aláíratni a DigiCerttel, és visszakap egy új Code Signing tanúsítványt. Ezt nem kell a Google Cloud Console-ba feltöltenie; elegendő, hogy a privát kulcs ott található. A tanúsítvánnyal Windows alatt, helyben fogunk dolgozni — mentse el a lemezen fájlként.
Írja alá az szoftverkomponenseit
Folytassuk Windows alatt. A Google 2024-től hivatalos Cloud KMS CNG Providert adott ki, amely Windowsban a Crypto Service Provider (CSP) / Key Storage Provider (KSP) szerepkörben Google Cloud KMS Provider néven regisztrálódik. Ennek köszönhetően a SignTool a felhőben tárolt kulcsokat is használhatja, nem csak a helyi tokent.
Az aláíráshoz a Windows SDK SignTool-ját és az eszköz x64-es változatát használjuk; javasoljuk a legújabb verziót. Győződjön meg róla, hogy a megfelelő paramétereket adja meg (a példa alatti magyarázat szerint).
Példa az aláírásra SignTool és PowerShell segítségével:
& $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"
Magyarázat:
- /f PATH_TO_CERT a Code Signing tanúsítványt tartalmazó fájl (a nyilvános rész). Ha HSM-re kérte a kiállítást, tőlünk így, egybeállítva kapja meg.
- /csp a használandó CNG providert adja meg, mivel Windows alatt több is lehet. A Google Cloud KMS Provider ugyanúgy regisztrált, mint például a „Microsoft Software Key Storage Provider”.
- /kc (Key Container) a konkrét kulcs és annak verziója (KMS CryptoKeyVersion) — ez felel meg a korábban említett KEY_ID-nek.
Az aláírás során látható lesz, melyik tanúsítványt választotta a SignTool és mi lett az eredmény. Mivel a SignToolnak időnként gondja van a tanúsítvány felhőbeli privát kulcshoz való társításával (CSP/KSP-n keresztül), javasoljuk, hogy a tanúsítvány legyen helyben, fájlban. A szervezet neve vagy az SHA1-hash szerinti választás problémás, és többnyire nem működik; a fájlként megadott tanúsítvány viszont működött.
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
Bónusz – aláírás ellenőrzése
Az újonnan létrehozott digitális aláírást a SignTool-lal is ellenőrizhetjük.
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
Az EXE fájl aláírásának ellenőrzése sikeres!
Források:
- Cikk: You can now sign Microsoft Windows artifacts with keys protected by Cloud HSM – elérhető a Google Cloud Blogon.
- GCP Docs: Provider for Microsoft Cryptography API: Next Generation (CNG)
- GCP Docs: Use CNG Provider and SignTool to sign Windows artifacts
Sajnáljuk, hogy nem kapott választ.
Segítene a cikk jobbá tételében? Írja meg nekünk mire nem kapott választ.