{"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 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:

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.

Bol tento článok pre vás užitočný?