From 13a7cd6d96ea2e073397d5620ef2c37b0a873735 Mon Sep 17 00:00:00 2001 From: Marius Date: Sun, 26 Oct 2025 18:52:44 +0200 Subject: [PATCH] IIS SSL certificat --- proxmox/certificat-letsencrypt-iis.md | 201 ++++++++++++++++++++++++++ 1 file changed, 201 insertions(+) create mode 100644 proxmox/certificat-letsencrypt-iis.md diff --git a/proxmox/certificat-letsencrypt-iis.md b/proxmox/certificat-letsencrypt-iis.md new file mode 100644 index 0000000..0132870 --- /dev/null +++ b/proxmox/certificat-letsencrypt-iis.md @@ -0,0 +1,201 @@ +# Certificat Let's Encrypt pentru IIS - Ghid Rapid + +## Instalare Win-ACME + +```powershell +# Download și instalare +Invoke-WebRequest -Uri "https://github.com/win-acme/win-acme/releases/download/v2.2.9.1701/win-acme.v2.2.9.1701.x64.pluggable.zip" -OutFile "$env:TEMP\win-acme.zip" +Expand-Archive -Path "$env:TEMP\win-acme.zip" -DestinationPath "C:\Tools\win-acme" -Force +``` + +## Prerequisite IIS + +### Verificare Site ID-uri +```powershell +Import-Module WebAdministration +Get-Website | Select-Object ID, Name, State, @{N='Bindings';E={$_.Bindings.Collection.bindingInformation}} +``` + +### Adaugă Binding-uri pentru Domeniu +```powershell +# Exemplu pentru roa.romfast.ro pe Default Web Site +New-WebBinding -Name "Default Web Site" -Protocol http -Port 80 -HostHeader "roa.romfast.ro" +New-WebBinding -Name "Default Web Site" -Protocol https -Port 443 -HostHeader "roa.romfast.ro" +``` + +## Generare Certificate + +### Metoda 1: Comenzi PowerShell (Automat) +```powershell +cd C:\Tools\win-acme + +# Pentru fiecare site (înlocuiește Site ID și email) +.\wacs.exe --source iis --siteid 1 --accepttos --emailaddress your@email.com +.\wacs.exe --source iis --siteid 2 --accepttos --emailaddress your@email.com +.\wacs.exe --source iis --siteid 3 --accepttos --emailaddress your@email.com +``` + +### Metoda 2: Mod Interactiv +```powershell +cd C:\Tools\win-acme +.\wacs.exe + +# În meniu: +# N - Create certificate (simple for IIS) +# Selectează site-ul +# Confirmă binding-urile +# yes - Accept ToS +# Enter email +``` + +## Configurare Binding-uri IIS cu SNI + +### Important: SNI OBLIGATORIU pentru Multiple Certificate pe Același IP + +**GUI - IIS Manager:** +1. Deschide IIS Manager (`inetmgr`) +2. Pentru fiecare site: + - Site → **Bindings** → Selectează **https** → **Edit** + - ☑️ **Bifează "Require Server Name Indication"** + - Selectează **certificatul corect** pentru site + - **OK** +3. Restart IIS: `iisreset` + +**PowerShell:** +```powershell +Import-Module WebAdministration + +# Exemplu pentru un site +$siteName = "Dokploy" +$hostHeader = "dokploy.romfast.ro" + +# Găsește certificatul +$cert = Get-ChildItem Cert:\LocalMachine\My | Where-Object { + $_.Subject -like "*$hostHeader*" -and $_.NotAfter -gt (Get-Date).AddDays(60) +} | Select-Object -First 1 + +# Șterge binding vechi și creează cu SNI (SslFlags = 1) +Remove-WebBinding -Name $siteName -Protocol https -HostHeader $hostHeader -ErrorAction SilentlyContinue +New-WebBinding -Name $siteName -Protocol https -Port 443 -HostHeader $hostHeader -SslFlags 1 + +# Asociază certificatul +$binding = Get-WebBinding -Name $siteName -Protocol https -HostHeader $hostHeader +$binding.AddSslCertificate($cert.Thumbprint, "My") + +# Restart IIS +iisreset +``` + +## Verificare + +### Listare Certificate Gestionate +```powershell +cd C:\Tools\win-acme +.\wacs.exe --list +``` + +### Verificare Certificate în Browser +```bash +# Din WSL sau Linux +echo | openssl s_client -connect domain.ro:443 -servername domain.ro 2>/dev/null | openssl x509 -noout -dates -subject +``` + +### Verificare Task Scheduler +```powershell +Get-ScheduledTask | Where-Object {$_.TaskName -like "*acme*"} +``` + +### Verificare Certificate IIS +```powershell +Get-ChildItem Cert:\LocalMachine\My | Where-Object { + $_.Issuer -like "*Let's Encrypt*" -and $_.NotAfter -gt (Get-Date) +} | Select-Object Subject, NotAfter, Thumbprint +``` + +## Reînnoire + +### Automată +- Task Scheduler verifică zilnic +- Reînnoiește automat cu 30 zile înainte de expirare + +### Manuală +```powershell +cd C:\Tools\win-acme +.\wacs.exe --renew --force +iisreset +``` + +## Troubleshooting + +### Certificat Vechi Încă Servit +```powershell +# Verifică SNI +Get-WebBinding | Where-Object {$_.Protocol -eq "https"} | Select-Object @{N='Site';E={$_.ItemXPath -replace '.*name=''([^'']+)''.*','$1'}}, bindingInformation, @{N='SNI';E={($_.sslFlags -band 1) -eq 1}} + +# Forțează reinstalare +cd C:\Tools\win-acme +.\wacs.exe --renew --force +iisreset +``` + +### Validare HTTP-01 Eșuează +- Verifică că portul 80 este accesibil din internet +- Verifică că DNS pointează corect +- Verifică că URL Rewrite nu blochează `/.well-known/acme-challenge/*` + +### Certificate Nu Se Asociază Automat +Folosește scriptul: `configure-iis-sni.ps1` + +## Structură Site-uri IIS + +| Site ID | Nume | Hostname | Binding HTTPS | SNI | +|---------|--------------------|-----------------------|------------------------|----------| +| 1 | Default Web Site | roa.romfast.ro | *:443:roa.romfast.ro | ☑️ Activ | +| 2 | Dokploy | dokploy.romfast.ro | *:443:dokploy.romfast.ro | ☑️ Activ | +| 3 | Gitea | gitea.romfast.ro | *:443:gitea.romfast.ro | ☑️ Activ | + +## Scripturi Utile + +### Script Complet Configurare SNI +Locație: `/mnt/e/proiecte/ROMFASTSQL/proxmox/scripts/configure-iis-sni.ps1` + +```powershell +cd D:\kit\ssl +.\configure-iis-sni.ps1 +``` + +### Script Verificare Certificate +Locație: `/mnt/e/proiecte/ROMFASTSQL/proxmox/scripts/verify-letsencrypt.ps1` + +```powershell +cd D:\kit\ssl +.\verify-letsencrypt.ps1 +``` + +## Comenzi Rapide + +```powershell +# Instalare +Expand-Archive win-acme.zip -DestinationPath C:\Tools\win-acme + +# Generare certificate +cd C:\Tools\win-acme +.\wacs.exe --source iis --siteid X --accepttos --emailaddress email@domain.com + +# Verificare +.\wacs.exe --list + +# Reînnoire +.\wacs.exe --renew --force + +# Restart IIS +iisreset +``` + +## Note Importante + +- **SNI este OBLIGATORIU** pentru multiple certificate pe același IP:port +- Certificatele expiră la **90 zile** +- Task Scheduler reînnoiește automat cu **30 zile** înainte +- Fiecare domeniu trebuie să fie **accesibil pe port 80** din internet pentru validare HTTP-01 +- DNS trebuie să pointeze corect către IP-ul public