Azure Key Vault Code Signing: opsætningsguide
Denne guide fører dig gennem opsætningen af Azure Key Vault Premium til Code Signing, fra oprettelse af vault til signering af din første fil med AzureSignTool. Virker med både OV og EV Code Signing-certifikater fra DigiCert og GlobalSign.
Skal du kun oprette CSR'en og få certifikatet installeret, er der en kortere vejledning her: Opret CSR til Code Signing i Azure Key Vault.
Forudsætninger
- ✓ Azure-abonnement (ethvert niveau, inkl. gratis)
- ✓ .NET 8 SDK eller nyere (til AzureSignTool). Download fra dotnet.microsoft.com ↗
- ✓ Et Code Signing-certifikat fra FairSSL (DigiCert eller GlobalSign, OV eller EV). Se produkter nedenfor
Kun DigiCert og GlobalSign certifikater virker med Azure Key Vault. Sectigo/Comodo-certifikater er ikke kompatible, fordi Azure Key Vault ikke understøtter deres key attestation-format.
Vigtigt: rækkefølgen er forskellig hos DigiCert og GlobalSign
Selve opsætningen i Azure er den samme uanset CA. Men tidspunktet, hvor CSR'en skal bruges, er ikke det samme. Læs det afsnit, der passer til din ordre, før du går i gang.
DigiCert: CSR'en skal være klar først
- Opret Key Vault, nøgle og CSR (trin 1 til 3 herunder)
- Send CSR'en til FairSSL, eller indsæt den i ordren. Ordren kan ikke oprettes uden CSR
- Organisationsvalidering gennemføres, og HSM-erklæringen underskrives
- Certifikatet udstedes og sendes til dig. Flet det ind i Key Vault (trin 5)
GlobalSign: validering først, CSR bagefter
- Ordren oprettes uden CSR
- Organisationsvalidering gennemføres, og HSM-erklæringen underskrives
- Når valideringen er godkendt, sender GlobalSign et udstedelseslink på e-mail
- Først dér skal CSR'en bruges. Opret nøgle og CSR i Key Vault (trin 1 til 3) og indsend CSR'en via linket
- Certifikatet udstedes med det samme. Flet det ind i Key Vault (trin 5)
Slet ikke det ventende certifikat i Key Vault, mens du venter. Det udstedte certifikat kan kun flettes ind i præcis den ventende anmodning, CSR'en kom fra. Opretter du certifikatet forfra, får du en ny nøgle, og det udstedte certifikat kan ikke bruges. Skal du starte forfra, skal CSR'en indsendes igen.
HSM-erklæring. Før certifikatet udstedes, skal I bekræfte med underskrift, at den private nøgle er genereret og opbevares i en fysisk sikring (HSM), her en Azure Key Vault Premium med RSA-HSM-nøgle, og at nøglen ikke kan eksporteres. Erklæringen skal underskrives af en, der teknisk kan stå inde for det, typisk den person, der udfører installationen.
Trin 1: Opret en Azure Key Vault (Premium)
Gå til Azure-portalen og opret en ny Key Vault-ressource. Den afgørende indstilling er prisniveauet.
Key Vault-indstillinger
- Prisniveau:
Premium(påkrævet for HSM-backed nøgler. Standard kan ikke oprette RSA-HSM-nøgler) - Region: Vælg en region tæt på din signeringsinfrastruktur
- Tilladelsesmodel: Azure role-based access control (RBAC) (anbefalet)
- Soft-delete: Aktiveret (standard, kan ikke deaktiveres)
- Purge protection: Anbefales at aktivere (forhindrer utilsigtet permanent sletning)
Azure CLI-alternativ
az keyvault create \ --name your-codesign-vault \ --resource-group your-resource-group \ --location westeurope \ --sku premium \ --enable-purge-protection true
Trin 2: Konfigurér RBAC-tilladelser
Azure Key Vault bruger en separat tilladelsesmodel til data plane-operationer. At have Owner eller Contributor på abonnementet giver ikke automatisk adgang til nøgler og certifikater inde i vault'en.
Påkrævede roller til din brugerkonto (opsætning)
- ✓ Key Vault Administrator på Key Vault-ressourcen
Tildel via: Key Vault-ressource → Access control (IAM) → Add role assignment → Key Vault Administrator → vælg din bruger.
Påkrævede roller til AzureSignTool (signering)
Den service principal eller managed identity, som AzureSignTool bruger, skal have disse tre roller:
- ✓ Key Vault Crypto User (udfør signeringsoperationer)
- ✓ Key Vault Certificate User (læs certifikatmetadata)
- ✓ Key Vault Secrets User (læs certifikatkæde)
Azure CLI
# Tildel Key Vault Administrator til dig selv
az role assignment create \
--role "Key Vault Administrator" \
--assignee your-email@example.com \
--scope /subscriptions/{sub-id}/resourceGroups/{rg}/providers/Microsoft.KeyVault/vaults/{vault-name} Trin 3: Generér nøgle og CSR
Navigér i Azure-portalen til din Key Vault → Certificates → Generate/Import.
Certifikatoprettelsesindstillinger
- Method: Generate
- Certificate Name: f.eks.
codesign-2026(din interne reference) - Type of CA: Certificate issued by a non-integrated CA
- Subject:
CN=Virksomhedens fulde juridiske navn(præcis som registreret i CVR, uden forkortelser. Navnet skal matche det, valideringen er gennemført på) - Validity Period (in months):
12(se noten om gyldighed nedenfor) - DNS Names: ingen
- Content Type: PEM
Advanced Policy Configuration
- Extended Key Usages (EKUs):
1.3.6.1.5.5.7.3.3(Code Signing). Fjern de EKU'er, der står der i forvejen - X.509 Key Usage Flags: lad stå uændret
- Reuse Key on Renewal: Yes (så fornyelse kan bruge samme HSM-nøgle)
- Exportable Private Key: No (påkrævet. Nøglen må ikke kunne forlade HSM'en)
- Key Type: RSA-HSM (mangler valget, er det ikke en Premium Key Vault)
- Key Size: 4096
- Enable Certificate Transparency: No (Yes er tilladt, men ikke nødvendigt til Code Signing)
- Certificate Type: lad stå tomt. Feltet bruges kun ved en integreret CA
Gyldighed: vælg 12 måneder. FairSSL udsteder Code Signing-certifikater med 1 års gyldighed. Har I købt dækning for flere år, er de efterfølgende år fornyelser af det eksisterende certifikat, ikke ét langt certifikat. Branchens loft er 460 dage, cirka 15 måneder (DigiCert udsteder 459), men det er en øvre grænse og ikke det, der bliver udstedt til jer.
Klik Create. Certifikatet vises i listen med status "In progress". Klik på det, og klik derefter Certificate Operation → Download CSR for at hente CSR-filen. Du skal have Key Vault Administrator-rettigheder for at kunne oprette certifikatet, se trin 2.
Skal denne del sendes videre til den, der laver CSR'en, findes den som selvstændig side her: Opret CSR til Code Signing i Azure Key Vault.
Den private nøgle genereres inde i HSM'en og forlader den aldrig. CSR'en indeholder kun den offentlige nøgle. Det er den, du indsender til FairSSL/CA'en til signering.
Trin 4: Aflever CSR'en og gennemfør validering
Åbn den downloadede CSR-fil i en teksteditor. Indholdet starter med -----BEGIN CERTIFICATE REQUEST-----
og slutter med -----END CERTIFICATE REQUEST-----. Hele blokken, inklusive begge linjer, er det, CA'en skal bruge.
Har du en DigiCert-ordre
CSR'en skal afleveres, før ordren kan oprettes. Indsæt PEM-teksten i ordren, eller send filen til FairSSL på info@fairssl.dk, så indsætter vi den hos DigiCert. Derefter går organisationsvalideringen i gang.
Har du en GlobalSign-ordre
Vent med CSR'en. Når organisationsvalideringen er gennemført og godkendt, sender GlobalSign et udstedelseslink på e-mail. CSR'en indsendes via det link, og certifikatet udstedes med det samme bagefter.
Organisationsvalidering
FairSSL udfører den indledende OV-validering for GlobalSign på dansk, svensk og engelsk, ofte gennemført samme dag. CA'en udfører derefter en uafhængig anden kontrol. Der kan blive booket et valideringsopkald eller sendt en bekræftelses-e-mail. Samtidig skal HSM-erklæringen underskrives, se afsnittet om rækkefølge ovenfor.
Når certifikatet er udstedt, modtager du typisk flere filer: dit Code Signing-certifikat, et intermediate-certifikat og et root-certifikat, eller en samlet .p7b-fil. Gå videre til trin 5.
Trin 5: Importér det signerede certifikat i Key Vault
Upload hele kæden. Det kan kun gøres én gang
Den hyppigste fejl i hele forløbet er at uploade sit eget certifikat alene, uden intermediate-certifikaterne. Det kan ikke rettes bagefter. Merge Signed Request kan kun køres én gang på en ventende anmodning.
Sker det, skal alle signeringer derefter laves med ekstra parametre, der peger på intermediate-certifikatet. Og sletter I certifikatet for at lægge det op igen med hele kæden, bliver den private nøgle slettet sammen med det. Så skal hele forløbet startes forfra: ny nøgle, ny CSR og ny udstedelse hos CA'en.
Kontrollér derfor filen, før du uploader. Den skal indeholde jeres eget certifikat og intermediate-certifikatet, jeres eget først.
Brug enten en samlet .p7b-fil fra CA'en eller en samlet PEM-fil, der indeholder alle certifikaterne. Bruger du PEM, skal rækkefølgen være dit Code Signing-certifikat først, derefter intermediate-certifikatet og til sidst root-certifikatet. Denne rækkefølge sikrer, at Azure Key Vault kan validere hele certifikatkæden.
Har du fået en enkelt .p7b-fil, kan du uploade den direkte under Merge Signed Request og springe sammensætningen over.
Opret den samlede PEM-fil
Åbn en teksteditor og indsæt certifikaterne i denne rækkefølge (eller brug kommandoen herunder):
-----BEGIN CERTIFICATE----- (dit Code Signing-certifikat) -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- (intermediate-certifikat fra CA'en) -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- (root-certifikat fra CA'en) -----END CERTIFICATE-----
Med kommandolinjen kan du sammensætte filen direkte:
cat codesign.pem intermediate.pem root.pem > fullchain.pem
Upload til Key Vault
Gå tilbage til din Key Vault → Certificates → klik på det ventende certifikat → Certificate Operation → Merge Signed Request.
Upload den samlede PEM-fil (fullchain.pem). Azure Key Vault fletter certifikatkæden
med den private nøgle, der blev genereret i trin 3.
Efter fletning ændres certifikatets status til "Completed", og det er klar til signering.
Azure CLI-alternativ
az keyvault certificate pending merge \ --vault-name your-codesign-vault \ --name codesign-2026 \ --file fullchain.pem
Notér certifikatnavnet (f.eks. codesign-2026). Du skal bruge det til AzureSignTools
-kvc-parameter.
Trin 6: Opret en service principal til signering
AzureSignTool autentificerer til Key Vault via en service principal (Azure AD app-registrering) eller en managed identity. Til CI/CD-pipelines på infrastruktur uden for Azure skal du bruge en service principal.
Opret app-registreringen
- Gå til Azure Active Directory → App registrations → New registration
- Giv den et beskrivende navn (f.eks. "CodeSign-Pipeline")
- Notér Application (client) ID og Directory (tenant) ID
- Gå til Certificates & secrets → New client secret → opret en secret og notér værdien
Tildel Key Vault-roller til service principal
Gå til din Key Vault → Access control (IAM) → Add role assignment. Tildel alle tre roller til din service principal:
- Key Vault Crypto User
- Key Vault Certificate User
- Key Vault Secrets User
Azure CLI
# Opret app-registrering
az ad app create --display-name "CodeSign-Pipeline"
# Opret service principal
az ad sp create --id {app-id}
# Opret client secret
az ad app credential reset --id {app-id} --years 2
# Tildel roller (gentag for hver rolle)
az role assignment create \
--role "Key Vault Crypto User" \
--assignee {service-principal-id} \
--scope /subscriptions/{sub-id}/resourceGroups/{rg}/providers/Microsoft.KeyVault/vaults/{vault-name} Opbevar client secret sikkert. I CI/CD-pipelines skal du bruge hemmelige pipeline-variabler eller en vault. Commit aldrig secrets til GIT versionsstyring.
Trin 7: Installér AzureSignTool
AzureSignTool ↗ er en gratis, open source-erstatning for signtool.exe, der signerer direkte fra Azure Key Vault.
dotnet tool install --global AzureSignTool
Kræver .NET 8 SDK eller nyere. Efter installation er AzureSignTool tilgængelig som en global kommando.
Alternativ: Jsign (cross-platform)
Jsign ↗ er et Java-baseret signeringsværktøj, der også understøtter Azure Key Vault. Jsign kører på Windows, macOS og Linux, og kan signere .exe, .msi, .dll, PowerShell, Office-makroer og Java/Android-apps (som bro til jarsigner).
jsign --storetype AZUREKEYVAULT \ --storepass "YOUR_CLIENT_ID|YOUR_CLIENT_SECRET|YOUR_TENANT_ID" \ --keystore your-codesign-vault \ --alias codesign-2026 \ --tsaurl http://timestamp.digicert.com \ MyApplication.exe
Jsign er et godt alternativ, hvis du ikke har .NET installeret, eller hvis du signerer fra macOS/Linux.
Trin 8: Signér din første fil
AzureSignTool sign \ -kvu https://your-codesign-vault.vault.azure.net \ -kvc codesign-2026 \ -kvt YOUR_TENANT_ID \ -kvi YOUR_CLIENT_ID \ -kvs YOUR_CLIENT_SECRET \ -fd sha256 \ -tr http://timestamp.digicert.com \ -td sha256 \ "MyApplication.exe"
Parameterreference
-kvuKey Vault URL (findes på Key Vault-oversigtssiden)-kvcCertifikatnavn i Key Vault (det navn, du valgte i trin 3)-kvtAzure tenant (directory) ID-kviApplication (client) ID for din service principal-kvsClient secret-værdi-fdFile digest-algoritme (brug altidsha256)-trRFC 3161 timestamp-server URL-tdTimestamp digest-algoritme (brug altidsha256)
Verificér signaturen
signtool verify /pa /v "MyApplication.exe"
Output bør vise "Successfully verified" med dit firmanavn og et gyldigt timestamp.
CI/CD-integration
AzureSignTool kører i enhver CI/CD-pipeline, der understøtter .NET. Gem dine Key Vault-credentials som hemmelige pipeline-variabler.
Azure DevOps (YAML)
- task: DotNetCoreCLI@2
displayName: 'Install AzureSignTool'
inputs:
command: 'custom'
custom: 'tool'
arguments: 'install --global AzureSignTool'
- script: |
AzureSignTool sign \
-kvu $(KeyVaultUrl) \
-kvc $(CertificateName) \
-kvt $(TenantId) \
-kvi $(ClientId) \
-kvs $(ClientSecret) \
-fd sha256 \
-tr http://timestamp.digicert.com \
-td sha256 \
"$(Build.ArtifactStagingDirectory)\**\*.exe"
displayName: 'Sign executables' GitHub Actions
- name: Install AzureSignTool
run: dotnet tool install --global AzureSignTool
- name: Sign executables
run: |
AzureSignTool sign \
-kvu ${{ secrets.KEY_VAULT_URL }} \
-kvc ${{ secrets.CERT_NAME }} \
-kvt ${{ secrets.AZURE_TENANT_ID }} \
-kvi ${{ secrets.AZURE_CLIENT_ID }} \
-kvs ${{ secrets.AZURE_CLIENT_SECRET }} \
-fd sha256 \
-tr http://timestamp.digicert.com \
-td sha256 \
"output/*.exe" GitLab CI
sign:
image: mcr.microsoft.com/dotnet/sdk:8.0
script:
- dotnet tool install --global AzureSignTool
- export PATH="$PATH:$HOME/.dotnet/tools"
- AzureSignTool sign
-kvu $KEY_VAULT_URL
-kvc $CERT_NAME
-kvt $AZURE_TENANT_ID
-kvi $AZURE_CLIENT_ID
-kvs $AZURE_CLIENT_SECRET
-fd sha256
-tr http://timestamp.digicert.com
-td sha256
"output/*.exe" Managed identity: På Azure-hostede agents kan du erstatte -kvt, -kvi og -kvs
med -kvm (brug managed identity). Det eliminerer behovet for client secrets helt.
Timestamping
Inkludér altid et RFC 3161 timestamp, når du signerer. Det sikrer, at dine signaturer forbliver gyldige, efter certifikatet udløber. Code Signing-certifikater har en maksimal gyldighed på 460 dage, cirka 15 måneder, men signerede filer med timestamp er gyldige på ubestemt tid.
Anbefalede timestamp-servere
http://timestamp.digicert.com(anbefalet, mest stabil)http://timestamp.globalsign.com/tsa/r6advanced1
Kan du kun angive én, anbefaler vi DigiCerts, da den historisk har været mest stabil. Se DigiCerts vejledning om timestamping-problemer ↗.
Ekstra bagudkompatibilitet
Skal signeringen validere på ældre systemer, kan du importere CA-certifikatet "GlobalSign Code Signing Root R45 (R3 cross)". Det findes på GlobalSigns oversigt over intermediate-certifikater ↗.
Fejlfinding
"Forbidden" eller "Access denied" ved signering
Din service principal mangler Key Vault RBAC-roller. Kontrollér, at alle tre roller er tildelt: Key Vault Crypto User, Key Vault Certificate User og Key Vault Secrets User. RBAC-rolletildelinger kan tage op til 10 minutter at propagere.
"SKU does not support HSM-backed keys"
Du har oprettet en Key Vault med Standard-niveau. Du skal bruge Premium. Opret en ny Key Vault med Premium SKU, eller opgrader den eksisterende vault (kun muligt via CLI).
"Certificate operation is not complete"
Du har endnu ikke flettet det signerede certifikat fra CA'en. Gå til Key Vault → Certificates → klik på det ventende certifikat → Certificate Operation → Merge Signed Request.
Merge Signed Request fejler
Enten passer certifikatet ikke til den ventende anmodning, eller kæden er ufuldstændig. Kontrollér, at certifikatet er udstedt på præcis den CSR, Key Vault genererede, at det ventende certifikat ikke er blevet slettet eller genskabt, og at filen indeholder både dit certifikat og intermediate-certifikatet i den rigtige rækkefølge.
CA'en afviser CSR'en
Oftest fordi Subject CN ikke er identisk med det juridiske navn, valideringen er gennemført på, eller fordi nøglen ikke er 4096 bit RSA. Opret et nyt certifikat i Key Vault med et andet navn og de rigtige felter, og indsend den nye CSR. Slet ikke det forkerte certifikat: soft-delete holder navnet optaget i retention-perioden, og med purge protection kan det ikke frigives før perioden udløber.
Timestamp fejler
Prøv den alternative timestamp-server. Kontrollér også, at signeringsmaskinen har internetadgang og kan nå timestamp-URL'en på port 80. Nogle firewalls blokerer udgående HTTP.
Code Signing-certifikater til Azure Key Vault
OV Code Signing
DigiCert CodeSign OV
DigiCert OV Code Signing. Virker med Azure Key Vault.
GlobalSign CodeSign
GlobalSign OV Code Signing. Virker med Azure Key Vault.
EV Code Signing
Ofte stillede spørgsmål om Azure Key Vault-opsætning
Find svar på de mest almindelige spørgsmål om SSL certifikater og FairSSL.
Klar til at signere fra Azure Key Vault?
Opret en gratis konto og udsted dit første certifikat på under 10 minutter.