{"copy":"Skop\u00edrova\u0165","expand":"Rozbali\u0165","collapse":"Zbali\u0165","copy_success":"Skop\u00edrovan\u00e9!","copy_error":"Kop\u00edrovanie zlyhalo!"}

Podpisovanie kódu pomocou Google Cloud KMS

So službou Google Cloud KMS získate cloudové HSM s certifikáciou FIPS 140-2 Level 3. Môžete podpisovať kód bezpečne, rýchlo a odkiaľkoľvek. Náklady za počet operácií (podpisov) sú navyše veľmi priaznivé. Cloud KMS podporuje podpisovanie pomocou Microsoft Cryptography API: Next Generation (CNG).

Pre nastavenie a podpísanie kódu je potrebné urobiť nasledujúce kroky, ktoré postupne prejdeme:

       
  • Nainštalujte CNG provider
  • Vytvorte Key Ring a privátny kľúč
  • Vytvorte CSR a získajte certifikát
  • Podpíšte svoj artefakt

Stiahnite si CNG provider a potrebné balíky

Google publikoval svoj CNG provider vo svojom repozitári na GitHubu. Tieto súbory je možné nainštalovať do vášho systému Windows pomocou priloženého inštalačného súboru .msi. Tento program potrebuje konfiguráciu v podobe súboru YAML, ktorý nájdete v jednom z krokov tohto návodu.

Teraz sa presuňte na Linux (môžete využiť WSL vo Windows). Vytvorenie privátneho kľúča a CSR odporúčame urobiť na Linuxe; hoci vo Windows môžete do PowerShellu nainštalovať OpenSSL, v Linuxe je menšia pravdepodobnosť, že narazíte na komplikáciu. Rovnako tak postupuje aj oficiálny návod od Google.

Pre komunikáciu s cloudom využijeme aplikáciu gcloud z balíka google-cloud-cli.

Vytvorte Key Ring a privátny kľúč v Cloud HSM

Nasledujúce kroky vykonajte na Linuxe. Vytvorte nový kľúčový zväzok (Key Ring) pre Cloud Key Management Service (KMS) API a v ňom vytvorte privátny kľúč, ktorý je hardvérovo chránený pomocou Cloud HSM. Vyberte asymetrický RSA algoritmus pre podpisovanie a dĺžku kľúča 3072b, pretože SignTool nevie používať EC kľúče v kombinácii s Google Cloud KMS CNG.

Najprv sa na Linuxe prihláste ku Google účtu a autorizujte session (platí aj pre Windows PowerShell): gcloud auth application-default login

Takto vytvoríte Key Ring pre umiestnenie privátneho kľúča: gcloud kms keyrings create KEYRING-NAME \
  --location=europe-west3 \
  --project=PROJECT-NAME

Do tohto Key Ringu umiestnime privátny kľúč. Ten vygenerujeme rovnako pomocou utility gcloud; názvy (veľkými písmenami) doplňte podľa reality (názov projektu v GCP) a vášho pomenovania.

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

Až si vytvoríte prvú verziu kľúča, odporúčame v jeho detaile v Cloud Console skopírovať Copy resource name, pretože tento údaj budete potrebovať pre KEY_ID. Vyzerá takto: projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/1

Teraz späť na Windows, kde bude potrebné vytvoriť ešte súbor config.yaml s konfiguráciou pre KMS integráciu. Do powershlellu zadajte nasledujúce:  $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)

Vytvorenie CSR

Do HSM prirodzene nie je možné importovať certifikát s privátnym kľúčom, rovnako ako nie je možné tento pár exportovať. Privátny kľúč a CSR teda musí vzniknúť v HSM, CSR potom dodáte SSLmarketu a necháte si ho od DigiCertu podpísať. Import vydaného certifikátu je v ďalšom kroku.

Vytvorenie CSR je najlepšie vykonať na Linuxe, pomocou knižnice libengine-pkcs11-openssl, libkmsp11 a API. Samozrejme budete potrebovať aj balík google-cloud-cli.

Vytvorenie CSR potom vyzerá takto (za pkcs11:object= doplňte názov kľúča (CryptoKey) podľa GCP): 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

Žiadosť pre DigiCert potom budete mať v súbore cs-request.csr v priečinku, kde práve pracujete. Toto CSR nám pošlite.

Získanie certifikátu

Vytvorené CSR si nechajte podpísať DigiCertom a dostanete späť nový Code Signing certifikát. Ten už nemusíte vkladať do Google Cloud Console, tam stačí mať privátny kľúč. S certifikátom budeme na Windows pracovať lokálne, uložte si ho niekam na disk ako súbor.

Podpíšte svoje artefakty

Pokračujeme na Windows. Google od roku 2024 vydal oficiálny Cloud KMS CNG Provider, ktorý sa do Windows zaregistruje ako Crypto Service Provider (CSP) / Key Storage Provider (KSP) s názvom Google Cloud KMS Provider. Vďaka tomu môže SignTool použiť kľúč(e) v cloude a nemusí byť iba lokálne na tokene.

Podpisovať budeme pomocou SignTool z Windows SDK a x64 verziu nástroja; odporúčame najnovšiu verziu. Uistite sa, že zadávate správne parametre (viď vysvetlenie pod príkladom).

Príklad podpisu pomocou SignTool a 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"

Vysvetlenie:

       
  • /f PATH_TO_CERT je cesta k súboru s Code Signing certifikátom (verejná časť). Takto zlúčený ho dostanete od nás, ak si ho necháte vydať pre HSM.
  •    
  • /csp určuje konkrétny CNG provider, pretože vo Windows ich môže byť viac. Google Cloud KMS Provider je zaregistrovaný rovnako ako napr. „Microsoft Software Key Storage Provider“.
  •    
  • /kc (Key Container) je cesta ku konkrétnemu kľúču a jeho verzii (KMS CryptoKeyVersion), zodpovedá už spomínanému KEY_ID.

Pri podpisovaní uvidíte aký certifikát bol pre podpis zvolený a výsledok. Keďže má SignTool problém s väzbou certifikátu na privátny kľúč v cloude (cez CSP/KSP), odporúčam mať certifikát uložený lokálne v súbore. Voľba pomocou názvu organizácie či SHA1 hashe certifikátu je problematická a väčšinou nefunkčná; fungoval iba certifikát v súbore.

    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 - overenie podpisu

Novo vytvorený digitálny podpis môžeme pomocou SignToolu aj overiť.

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

Podpísaný EXE súbor je úspešne podpísaný!

Zdroje: