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 dve varianty - pre virtuálne stroje v Azure a pre tie on-premise 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).
Varianta 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 modul.
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:
- Get, List pre Secret permissions
- Get, List pre Certificate permissions
Inštalácia Azure Key Vault VM Extension
Vytvorte v prvom kroku konfiguračný súbor, ktorý bude uložený lokálne na serveri. V ňom uveďte certu k "Secrets" vo Vaulte, nie iba k certifikátu (taká cesta vedie iba na verejný kľúč).
{
"secretsManagementSettings": {
"pollingIntervalInS": "60",
"certificateStoreName": "MY",
"certificateStoreLocation": "LocalMachine",
"observedCertificates": [
{
"url": "https://cc-iis-test.vault.azure.net/secrets/zoner-test-azure",
"certificateStoreName": "MY",
"certificateStoreLocation": "LocalMachine"
}
]
}
}
Potom nainštalujte a spustite VM extension (PowerShell). Nastavenie načítajte z lokálne uloženého súboru JSON. 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ávisí 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.
Automatické priradenie certifikátu k IIS
Prvne 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 = "ODTLACOK_VYBRANEHO_CERTIFIKATU"
$cert = Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object { $_.Thumbprint -eq $certThumbprint }
Je potrebné vytvoriť nový Binding pre doménové meno (miesto Default Web Site môžete použiť meno, ktoré máte v IIS). Nastavíme teda Binding na konkrétny doménový názov na porte 443 (HTTPS):
Import-Module WebAdministration
New-WebBinding -Name "Default Web Site" -IPAddress "*" -Port 443 -HostHeader "zoner-test-azure.eu" -Protocol https
Vytvorenie bindingu pre SNI:
Import-Module WebAdministration
New-WebBinding -Name "Default Web Site" -Protocol https -Port 443 -HostHeader "zoner-test-azure.eu"
Teraz priradíme vybraný certifikát k Bindingu pomocou netsh. Thumbprint certifikátu v store už poznáme, budete ešte potrebovať appid, ktorý zistíte pomocou
[guid]::NewGuid()
$certThumbprint = "ODTLACOK_VYBRANEHO_CERTIFIKATU"
$port = 443
$appid = "{00112233-4455-6677-8899-AABBCCDDEEFF}" # Nahraďte svojím 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ľúč, nie je možné ho použiť pre SSL." -ForegroundColor Red
return
}
# === Odobratie 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ý k 0.0.0.0:$port pomocou netsh." -ForegroundColor Green
Na záver vykonajte reload IIS:
iisreset
Že sa certifikát priradil k správnemu bindingu skontrolujte 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 "❌ Nie je možné načítať certifikát pre ${ip}:${port} – $($_.Exception.Message)"
}
Write-Host "`n---`n"
}
Odporúčam konfiguráciu skontrolovať, či tam nemáte nejaké Bindings navyše.
Automatická obnova
Azure Key Vault VM Extension zabezpečí, ž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ále č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ý client secret a uložte ho.
Priradenie oprávnenia 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 Windows Certificate Store
PowerShell
$password = ConvertTo-SecureString -String "MOJE-HESLO" -Force -AsPlainText
Import-PfxCertificate -FilePath $outputPath -CertStoreLocation Cert:LocalMachineMy -Password $password
Priradenie certifikátu k IIS
PowerShell
$cert = Get-ChildItem -Path Cert:LocalMachineMy | Sort-Object NotAfter -Descending | Select-Object -First 1
$thumbprint = $cert.Thumbprint
New-WebBinding -Name "Default Web Site" -IPAddress "*" -Port 443 -Protocol https
$cmd = "netsh http add sslcert ipport=0.0.0.0:443 certhash=$thumbprint appid='{4dc3e181-e14b-4a21-b022-59fc669b0914}'"
Invoke-Expression $cmd
iisreset
Automatická obnova
Naplanujte 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ť priradenie 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ý do IIS.
Nižšie je uvedený skript, ktorý automaticky deteguje zmenu certifikátu a vykonáva potrebné úpravy v IIS. Zabezpečí 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"
# 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 host header
$binding = Get-WebBinding | Where-Object { $_.bindingInformation -like "*:$($bindingPort):$hostHeader" }
# Ak binding existuje, odstránime starý binding
if ($binding) {
# Pre 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
New-WebBinding -Name "Default Web Site" -Protocol "https" -Port $bindingPort -HostHeader $hostHeader
# Získanie nového bindingu
$binding = Get-WebBinding | Where-Object { $_.bindingInformation -like "*:$($bindingPort):$hostHeader" }
# Ak binding ešte neexistuje, pridáme nový certifikát
if ($binding) {
# Použijeme netsh na priradenie certifikátu k bindingu
netsh http add sslcert ipport=0.0.0.0:$bindingPort certhash=$($cert.Thumbprint) appid=$appid
Write-Output "IIS binding pre $hostHeader bol aktualizovaný s novým certifikátom."
} else {
Write-Output "❌ Nepodarilo sa pridať nový binding pre $hostHeader." -ForegroundColor Red
}
} else {
Write-Output "❌ Certifikát s odtlačkom $certThumbprint neobsahuje privátny kľúč, nie je možné 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.
- 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.
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.
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. Pre 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, než tu uvedený.
Pri nastavení opakovaných úloh bude ako získanie certifikátu, tak i deploy fungovať plne automaticky a bezstarostne.
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.