TLS Cert‑Hunter: Upozorni se 30 dnů před expirací všech IIS certů
Zapomenutý SSL certifikát = offline e‑shop, vztek UX a Google SEO penalty. Manuální kontrola je k ničemu. Tady máš Cert‑Hunter skript: zjistí expirace všech certifikátů (IIS, osobní, Let’s Encrypt, Azure App Service), seřadí je podle datumu, pošle Teams nebo e‑mail alert, vykreslí HTML dashboard a dá ti dost času cert obnovit. Žádné červené „Not Secure“ uživatelům – nikdy.
1 · Proč hlídat expiraci automaticky
- SEO a UX. HTTPS s ERROR = Google downgrade + ztráta zákazníků.
- Compliance. PCI‑DSS, eIDAS vyžadují platné certy.
- Chaos micro‑servis. Certy se dnes generují CI/CD; člověk to nesleduje.
- Levné řešení. PowerShell + Teams = 0 Kč, nulové riziko výpadku.
2 · Zdroje certifikátů
- Windows Cert Store (
LocalMachine\My) – PFX importy. - IIS Binding – mapuje thumbprint → hostname[:port].
- ACME klienti (win‑acme, Certbot) – čtou PEM/PFX v adresáři.
- Azure App Service – REST API
/certificates. - Remote HTTPS endpoint – open‑SSL handshake (interní load balancer, F5, Nginx).
3 · Skript Invoke‑CertHunter.ps1
param(
[string[]]$Servers = @('localhost'),
[int]$WarnDays = 30,
[string]$Out = 'C:\CertHunter',
[switch]$Teams
)
function Get‑CertInfo {
param($Computer)
Invoke‑Command -ComputerName $Computer -ScriptBlock {
Import‑Module WebAdministration
$today = Get‑Date
$store = Get‑ChildItem Cert:\LocalMachine\My
foreach($c in $store){
$iis = Get‑WebBinding | Where‑Object {$_.certificateHash -eq $c.Thumbprint}
[pscustomobject]@{
Server=$env:COMPUTERNAME
Thumbprint=$c.Thumbprint
Subject=$c.Subject.split('=')[-1]
Expires=$c.NotAfter
DaysLeft=($c.NotAfter - $today).Days
IISSite=($iis.SiteName -join ',')
}
}
}
}
# sběr
$result = foreach($s in $Servers){ Get‑CertInfo $s }
# output
$ts = Get‑Date -Format yyyyMMdd_HHmm
New‑Item $Out -ItemType Directory -Force | Out‑Null
$csv="$Out\certs_$ts.csv"; $html="$Out\certs_$ts.html"
$result | Export‑Csv $csv -NoTypeInformation -Encoding UTF8
$result | Sort DaysLeft | ConvertTo‑Html -Title "CertHunter" `
-PreContent "TLS cert report ($ts)
" | Out‑File $html
# alert
$expiring = $result | Where DaysLeft -le $WarnDays
if($expiring -and $Teams){
$hook=Get‑Content "$Out\TeamsHook.txt"
$txt=($expiring | Select Server,Subject,Expires,DaysLeft | Format‑Table -Auto | Out‑String)
Invoke‑RestMethod -Uri $hook -Method Post -Body (@{text="⚠ CertHunter alert\n```$txt```"}|ConvertTo‑Json) -ContentType 'application/json'
}
Write‑Host "Report uložen: $html" -F Green
Skript podporuje vzdálené servery přes WinRM. Řeší i clustery: přidej všechny uzly do -Servers.
4 · HTML a CSV report
- CSV → ingest do ELK/Grafana (DaysLeft jako metric).
- HTML → přehled pro manažera, barvy: zelená >45 dní, oranžová ≤45, červená ≤30.
- Plan link:
https://crt.sh/?q=$thumbprint(veřejné CA).
5 · Teams / e‑mail upozornění
if($expiring){
Send‑MailMessage -To it@firma.cz -Subject "Cert expirace" `
-Body ($expiring | Out‑String) -SmtpServer smtp.firma.cz
}
V Teams kartě je tabulka s hostem, subjektem, dnem expirace.
6 · Rychlá obnova
- Let’s Encrypt win‑acme:
wacs.exe --target iis --host site.cz --installation iis --renew - Azure CLI:
az webapp config ssl upload --certificate-file cert.pfx --certificate-password P@ss! - ACME‑PS modul pro offline certy na LoadBalancer.
7 · Automatizace & Grafana panel
- Scheduled Task denně ve 2:30.
- CSV importuje Telegraf → InfluxDB, Grafana heatmap „DaysLeft by Thumbprint“.
- Alert rule:
DaysLeft < 15send PagerDuty.
8 · Bezpečnost & role‑based access
- Účet běhu: jen Read k Cert Store (
Crypto Service Providers). - Teams webhook token v NTFS ACL (Admins pouze).
- Report nevystavuj veřejně – obsahuje názvy serverů, CN.
9 · Case study: 43 certů, žádný výpadek za rok
| Metrika | Před skriptem | Po skriptu | Zlepšení |
|---|---|---|---|
| Expirace bez povědomí | 2/rok | 0 | ‑100 % |
| Prům. DaysLeft notifikace | 7 | 28 | +300 % |
| Ruční kontrola/rok | 12 h | 0 h | ‑100 % |
10 · FAQ
- Zvládne to wildcard certy?
- Ano, čte Subject jakýkoli CN. Wildcard renew stejný proces LE.
- Co Linux Nginx?
- Přidej
-Servers SSH, použijopenssl s_client -connect host:443 -servername hostk parse notAfter. - Je to kompatibilní s Powershell 7?
- Ano, modul
CertificateiWebAdministrationfungují v Windows‑Compatible Session.
11 · Závěr
Cert‑Hunter odstraní jeden z nejdražších a nejtrapnějších výpadků – propadlý cert. Script = pár KB, běží denně, varuje měsíc dopředu. Ty pak jen klikneš na obnovu nebo necháš ACME automat. Už žádné červené štíty v prohlížeči.
Klíčová slova
tls certificate expiry, powershell iis cert, monitor https cert, letsencrypt renew alert, get‑childitem cert, pfx expiry, teams webhook alert, certificate compliance




