{"copy":"Zkop\u00edrovat","expand":"Rozbalit","collapse":"Sbalit","copy_success":"Zkop\u00edrov\u00e1no!","copy_error":"Kop\u00edrov\u00e1n\u00ed selhalo!"}

Podepisování kódu pomocí Google Cloud KMS

Se službou Google Cloud KMS získáte cloudové HSM s certifikací FIPS 140-2 Level 3. Můžete podepisovat kód bezpečně, rychle a odkudkoliv. Náklady za počet operací (podpisů) jsou navíc velice příznivé. Cloud KMS podporuje podepisování pomocí Microsoft Cryptography API: Next Generation (CNG).

Pro nastavení a podepsání kódu je třeba udělat následující kroky, které postupně projdeme:

  • Nainstalujte CNG provider
  • Vytvořte Key Ring a privátní klíč
  • Vytvořte CSR a získejte certifikát
  • Podepište svůj artefakt

Stáhněte si CNG provider a potřebné balíky

Google publikoval svůj CNG provider ve svém repozitáři na GitHubu. Tyto soubory lze nainstalovat do vašeho systému Windows pomocí přiloženého instalačního souboru .msi. Tento program potřebuje konfiguraci v podobě souboru YAML, který najdete v jednom z kroků tohoto návodu.

Nyní se přesuňte na Linux (můžete využít WSL ve Windows). Vytvoření privátního klíče a CSR doporučujeme udělat na Linuxu; byť ve Windows můžete do PowerShellu nainstalovat OpenSSL, v Linuxu je menší pravděpodobnost, že narazíte na komplikaci. Stejně tak postupuje i oficiální návod od Google.

Pro komunikaci s cloudem využijeme aplikaci gcloud z balíku google-cloud-cli.

Vytvořte Key Ring a privátní klíč v Cloud HSM

Následující kroky proveďte na Linuxu. Vytvořte nový klíčový svazek (Key Ring) pro Cloud Key Management Service (KMS) API a v něm vytvořte privátní klíč, který je hardwarově chráněný pomocí Cloud HSM. Vyberte asymetrický RSA algoritmus pro podepisování a délku klíče 3072b, protože SignTool neumí používat EC klíče v kombinaci s Google Cloud KMS CNG.

Nejprve se na Linuxu přihlaste ke Google účtu a autorizujte session (platí i pro Windows PowerShell): gcloud auth application-default login

Takto vytvoříte Key Ring pro umístění privátního klíče: gcloud kms keyrings create KEYRING-NAME \
--location=europe-west3 \
--project=PROJECT-NAME

Do tohoto Key Ringu umístíme privátní klíč. Ten vygenerujeme rovněž pomocí utility gcloud; názvy (velkými písmeny) doplňte dle reality (název projektu v GCP) a vašeho pojmenování.

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 vytvoříte první verzi klíče, doporučujeme v jeho detailu v Cloud Console zkopírovat Copy resource name, protože tento údaj budete potřebovat pro KEY_ID. Vypadá takto: projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/1

Nyní zpět na Windows, kde bude potřeba vytvořit ještě soubor config.yaml s konfigurací pro KMS integraci. Do powershlellu zadejte následující: $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)

Vytvoření CSR

Do HSM přirozeně není možné importovat certifikát s privátním klíčem, stejně jako není možné tento pár exportovat. Privátní klíč a CSR tedy musí vzniknout v HSM, CSR pak dodáte SSLmarketu a necháte si ho od DigiCertu podepsat. Import vydaného certifikátu je v dalším kroku.

Vytvoření CSR je nejlepší provést na Linuxu, pomocí knihovny libengine-pkcs11-openssl, libkmsp11 a API. Samozřejmě budete potřebovat i balík google-cloud-cli.

Vytvoření CSR pak vypadá takto (za pkcs11:object= doplňte název klíče (CryptoKey) dle 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

Žádost pro DigiCert pak budete mít v souboru cs-request.csr ve složce, kde právě pracujete. Toto CSR nám pošlete.

Získání certifikátu

Vytvořené CSR si nechte podepsat DigiCertem a dostanete zpět nový Code Signing certifikát. Ten už nemusíte vkládat do Google Cloud Console, tam stačí mít privátní klíč. S certifikátem budeme na Windows pracovat lokálně, uložte si ho někam na disk jako soubor.

Podepište své artefakty

Pokračujeme na Windows. Google od roku 2024 vydal oficiální Cloud KMS CNG Provider, který se do Windows zaregistruje jako Crypto Service Provider (CSP) / Key Storage Provider (KSP) s názvem Google Cloud KMS Provider. Díky tomu může SignTool použít klíč(e) v cloudu a nemusí být pouze lokálně na tokenu.

Podepisovat budeme pomocí SignTool z Windows SDK a x64 verzi nástroje; doporučujeme nejnovější verzi. Ujistěte se, že zadáváte správné parametry (viz vysvětlení pod příkladem).

Příklad podpisu pomocí 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"

Vysvětlení:

  • /f PATH_TO_CERT je cesta k souboru s Code Signing certifikátem (veřejná část). Takto sloučený ho dostanete od nás, pokud si ho necháte vydat pro HSM.
  • /csp určuje konkrétní CNG provider, protože ve Windows jich může být více. Google Cloud KMS Provider je zaregistrovaný stejně jako např. „Microsoft Software Key Storage Provider“.
  • /kc (Key Container) je cesta ke konkrétnímu klíči a jeho verzi (KMS CryptoKeyVersion), odpovídá již zmíněnému KEY_ID.

Při podepisování uvidíte jaký certifikát byl pro podpis zvolen a výsledek. Jelikož má SignTool problém s vazbou certifikátu na privátní klíč v cloudu (přes CSP/KSP), doporučuji mít certifikát uložen lokálně v souboru. Volba pomocí názvu organizace či SHA1 hashe certifikátu je problematická a většinou nefunkční; fungoval pouze certifikát v souboru.

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 - ověření podpisu

Nově vytvořený digitální podpis můžeme pomocí SignToolu i ověřit.

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

Podepsaný EXE soubor je úspěšně podepsán!

Zdroje:

Byl tento článek pro vás užitečný?