Ako na Windows Serveri s IIS použiť certifikát z 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:
- nasadiť certifikát na server (VM) v Azure
- alebo na lokálny on-premise Windows server (vo vašej firme)
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\
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
- Azure Key Vault VM Extension pre Windows
- IIS SSL Certificate Binding
- Default MachineKeys folders
- Azure Key Vault PowerShell Referencie
- Managed Identity for Azure Resources
- IIS PowerShell Cmdlets
Mrzí nás, že ste tu nenašli potrebné.
Pomôžete nám článok vylepšiť? Napíš nám, čo ste tu očakávali a nedozvedeli sa.