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

Ako na Windows Serveri s IIS použiť certifikát z Azure Key Vault

Logo Azure Key Vault Tento návod vám pomôže nasadiť certifikáty zo služby Azure Key Vault do vášho IIS webservera na Windows Serveri. Azure Key Vault môže byť prepojený priamo s DigiCertom a automatizovaný. Návod je vytvorený pre dva varianty - pre virtuálne stroje v Azure a pre tie on-premisie Windows Servery, ktoré máte vo firme.

Tento návod predpokladá, že budeme mať certifikát v Azure Key Vaulte. Ako ho tam dostať pomocou priameho napojenia na CA DigiCert nájdete v návode Prepojenie Azure Key Vault s CA DigiCert.

Potom máte dve možnosti nasadenia TLS certifikátu na server:

Tento návod pokrýva oba scenáre, pričom prvý je bezpečnejší (certifikát sa neexportuje z Azure Key Vaultu a neukladá lokálne).

Variant nasadenia na VM v Azure

Ak máte virtuálny Windows server (VM) priamo v Azure, využite túto možnosť. Nainštalujte si Azure PowerShell a Az PowerShell module.

V návode je použitý Windows Server 2022 s IIS 10 (poslednú verziu 2025 nie je možné pre tento účet použiť) a použil som rozšírenie KeyVaultForWindows vo verzii 3.3.

Automatická synchronizácia certifikátu z Azure Key Vault do Azure VM

Povoľte Managed Identity na Azure VM

V Azure Portal otvorte VM > Identity > System assigned a zapnite ju. Prejdite do Azure Key Vault > Access Policies a pridajte oprávnenie pre VM.

Pre najlepšiu prax Microsoft odporúča pre VM rozšírenie využiť Azure RBAC model. V tomto prípade sa pre Managed Identity očakáva priradená rola Key Vault Secrets User na úrovni vaultu prostredníctvom Azure RBAC.

Ak sa rozhodnete pre Access Policies, udeľte v sekcii `Secrets` oprávnenia `Get` a `List`. pri použití `certificateManagementSettings`.

Inštalácia Azure Key Vault VM Extension

Vytvorte v prvom kroku konfiguračný súbor, ktorý bude uložený lokálne na serveri.


{
"secretsManagementSettings": {
"pollingIntervalInS": "60",
"certificateStoreName": "MY",
"certificateStoreLocation": "LocalMachine",
"observedCertificates": [
{
"url": "https://xxxxx-test.vault.azure.net/secrets/zoner-test-azure",
"certificateStoreName": "MY",
"certificateStoreLocation": "LocalMachine"
}
]
}
}

Ak používate user-assigned managed identity, musí v JSON bloku `authenticationSettings` byť špecifikovaný `msiEndpoint` a `msiClientId` vašej user-assigned identity.


{ 
"secretsManagementSettings": { 
"pollingIntervalInS": "3600", 
"certificateStoreName": "MY", 
"certificateStoreLocation": "LocalMachine", 
"observedCertificates": [ 
{ "url": "https://.vault.azure.net/secrets/", 
"certificateStoreName": "MY", 
"certificateStoreLocation": "LocalMachine" 
} 
] 
}, 
"authenticationSettings": { 
"msiEndpoint": "http://169.254.169.254/metadata/identity/oauth2/token", 
"msiClientId": "" 
}
}

Potom nainštalujte a spustite VM extension (PowerShell). Nastavenie načítajte z lokálne uloženého JSON súboru. Názov VM a Resource Group si môžete uložiť aj ako premenné a použiť ich, alebo konkrétne názvy.

az vm extension set --resource-group "RG-name" --vm-name "vmname" --name "KeyVaultForWindows" --publisher "Microsoft.Azure.KeyVault" --version 3.3 --settings ".\settings.json"

Po spustení tohto príkazu bude program v PS chvíľu pracovať a pri úspechu dostanete dlhý JSON report o stave VM extension. Následne sa certifikát objaví vo Windows certificate store v Local Computer -> Personal -> Certificates. Tým, že je v Local Computer, naň vidia všetky aplikácie vrátane IIS. Synchronizácia môže trvať, záleží na intervale "pollingIntervalInS" a koľko ste v ňom uviedli sekúnd.

Overenie synchronizácie certifikátu

Po inštalácii skontrolujte, či sa certifikát stiahol do Windows Certificate Store:

PowerShell
certlm.msc

Certifikát by mal byť v sekcii Personal > Certificates.

ACL Oprávnenia pre privátne kľúče: Po importe certifikátu v konzole v MMC (Local Computer → Certificates → certifikáty) kliknite na certifikát → All Tasks → Manage Private Keys. Tu pridajte účet IIS (`IIS_IUSRS` alebo `Network Service`) s právom `Read`. Absencia týchto oprávnení môže spôsobiť chybu "logon session does not exist" v IIS.

Automatické priradenie certifikátu k IIS

Najprv si vypíšte certifikáty dostupné v Local Machine Store:

Get-ChildItem -Path Cert:\LocalMachine\My

Potom vyberieme správny certifikát podľa odtlačku a uložíme ho do premennej `$cert`:

$certThumbprint = "THUMBPRINT_VYBRANEHO_CERTIFIKATU"
$cert = Get-ChildItem -Path Cert:\LocalMachine\My |
Where-Object { $_.Thumbprint -eq $certThumbprint }

Pre zaistenie, že sa nedeploynul zlý certifikát, odporúčame pridať validáciu certifikátu k doméne. Môžete pridať kontrolu `Subject` certifikátu:

$expectedDomain = "zoner-test-azure.eu" # Nahraďte očakávanou doménou
if ($cert.Subject -notmatch "CN=$expectedDomain") { 
throw "Certificate subject mismatch. Expected CN to contain '$expectedDomain'."
}

Teraz priradíme vybraný certifikát k Bindingu. Verzia 3.0 VM Extension obsahuje podporu "IIS Certificate Rebind", ktorú je možné využiť na automatickú zmenu väzby v IIS pri aktualizácii certifikátu.

Odporúčaný postup na väzbu certifikátu:

Najprv vytvorte väzbu (s `SslFlags 1` pre SNI, ak je potrebné):

New-WebBinding -Name "Default Web Site" -Protocol https -Port 443 -HostHeader "zoner-test-azure.eu" -SslFlags 1

Potom certifikát priraďte pomocou metódy `.AddSslCertificate()`:

(Get-WebBinding -Name "Default Web Site" -Protocol https).AddSslCertificate($certThumbprint, 'My')

Alternatívne, môžete použiť `netsh` pre priame pridanie SSL certifikátu k HTTP.sys. Thumbprint certifikátu v store už poznáme, budete ešte potrebovať appid, ktoré zistíte pomocou

[guid]::NewGuid()


$certThumbprint = "THUMBPRINT_VYBRANEHO_CERTIFIKATU"
$port = 443
$appid = "{00112233-4455-6677-8899-AABBCCDDEEFF}" # Nahraďte svojim GUID aplikácie
$certStoreName = "MY" # 'MY' = 'Personal' vo Windows cert store


$cert = Get-ChildItem -Path Cert:\LocalMachine\My |
Where-Object { $_.Thumbprint -replace '\s','' -ieq $certThumbprint }

if (-not $cert) { 
Write-Host "❌ Certifikát s odtlačkom $certThumbprint nebol nájdený v LocalMachine\My." ` 
-ForegroundColor Red 
return
}

if (-not $cert.HasPrivateKey) { 
Write-Host "❌ Certifikát neobsahuje privátny kľúč, nemožno ho použiť pre SSL." ` 
-ForegroundColor Red 
return
}

# === Odstránenie prípadného existujúceho bindingu ===
Write-Host "? Odstraňujem starý SSL binding na 0.0.0.0:$port (ak existuje)..."
netsh http delete sslcert ipport=0.0.0.0:$port | Out-Null

# === Pridanie nového bindingu pomocou netsh ===
Write-Host "? Pridávam nový SSL certifikát pre 0.0.0.0:$port..."

netsh http add sslcert ` 
ipport=0.0.0.0:$port ` 
certhash=$($cert.Thumbprint) ` 
appid=$appid ` 
certstorename=$certStoreName | Out-Null

Write-Host "✅ Certifikát bol úspešne priradený ku 0.0.0.0:$port pomocou netsh." `
-ForegroundColor Green

Nakoniec vykonajte reload IIS:

iisreset

Že sa certifikát priradil k správnemu bindingu skontrolovať manuálne v IIS, alebo pomocou tohto skriptu:


$bindings = Get-WebBinding |
Where-Object {$_.protocol -eq "https"}

foreach ($binding in $bindings) { 
$bindingDetails = $binding |
Select-Object -Property protocol, bindingInformation 
$parts = $bindingDetails.bindingInformation.Split(":") 
$ip = $parts[0] 
$port = $parts[1] 

if ($ip -eq "*") { 
$ip = "0.0.0.0" 
} 

try { 
$sslCertOutput = netsh http show sslcert ipport=${ip}:${port} 

# Vytiahni potrebné riadky 
$certHash = ($sslCertOutput | Select-String "Certificate Hash").Line.Split(":")[1].Trim() 
$storeName = ($sslCertOutput | Select-String
"Certificate Store Name").Line.Split(":")[1].Trim() 

Write-Host "`n? SSL Binding: ${ip}:${port}" -ForegroundColor Cyan 
Write-Host " Certificate Hash : $certHash" 
Write-Host " Store : $storeName" 

# Vyhľadanie certifikátu v LocalMachine\ 
$cert = Get-ChildItem -Path "Cert:\LocalMachine\$storeName" |
Where-Object { 
$_.Thumbprint -replace '\s','' -ieq $certHash 
} 

if ($cert) { 
Write-Host " CN (Subject) : $($cert.Subject)" 
Write-Host " Platnosť : $($cert.NotBefore.ToShortDateString()) – $($cert.NotAfter.ToShortDateString())" 
} else { 

Write-Host " ⚠️ Certifikát s týmto odtlačkom nebol nájdený vo Windows certifikátovom úložisku." 
} 

} catch { 
Write-Host "❌ Nedá sa načítať certifikát pre ${ip}:${port} – $($_.Exception.Message)" 
} 

Write-Host "`n---`n"
}

Odporúčam skonfigurovať a skontrolovať, nech tam nemáte nejaké Bindings navyše.

Automatická obnova

Azure Key Vault VM Extension zaistí, že sa certifikát pri zmene v Key Vaulte automaticky aktualizuje. IIS sa pri zmene certifikátu reštartuje a vždy použije najnovšiu verziu.

Varianta nasadenia na on-premise server

Ak máte Windows server na vlastnom virtuáli či vlastnom železe, nie je možné využiť Azure Key Vault VM Extension a je potrebné import urobiť inak.

Automatická synchronizácia certifikátu z Azure Key Vault do on-premise IIS

Vytvorenie Azure AD aplikácie pre prístup k Key Vault

V Azure Portal prejdite do Azure Active Directory > App registrations a vytvorte novú aplikáciu. Po registrácii aplikácie skopírujte Application (client) ID a Directory (tenant) ID.

V sekcii Certificates & secrets vygenerujte nový klient secret a uložte ho.

Priradenie oprávnení aplikácii v Azure Key Vault

  • Otvorte Azure Key Vault > Access Policies.
  • Pridajte oprávnenie pre aplikáciu:
    • Get, List pre Secret permissions
    • Get, List pre Certificate permissions

Aplikáciu je následne potrebné vytvoriť a prideliť Client Secret.

Stiahnutie certifikátu z Azure Key Vault na on-premise server

PowerShell
$tenantId = "TENANT_ID"
$clientId = "CLIENT_ID"
$clientSecret = "CLIENT_SECRET"
$vaultName = "MOJE-KEYVAULT-MENO"
$certName = "MOJE-CERTIFIKAT-MENO"
$outputPath = "C:\certscert.pfx"

# Prihlásenie k Azure AD
$body = @{grant_type="client_credentials";
client_id=$clientId; client_secret=$clientSecret; resource="https://vault.azure.net" }
$tokenResponse = Invoke-RestMethod -Method Post -Uri "https://login.microsoftonline.com/$tenantId/oauth2/token" -Body $body
$token = $tokenResponse.access_token

# Získanie certifikátu
$headers = @{ Authorization = "Bearer $token" }
$apiVersion = "7.5"
$secret = Invoke-RestMethod -Uri "https://$vaultName.vault.azure.net/secrets/${certName}?api-version=$apiVersion" -Headers $headers
$pfxBytes = [Convert]::FromBase64String($secret.value)
[System.IO.File]::WriteAllBytes($outputPath, $pfxBytes)

Import certifikátu do systému Windows Certificate Store

PowerShell
$password = ConvertTo-SecureString -String "MOJE-HESLO" -Force -AsPlainText
Import-PfxCertificate -FilePath $outputPath -CertStoreLocation Cert:LocalMachineMy -Password $password

ACL Oprávnenia pre privátne kľúče: Po importe certifikátu v konzole v MMC (Local Computer → Certificates → certifikáty) kliknite na certifikát → All Tasks → Manage Private Keys. Tu pridajte účet IIS (`IIS_IUSRS` alebo `Network Service`) s právom `Read`. Absencia týchto oprávnení môže spôsobiť chybu "logón session does not exist" v IIS.

Priradenie certifikátu k IIS

Najprv zistíme odtlačok certifikátu, ktorý je v certificate store.

PowerShell
$cert = Get-ChildItem -Path Cert:LocalMachineMy |
Sort-Object NotAfter -Descending | Select-Object -First 1
$thumbprint = $cert.Thumbprint

Potom vytvoríme Binding a priradíme ho. `New-WebBinding` vytvorí väzbu a certifikát k nej musíte priradiť pomocou metódy `.AddSslCertificate(Thumbprint, 'My')`.

Najprv vytvorte väzbu (s `SslFlags` pre SNI, ak je potrebné):

New-WebBinding -Name "Default Web Site" -Protocol https -Port 443 -HostHeader "zoner-test-azure.eu" -SslFlags 1

Potom certifikát priraďte:

(Get-WebBinding -Name "Default Web Site" -Protocol https).AddSslCertificate($certThumbprint, 'My')

Alternatívne môžete použiť netsh na priame pridanie SSL certifikátu k HTTP.sys:

netsh http add sslcert ipport=0.0.0.0:443 ` 
certhash= ` 
appid={} ` 
certstorename=My

Na načítanie novej konfigurácie použite iisreset.

Odporúča sa pridať validáciu certifikátu k doméne, aby sa nedeploynul zlý certifikát. Môžete pridať kontrolu "Subject" certifikátu:

$expectedDomain = "zoner-test-azure.eu" # Nahraďte očakávanou doménou
if ($cert.Subject -notmatch "CN=$expectedDomain") { 
throw "Certificate subject mismatch. Expected CN to contain '$expectedDomain'."
}

Automatická obnova

Naplánujte tento skript ako Scheduled Task (napríklad denne) v Task Scheduleri, aby sa certifikát automaticky aktualizoval pri zmene v Azure Key Vault.

Povolenie automatického presmerovania HTTP → HTTPS v IIS

Použite nasledujúci PowerShell skript pre automatické presmerovanie všetkých HTTP požiadaviek na HTTPS.

PowerShell
Import-Module WebAdministration

# Povoliť presmerovanie v IIS
Set-WebConfigurationProperty -Filter "/system.webServer/httpRedirect" -Name "enabled" -Value "True" -PSPath "IIS:SitesDefault Web Site"
Set-WebConfigurationProperty -Filter "/system.webServer/httpRedirect"
-Name "destination" -Value "https://localhost" -PSPath "IIS:SitesDefault Web Site"
Set-WebConfigurationProperty -Filter "/system.webServer/httpRedirect" -Name "exactDestination" -Value "True" -PSPath "IIS:SitesDefault Web Site"
Set-WebConfigurationProperty -Filter "/system.webServer/httpRedirect" -Name "httpResponseStatus" -Value "Permanent" -PSPath "IIS:SitesDefault Web Site"

# Reštart IIS
iisreset

Automatizácia celého procesu

Ak budete používať Azure Key Vault VM Extension a Key Vault bude napojený na DigiCert, bude sa certifikát automaticky predlžovať a synchronizovať do úložiska certifikátov systému Windows Certificate Store. Je však potrebné doriešiť nabindovanie certifikátu v IIS, pretože to sa samo nestane. Je potrebné urobiť niekoľko ďalších krokov, aby bol certifikát pri zmene automaticky priradený k IIS.

Nižšie je uvedený skript, ktorý automaticky detekuje zmenu certifikátu a vykonáva potrebné úpravy v IIS. Zaistí automatickú aktualizáciu certifikátu vo webovom serveri IIS. Certifikáty budú v úložisku Certificate Store automaticky aktualizované z Azure Key Vault. Skript bude pravidelne kontrolovať, či bol nový certifikát importovaný do LocalMachine\My store a či je potrebné tento certifikát priradiť k bindingu v IIS.

Ako nastaviť automatizáciu pomocou Scheduled Task a PowerShell skriptov

Najprv si pripravíme PowerShell skript, ktorý vykoná potrebné akcie, ako je získanie certifikátu a aktualizácia IIS bindingu. PowerShell skript pre automatické pripojenie certifikátu k IIS bindingu:

Import-Module WebAdministration

# Získanie certifikátov, ktoré boli vydané dnes
$certificates = Get-ChildItem -Path Cert:\LocalMachine\My
$today = (Get-Date).Date
$todayCerts = $certificates |
Where-Object { $_.NotBefore.Date -eq $today }
$appid = "{fbb8250d-a9d7-4d41-b7bc-e75b77578802}"

if ($todayCerts.Count -gt 0) { 
# Zoradíme certifikáty podľa dátumu vytvorenia (najnovší certifikát bude prvý) 
$latestCert = $todayCerts |
Sort-Object NotBefore -Descending | Select-Object -First 1 

# Získanie thumbprintu z najnovšieho certifikátu 
$certThumbprint = $latestCert.Thumbprint 
Write-Output "Nový certifikát (dnes vydaný): $certThumbprint" 

# Port pre HTTPS 
$bindingPort = 443 
$hostHeader = "zoner-test-azure.eu" 

# Validácia certifikátu k doméne 
$expectedDomain = "zoner-test-azure.eu" # Nahraďte očakávanou doménou 
if ($latestCert.Subject -notmatch "CN=$expectedDomain") { 
Write-Output "❌ Certifikát s odtlačkom $certThumbprint má nesprávny Subject. Očakávané: CN=$expectedDomain" -ForegroundColor Red 
return 
} 

# Získanie certifikátu podľa thumbprintu 
$cert = Get-ChildItem -Path Cert:\LocalMachine\My |
Where-Object { $_.Thumbprint -eq $certThumbprint } 

if ($cert -and $cert.HasPrivateKey) { 
# Získanie bindingu z IIS pre daný port a hosť header 
$binding = Get-WebBinding |
Where-Object { $_.bindingInformation -like "*:$($bindingPort):$hostHeader" } 

# Ak binding existuje, odstránime starý binding 
if ($binding) { 
# Na odstránenie bindingu použijeme Remove-WebBinding 
Remove-WebBinding -Name "Default Web Site" -BindingInformation "*:$($bindingPort):$hostHeader" -Protocol "https" 
Write-Output "Starý binding pre $hostHeader bol odstránený."
} else { 
Write-Output "Binding pre $hostHeader na porte $bindingPort neexistuje."
} 

# Pridanie nového bindingu 
# Použijeme New-WebBinding na pripojenie certifikátu k portu s HostHeader a SslFlags 1 pre SNI 
New-WebBinding -Name "Default Web Site" -Protocol "https" -Port $bindingPort -HostHeader $hostHeader -SslFlags 1 

# Získanie nového bindingu 
$binding = Get-WebBinding |
Where-Object { $_.bindingInformation -like "*:$($bindingPort):$hostHeader" } 

# Pokiaľ binding ešte neexistuje, pridáme nový certifikát 
if ($binding) { 
# Použijeme metódu AddSslCertificate pre priradenie certifikátu k bindingu 
$binding.AddSslCertificate($cert.Thumbprint, "My") 
Write-Output "IIS binding pre $hostHeader bol aktualizovaný s novým
certifikátom." 
} else { 
Write-Host "❌ Nepodarilo sa pridať nový binding pre $hostHeader."
-ForegroundColor Red 
} 
} else { 
Write-Host "❌ Certifikát s odtlačkom $certThumbprint neobsahuje privátny kľúč, nemožno ho použiť pre SSL."
-ForegroundColor Red 
}
} else { 
Write-Output "Dnes nebol vydaný žiadny nový certifikát."
}

Čo tento skript robí:

  • Kontrola nového certifikátu: Skript zistí, či bol dnes vydaný nový certifikát.
  • Získanie thumbprintu: Ak certifikát existuje, získa jeho thumbprint.
  • Validácia certifikátu k doméne: Skontroluje, či `Subject` certifikátu zodpovedá očakávanej doméne.
  • Aktualizácia IIS bindingu: Ak certifikát obsahuje private key (čo je nutné pre SSL), skript odstráni starý binding na porte 443 a pridá nový s aktualizovaným certifikátom pomocou metódy `.AddSslCertificate()`.

Aby tento skript bežal pravidelne a kontroloval zmeny certifikátu, je potrebné nastaviť Scheduled Task na serveri, ktorý bude tento skript spúšťať napríklad každú hodinu alebo denne. Nastavte teda v Task Scheduler spúšťanie tohto PS skriptu.

Kde nájsť logy

V prípade problémov je užitočné pozrieť sa do logu, čo sa vlastne deje. Tie nájdete tu: Event Log: Microsoft-Windows-CertificateServicesClient-Lifecycle-System/Operational Podrobný súbor log: %windrive%\WindowsAzure\Logs\Plugins\Microsoft.Azure.KeyVault.KeyVaultForWindows\\akvvm_service_.log

Záver

Tento návod by vám mal napovedať ako zautomatizovať vydávanie a následné nasadzovanie TLS certifikátov pre IIS na platforme Windows Server. Na získanie certifikátov sme použili Azure Key Vault a priamu integráciu s CA DigiCert.

Potom certifikát synchronizujeme buď na iný Azure VM, alebo na on-premise Windows server a pomocou Powershellu priraďujeme na vytvorený binding v IIS. Je samozrejme možné použiť aj iný postup, ako tu uvedený.

Pri nastavení opakovaných úloh bude ako získanie certifikátu, tak aj deploy fungovať plne automaticky a bezstarostne.

Oficiálna dokumentácia

  1. Azure Key Vault VM Extension pre Windows
  2. IIS SSL Certificate Binding
  3. Default MachineKeys folders
  4. Azure Key Vault PowerShell Referencie
  5. Managed Identity for Azure Resources
  6. IIS PowerShell Cmdlets
Bol tento článok pre vás užitočný?