Windows31 agosto 2026 36 visualizzazioni

Installare Let's Encrypt su IIS: HTTPS e rinnovo automatico

Installare Let's Encrypt su IIS: HTTPS e rinnovo automatico

Questa guida spiega come installare un certificato TLS di Let's Encrypt su un sito IIS ospitato su un VPS Windows Server. La procedura principale utilizza simple-acme. Copre la validazione HTTP-01, i certificati wildcard tramite DNS-01, i binding IIS con SNI, il rinnovo pianificato, HSTS, il monitoraggio e gli errori più frequenti.

Il risultato atteso è il seguente:

  • http://example.com risponde sulla porta 80 e reindirizza a HTTPS;
  • https://example.com e https://www.example.com presentano un certificato valido;
  • il certificato contiene i nomi DNS corretti nei suoi SAN;
  • IIS usa il binding giusto sulla porta 443;
  • un'attività pianificata verifica ogni giorno se serve un rinnovo;
  • il prossimo rinnovo può riuscire senza intervento umano.

Metodo, perimetro e limiti di questa guida

Le informazioni sono state riscontrate il 29 agosto 2026 con la documentazione ufficiale di Let's Encrypt, di Microsoft IIS e di simple-acme. I comandi sono stati confrontati con i riferimenti PowerShell e IIS pubblicati da Microsoft.

Versioni, limiti di emissione e durate di validità cambiano con regolarità. Prima di applicare questa procedura in produzione, riproducetela su un VPS di preproduzione con un sottodominio reale e verificate i valori numerici di questo articolo sulle pagine ufficiali collegate nel testo.

Questa guida riguarda un sito IIS pubblico associato a un nome DNS. Non tratta i certificati per controller di dominio, LDAPS o AD CS, né Exchange, RDS Gateway o SQL Server, né una PKI interna, né un cluster IIS senza distribuzione centralizzata dei certificati, né un proxy che termina il TLS su un'altra macchina. In quei casi il certificato può comunque provenire da un'autorità ACME, ma il metodo di installazione e rinnovo va adattato al servizio.

Let's Encrypt, ACME, IIS e simple-acme: chi fa cosa?

ComponenteFunzione
Let's Encryptautorità di certificazione pubblica che verifica il controllo del nome e firma il certificato
ACME v2protocollo che automatizza validazione, emissione, rinnovo e revoca
simple-acmeclient ACME di terze parti che dialoga con Let's Encrypt e pilota IIS
Archivio certificati di Windowsconserva il certificato e la sua chiave privata sul server
IIS e HTTP.sysassociano il certificato a un indirizzo, una porta e un nome host
Attività pianificata di Windowsesegue regolarmente simple-acme per verificare i rinnovi

Let's Encrypt rilascia certificati Domain Validation. Dimostrano il controllo tecnico dei nomi richiesti e cifrano la connessione. Non certificano l'identità giuridica di un'azienda e non correggono né un'applicazione vulnerabile né un server compromesso. Let's Encrypt non offre certificati OV o EV, come indica la sua FAQ ufficiale.

I certificati pubblici vengono inoltre iscritti nei registri di Certificate Transparency. I nomi DNS presenti nel certificato non vanno quindi considerati segreti. Let's Encrypt spiega il funzionamento nella sua documentazione sui log CT.

simple-acme o win-acme: quale scegliere?

win-acme resta il client più noto dell'ecosistema IIS. simple-acme si presenta sul proprio sito come un sostituto retrocompatibile, sviluppato dalla stessa persona. Al 29 agosto 2026 simple-acme pubblica la versione 2.4.0, mentre win-acme continua a distribuire la propria 2.2.9.1: entrambi i progetti sono disponibili, e passare dall'uno all'altro è una scelta, non un obbligo.

Questa guida usa simple-acme perché è il ramo aggiornato più di recente. Se già utilizzate win-acme e i vostri certificati si rinnovano correttamente, nulla vi obbliga a migrare in fretta.

La documentazione introduttiva conferma che lo strumento rileva i binding IIS, usa Let's Encrypt per impostazione predefinita, esegue una validazione HTTP, installa il certificato nell'archivio di Windows, crea o aggiorna i binding HTTPS e crea un'attività pianificata di rinnovo.

simple-acme non è un prodotto Microsoft né un «client ufficiale Let's Encrypt». È software open source di terze parti. Scaricatelo esclusivamente dal sito simple-acme o dal repository GitHub collegato, quindi verificate l'integrità del file.

Se usate già win-acme

Non eliminate alla cieca win-acme né la sua cartella in %ProgramData%. Iniziate da un inventario:

Get-ScheduledTask |
    Where-Object TaskName -Match "win-acme|simple-acme" |
    Select-Object TaskName, State, TaskPath

Censite poi i rinnovi e la posizione della loro configurazione. simple-acme è annunciato come sostituto compatibile, ma una migrazione di server o di contesto DPAPI richiede la verifica di segreti, percorsi, plugin e certificati. Seguite la procedura di migrazione di simple-acme e conservate un backup prima di ogni modifica.

Capire HTTP-01, DNS-01 e TLS-ALPN-01

Let's Encrypt deve verificare che controlliate ogni nome richiesto.

MetodoValidazionePorta o servizio necessarioWildcardUso consigliato
HTTP-01risorsa sotto /.well-known/acme-challenge/TCP 80 pubblicanoun sito IIS pubblico su un solo server
DNS-01record TXT sotto _acme-challengeAPI DNS pubblicawildcard, cluster, porta 80 non disponibile
TLS-ALPN-01risposta TLS specificaTCP 443 pubblicanoinfrastrutture TLS avanzate

Per HTTP-01, Let's Encrypt richiede una risorsa in questa forma:

http://example.com/.well-known/acme-challenge/<TOKEN>

La validazione arriva obbligatoriamente sulla porta 80. Let's Encrypt può seguire fino a dieci redirezioni, ma solo verso HTTP o HTTPS e verso le porte 80 o 443. Con HTTP-01 non si può ottenere *.example.com. Queste regole sono descritte nella pagina ufficiale Challenge Types.

Per DNS-01 il client pubblica un TXT sotto:

_acme-challenge.example.com

DNS-01 consente i wildcard e funziona senza server web pubblico. Per restare automatizzabile servono però un'API DNS oppure la delega di _acme-challenge verso una zona automatizzabile. Usate credenziali API con privilegi ridotti: dare al server web una chiave capace di modificare tutte le vostre zone DNS aumenta molto l'impatto di una compromissione.

Prerequisiti

Servono un VPS Windows Server aggiornato, un accesso amministratore via RDP o console, IIS installato con un sito che già risponde in HTTP, un dominio o sottodominio pubblico sotto il vostro controllo, un record A e, se esiste, un AAAA corretto, le porte TCP 80 e 443 aperte nel firewall di Windows e nel firewall di rete, connettività HTTPS in uscita verso l'API ACME, un indirizzo e-mail operativo sorvegliato e un backup della configurazione IIS prima di ogni modifica.

I nostri VPS Windows offrono un ambiente Windows amministrabile con accesso amministratore completo. Poiché versioni, risorse e opzioni possono cambiare, verificate la pagina prodotto al momento del deployment.

1. Verificare Windows Server e IIS

Aprite Windows PowerShell come amministratore:

Get-ComputerInfo |
    Select-Object WindowsProductName, WindowsVersion, OsBuildNumber

Get-WindowsFeature Web-Server
Get-Service W3SVC

Get-NetFirewallProfile |
    Select-Object Name, Enabled, DefaultInboundAction, DefaultOutboundAction

Il ruolo Web-Server deve essere installato e il servizio W3SVC in esecuzione. Se IIS non è ancora installato:

Install-WindowsFeature Web-Server -IncludeManagementTools

Install-WindowsFeature richiede una console con privilegi elevati e -IncludeManagementTools installa gli strumenti di gestione, come da riferimento per Windows Server 2025. Se partite da un server nuovo, la nostra guida ai primi passi con un VPS Windows copre la connessione iniziale e gli aggiornamenti.

Censite i siti e i loro binding:

Import-Module WebAdministration

Get-Website |
    Select-Object Name, Id, State, PhysicalPath

Get-WebBinding |
    Select-Object protocol, bindingInformation, sslFlags

Annotate nome e ID del sito da proteggere. Gli esempi seguenti usano:

ParametroEsempio
Sito IISIlMioSito
ID IIS2
Dominio principaleexample.com
Aliaswww.example.com
IPv4 pubblico203.0.113.10, valore documentale da sostituire

Gli intervalli 192.0.2.0/24, 198.51.100.0/24 e 203.0.113.0/24 sono riservati alla documentazione. Non copiateli in una configurazione reale.

Aggiungere i binding HTTP mancanti

simple-acme può ricavare i nomi dai binding IIS. Ogni nome richiesto deve quindi essere esplicito e puntare realmente a questo server.

New-WebBinding `
    -Name "IlMioSito" `
    -Protocol "http" `
    -IPAddress "*" `
    -Port 80 `
    -HostHeader "example.com"

New-WebBinding `
    -Name "IlMioSito" `
    -Protocol "http" `
    -IPAddress "*" `
    -Port 80 `
    -HostHeader "www.example.com"

Eseguite questi comandi solo se i binding non esistono già. Microsoft documenta New-WebBinding e i suoi parametri nel riferimento WebAdministration.

Verificate il risultato:

Get-WebBinding -Name "IlMioSito" -Protocol http |
    Select-Object bindingInformation

Un binding vuoto del tipo *:80: accetta tutti i nomi non catturati da un altro sito. Può nascondere un errore di configurazione e far validare il contenuto sbagliato. Su un server con più siti, usate nomi host precisi.

2. Verificare il DNS pubblico, IPv6 compreso

Dal VPS:

Resolve-DnsName example.com -Type A
Resolve-DnsName www.example.com -Type A

Resolve-DnsName example.com -Type AAAA -ErrorAction SilentlyContinue
Resolve-DnsName www.example.com -Type AAAA -ErrorAction SilentlyContinue

Le risposte A devono corrispondere all'IPv4 pubblico che serve IIS. Se esiste un AAAA, il sito deve funzionare anche su quell'IPv6.

Let's Encrypt preferisce IPv6 al primo tentativo se è pubblicato un record AAAA. Un server IPv6 che risponde con il contenuto sbagliato può far fallire la validazione senza ripiegare su IPv4. La correzione consiste nel puntare AAAA al server giusto e servire lo stesso sito, oppure nel rimuovere AAAA se non usate IPv6. Non esiste un'opzione per chiedere a Let's Encrypt di preferire IPv4. Vedi la documentazione IPv6 Support.

Verificate anche eventuali regole CAA:

Resolve-DnsName example.com -Type CAA -ErrorAction SilentlyContinue

L'assenza di CAA non impedisce l'emissione. Se esiste una policy CAA, deve autorizzare Let's Encrypt, per esempio:

example.com.  CAA 0 issue "letsencrypt.org"

Per un controllo separato dei wildcard si può usare il tag issuewild. L'identificativo CAA di Let's Encrypt è letsencrypt.org, come indica la sua documentazione CAA. Un errore SERVFAIL può segnalare una catena DNSSEC errata o un server DNS guasto.

3. Aprire solo le porte necessarie

Create regole in entrata per HTTP e HTTPS:

New-NetFirewallRule `
    -DisplayName "IIS HTTP - TCP 80" `
    -Direction Inbound `
    -Protocol TCP `
    -LocalPort 80 `
    -Action Allow `
    -Profile Any

New-NetFirewallRule `
    -DisplayName "IIS HTTPS - TCP 443" `
    -Direction Inbound `
    -Protocol TCP `
    -LocalPort 443 `
    -Action Allow `
    -Profile Any

Se queste regole esistono già, verificatele invece di creare duplicati:

Get-NetFirewallRule -DisplayName "IIS HTTP - TCP 80","IIS HTTPS - TCP 443" |
    Get-NetFirewallPortFilter

Il firewall di Windows e il firewall di rete del provider sono due livelli distinti. Una regola locale corretta non basta se il filtraggio a monte rifiuta la porta. La nostra guida per configurare il firewall di Windows Server su un VPS descrive questa separazione.

Per HTTP-01 la porta 80 deve essere raggiungibile da Internet. Let's Encrypt non pubblica un intervallo stabile di indirizzi di validazione da autorizzare: limitare l'accesso a poche IP arbitrarie prima o poi causerà un errore.

Verificate l'ascolto locale:

Get-NetTCPConnection -State Listen |
    Where-Object LocalPort -In 80,443 |
    Select-Object LocalAddress, LocalPort, OwningProcess

Poi provate da una connessione esterna al VPS:

Test-NetConnection example.com -Port 80
Test-NetConnection example.com -Port 443

Un test eseguito dal server stesso non dimostra sempre la raggiungibilità pubblica, soprattutto in presenza di NAT, proxy o filtraggio geografico.

4. Salvare la configurazione IIS

Prima di modificare i binding:

$appcmd = "$env:windir\System32\inetsrv\appcmd.exe"
& $appcmd add backup "Prima-LetsEncrypt"
& $appcmd list backup

Questo backup protegge la configurazione IIS, non i contenuti del sito, il database o i segreti dell'applicazione. Conservate anche un backup di sistema secondo la vostra policy. La nostra guida su come salvare un VPS Windows presenta diversi approcci.

5. Scaricare e verificare simple-acme

Metodo consigliato su Windows Server 2019 e 2022: archivio ufficiale

Scaricate la build Windows x64 dalla pagina ufficiale di simple-acme. Scegliete:

  • la versione trimmed per HTTP-01 e un IIS semplice: è più leggera ma non supporta i plugin;
  • la versione full se vi servono plugin esterni, in particolare per un provider DNS.

Estraete l'archivio in una posizione permanente:

C:\Program Files\simple-acme

Non lasciate wacs.exe in Download o in una cartella temporanea. L'attività pianificata dipende dal percorso dell'eseguibile.

Calcolate lo SHA-256 dell'archivio prima di estrarlo:

Get-FileHash `
    -Path "C:\Users\Administrator\Downloads\simple-acme.zip" `
    -Algorithm SHA256

Confrontate il valore, carattere per carattere, con l'hash pubblicato sulla pagina di download. Al 29 agosto 2026 la pagina ufficiale indica la versione 2.4.0, build 2.4.0.2350. Non fissate quell'hash in una procedura destinata a durare: cambia a ogni versione.

Metodo su Windows Server 2025: WinGet

La documentazione di simple-acme indica che WinGet è disponibile su Windows Server 2025:

winget install simple-acme

Verificate poi il percorso realmente installato:

Get-Command wacs.exe -ErrorAction SilentlyContinue

Su Server 2019 o 2022 preferite l'archivio ufficiale, a meno che WinGet non sia stato installato e gestito esplicitamente nella vostra immagine.

Verificare l'eseguibile

Set-Location "C:\Program Files\simple-acme"
.\wacs.exe --version

Eseguite sempre la prima configurazione da una console con privilegi di amministratore. La documentazione di installazione di simple-acme precisa che servono privilegi elevati per gestire IIS, creare l'attività pianificata e ricevere le richieste di validazione.

6. Provare in staging prima della produzione

Let's Encrypt consiglia il suo ambiente di staging per le prove. I suoi certificati non sono attendibili per i browser, ma i limiti si prestano molto meglio alla diagnosi. L'URL ACME v2 di prova è pubblicato nella documentazione di staging.

Dalla cartella di simple-acme:

.\wacs.exe --test --verbose

Scegliete lo stesso sito e gli stessi nomi della produzione. Un certificato di staging genererà un avviso di attendibilità nel browser: è normale.

Dopo la prova:

  1. aprite Manage renewals in simple-acme;
  2. individuate il rinnovo legato al server di staging;
  3. annullatelo se non vi serve più;
  4. eseguite poi la procedura di produzione;
  5. verificate che siano attivi un'attività di produzione e il binding IIS corretto.

Evitate di usare ripetutamente --nocache e --force. Al 29 agosto 2026 Let's Encrypt documenta in particolare 50 nuovi certificati per dominio registrato ogni 7 giorni, 5 certificati per insieme esatto di identificatori ogni 7 giorni e 5 errori di autorizzazione per identificatore e account ogni ora. I rinnovi coordinati tramite ARI sono esenti da questi limiti. Consultate sempre la pagina Rate Limits durante la diagnosi, perché questi valori cambiano.

7. Emettere il certificato con la procedura guidata

Avviate:

Set-Location "C:\Program Files\simple-acme"
.\wacs.exe

Per un sito IIS classico:

  1. scegliete N: Create certificate (default settings);
  2. selezionate il sito IIS IlMioSito;
  3. selezionate soltanto example.com e www.example.com;
  4. verificate che non siano inclusi nomi interni, vecchi alias o ambienti di prova;
  5. accettate le condizioni del servizio ACME;
  6. indicate un indirizzo e-mail operativo;
  7. lasciate HTTP-01 e il modulo self-hosting predefinito;
  8. lasciate l'installazione nell'archivio di Windows e i binding IIS.

Lettere ed etichette possono cambiare leggermente tra le versioni. Affidatevi al significato della scelta e alla documentazione della versione installata, non a una vecchia schermata.

Il plugin self-hosting di simple-acme avvia temporaneamente un listener in memoria. Può condividere la porta 80 con IIS e HTTP.sys. La porta resta comunque necessaria dall'esterno. Vedi la documentazione Self-hosting.

Alla fine simple-acme deve validare ogni nome, richiedere il certificato a Let's Encrypt, collocare certificato e chiave nell'archivio di Windows, creare o aggiornare i binding HTTPS corrispondenti, salvare i parametri del rinnovo e creare l'attività pianificata quotidiana.

8. Variante interamente automatizzata da riga di comando

Iniziate confermando l'ID IIS:

Get-Website -Name "IlMioSito" |
    Select-Object Name, Id

Poi adattate questo comando:

.\wacs.exe `
    --source iis `
    --siteid 2 `
    --host example.com,www.example.com `
    --validation selfhosting `
    --installation iis `
    --emailaddress [email protected] `
    --accepttos

--source iis attiva la modalità non interattiva. --siteid limita la sorgente al sito corretto e --host filtra i binding con precisione. Questi parametri sono documentati nella sorgente IIS di simple-acme e nel riferimento CLI.

Prima di integrare questo comando in uno strumento di deployment, sostituite ogni valore di esempio, eseguitelo prima con --test --verbose, non passate segreti DNS in chiaro attraverso la cronologia di PowerShell, conservate un output di log e usate l'opzione L del gestore dei rinnovi per ottenere la riga equivalente a una configurazione creata manualmente.

La riga di comando crea un nuovo rinnovo. Per modificare un rinnovo esistente usate il gestore interattivo; aggiungere nuovi parametri a --renew non riconfigura l'oggetto esistente.

9. Verificare il certificato e i binding IIS

Controllare i binding

Get-WebBinding -Name "IlMioSito" |
    Select-Object protocol, bindingInformation, sslFlags,
                  certificateHash, certificateStoreName

Dovete trovare un binding HTTPS per ciascun nome:

*:443:example.com
*:443:www.example.com

Su un VPS che ospita più siti sullo stesso IPv4 e sulla stessa porta 443, i binding devono usare SNI. In New-WebBinding il valore SslFlags = 1 indica un binding SNI; Microsoft documenta i valori da 0 a 3 nel riferimento New-WebBinding.

Controllare il certificato negli archivi di Windows

$domain = "example.com"
$stores = @(
    "Cert:\LocalMachine\WebHosting",
    "Cert:\LocalMachine\My"
)

Get-ChildItem $stores -ErrorAction SilentlyContinue |
    Where-Object {
        ($_.DnsNameList | ForEach-Object Unicode) -contains $domain
    } |
    Sort-Object NotAfter -Descending |
    Select-Object Subject, Issuer, Thumbprint,
                  NotBefore, NotAfter, HasPrivateKey

Verificate che Issuer corrisponda alla catena Let's Encrypt attesa, che HasPrivateKey valga True, che NotAfter sia nel futuro, che DnsNameList contenga tutti i nomi usati e che l'impronta corrisponda al binding HTTPS.

Alcuni profili moderni possono non valorizzare il Common Name. Il campo determinante per i nomi è il Subject Alternative Name; non basate quindi il controllo solo su Subject.

Controllare HTTP.sys

netsh http show sslcert

Microsoft consiglia di confrontare il binding in ApplicationHost.config con l'archivio SSL di HTTP.sys durante un incidente. Vedi How to Set Up SSL on IIS e il riferimento netsh http.

Controllare dall'esterno

Da un'altra rete:

curl.exe -I http://example.com/
curl.exe -I https://example.com/
curl.exe -I https://www.example.com/

Dopo aver configurato la redirezione, la prima chiamata deve restituire un 301 o 308 verso HTTPS. Le chiamate HTTPS devono rispondere senza errori di nome o di catena.

Provate anche un browser senza sessione precedente, un telefono in 4G o 5G, IPv4 e IPv6 se esiste AAAA, un analizzatore TLS esterno riconosciuto e le pagine con immagini, script e fogli di stile per individuare contenuti misti HTTP.

10. Configurare la redirezione da HTTP a HTTPS

Attivate la redirezione solo dopo aver convalidato il certificato su ciascun nome.

IIS 10 versione 1709 e successive dispongono di un meccanismo HSTS nativo a livello di sito, con redirezione da HTTP a HTTPS. Microsoft precisa che la destinazione usa la porta standard 443. Eseguite:

$appcmd = "$env:windir\System32\inetsrv\appcmd.exe"

& $appcmd set config `
    -section:system.applicationHost/sites `
    "/[name='IlMioSito'].hsts.enabled:True" `
    /commit:apphost

& $appcmd set config `
    -section:system.applicationHost/sites `
    "/[name='IlMioSito'].hsts.max-age:300" `
    /commit:apphost

& $appcmd set config `
    -section:system.applicationHost/sites `
    "/[name='IlMioSito'].hsts.includeSubDomains:False" `
    /commit:apphost

& $appcmd set config `
    -section:system.applicationHost/sites `
    "/[name='IlMioSito'].hsts.redirectHttpToHttps:True" `
    /commit:apphost

Gli attributi e questa sintassi di appcmd sono pubblicati nel riferimento Microsoft HSTS settings for a Web Site.

Iniziate con max-age=300 durante la convalida funzionale. Quando avrete osservato HTTPS e il rinnovo, passate a 60 giorni, ossia 5184000 secondi, sorvegliate gli errori di certificato e i sottodomini, poi salite a un anno, 31536000, se la policy della vostra organizzazione lo prevede.

Per modificare la durata:

& $appcmd set config `
    -section:system.applicationHost/sites `
    "/[name='IlMioSito'].hsts.max-age:5184000" `
    /commit:apphost

Attivate includeSubDomains solo se tutti i sottodomini funzionano stabilmente in HTTPS. Non attivate il precaricamento HSTS soltanto per migliorare un punteggio: l'iscrizione alla lista preload è un impegno a sé e difficile da annullare rapidamente.

HSTS trasforma gli errori di certificato in fallimenti non aggirabili per i browser che hanno memorizzato la policy. Let's Encrypt consiglia un'adozione prudente e avverte di questo rischio nella sua Integration Guide.

La porta 80 deve restare aperta dopo la redirezione?

Sì, se il rinnovo usa HTTP-01. La porta 80 può servire soltanto alla redirezione e a /.well-known/acme-challenge/, ma deve restare pubblicamente raggiungibile per le validazioni future. Let's Encrypt sa seguire una redirezione valida verso la 443, e il listener self-hosting di simple-acme può condividere la porta con IIS.

Se la vostra policy impone la chiusura permanente della 80, riconfigurate prima il rinnovo su DNS-01 o su un altro metodo compatibile. Non chiudete la porta per poi scoprire alla scadenza che il rinnovo è rotto.

11. Verificare e monitorare il rinnovo automatico

simple-acme crea un'attività pianificata dopo il primo certificato riuscito. Per impostazione predefinita viene eseguita ogni giorno con l'account SYSTEM, a un orario scelto a caso tra le 9 e le 11 per distribuire il carico. Rinnova solo quando una condizione lo richiede, in particolare la durata residua del certificato, una modifica dei nomi, una revoca, un'installazione incompleta o una raccomandazione ARI. Vedi Automatic renewal.

Elencate l'attività:

Get-ScheduledTask |
    Where-Object TaskName -Match "simple-acme|win-acme" |
    Select-Object TaskName, State, TaskPath

Mostratene lo stato:

$task = Get-ScheduledTask |
    Where-Object TaskName -Match "simple-acme" |
    Select-Object -First 1

if ($task) {
    Get-ScheduledTaskInfo `
        -TaskName $task.TaskName `
        -TaskPath $task.TaskPath
}

Controllate LastTaskResult, LastRunTime e NextRunTime. L'attività deve restare abilitata e puntare alla cartella permanente di simple-acme.

Provare senza provocare emissioni ripetute

Un controllo normale non forza un nuovo certificato:

.\wacs.exe --renew --verbose

Questo comando rinnova solo gli oggetti entrati nella loro finestra. Per una prova occasionale dell'intero processo, la documentazione propone:

.\wacs.exe --renew --force --verbose

Non eseguite --force in ciclo e non aggiungete --nocache senza motivo. Usate lo staging per la diagnosi ripetuta. La cache protegge in parte dai limiti, ma non sostituisce un metodo diagnostico.

Consultare i log

I log si trovano di norma sotto:

%ProgramData%\simple-acme\<server-acme>\Log

Per individuare i file recenti:

Get-ChildItem "$env:ProgramData\simple-acme" -Recurse -File |
    Where-Object Extension -In ".log",".txt" |
    Sort-Object LastWriteTime -Descending |
    Select-Object -First 20 FullName, LastWriteTime, Length

Consultate anche il Visualizzatore eventi di Windows. simple-acme conserva i log 120 giorni per impostazione predefinita e può inviare notifiche se è configurato un server SMTP.

Avvisare di una scadenza vicina

Questo controllo locale può essere integrato nel vostro monitoraggio:

$warningDate = (Get-Date).AddDays(21)

$expiring = Get-ChildItem `
    "Cert:\LocalMachine\WebHosting",
    "Cert:\LocalMachine\My" `
    -ErrorAction SilentlyContinue |
    Where-Object {
        $_.HasPrivateKey -and
        $_.NotAfter -lt $warningDate -and
        $_.NotAfter -gt (Get-Date)
    } |
    Sort-Object NotAfter |
    Select-Object Subject, Thumbprint, NotAfter

$expiring

Sorvegliate la data presentata al client remoto, non solo i certificati memorizzati localmente. Un vecchio certificato può continuare a essere servito se il binding IIS o il proxy non è stato aggiornato.

Al 29 agosto 2026 i certificati Let's Encrypt sono validi 90 giorni per impostazione predefinita e la grande maggioranza di quelli emessi usa questa durata. Un profilo breve di circa 6 giorni è disponibile in opzione per tutti gli abbonati. Let's Encrypt annuncia inoltre di voler ridurre la durata massima dei propri certificati a 45 giorni entro febbraio 2028, mentre le regole del settore imporranno un massimo di 47 giorni dal 15 marzo 2029. La pagina ufficiale sulla durata dei certificati mostra perché un'automazione monitorata è indispensabile.

12. Certificato wildcard con DNS-01

Per *.example.com HTTP-01 non funziona. Riavviate simple-acme e scegliete M: full options:

  1. sorgente: binding IIS o nomi inseriti manualmente;
  2. nomi: example.com e *.example.com se servono entrambi;
  3. validazione: DNS-01;
  4. plugin: quello del vostro provider DNS;
  5. chiave: RSA o EC secondo la vostra policy e i vostri client;
  6. archiviazione: archivio certificati di Windows;
  7. installazione: binding IIS.

Il wildcard *.example.com copre www.example.com o app.example.com, ma non il dominio nudo example.coma.b.example.com. Richiedete esplicitamente il dominio nudo se deve essere coperto.

La versione full di simple-acme serve per caricare plugin esterni, poiché la versione trimmed non li supporta. I plugin si installano sotto %ProgramData%\simple-acme\plugins. L'elenco aggiornato è nella documentazione sulla validazione DNS.

Sicurezza delle credenziali DNS

  • create un token dedicato alla validazione ACME;
  • limitatelo alle zone e alle azioni strettamente necessarie;
  • usate la cassaforte dei segreti di simple-acme invece di un argomento in chiaro;
  • proteggete la cartella %ProgramData%\simple-acme;
  • prevedete la rotazione e la revoca del token;
  • non usate una chiave globale di account se esiste un token limitato.

Se il vostro provider DNS non offre un'API adeguata, delegate _acme-challenge.example.com tramite CNAME o NS verso una zona di validazione automatizzabile. Così a volte si evita di dare al server web l'accesso all'intera zona principale.

13. Rafforzare TLS senza rompere Windows

Il certificato non sceglie da solo le versioni di TLS e le suite crittografiche. IIS si appoggia a Schannel, quindi la configurazione è in gran parte definita a livello di sistema.

Censite le suite:

Get-TlsCipherSuite |
    Select-Object Name, Cipher, Hash, Exchange

Microsoft raccomanda alle applicazioni di usare i valori predefiniti di sistema invece di imporre arbitrariamente le proprie versioni di protocollo. La documentazione TLS registry settings ricorda inoltre che una modifica a Schannel riguarda anche servizi diversi dal sito IIS.

Punti di controllo: installate gli aggiornamenti di Windows, mantenete TLS 1.2 per compatibilità, sappiate che TLS 1.3 è supportato a partire da Windows Server 2022, disattivate i protocolli obsoleti solo dopo un censimento dei client, testate applicazione, API, agenti di monitoraggio e client datati, salvate i parametri prima di ogni modifica ed evitate di copiare uno script del registro non versionato trovato su un blog.

La matrice di supporto è pubblicata in Protocols in TLS/SSL (Schannel SSP). Una policy troppo rigida può anche impedire al client ACME di raggiungere l'API.

14. Risoluzione dei problemi: sintomi, cause e azioni

SintomoCausa probabileVerificaCorrezione
connection timed out su HTTP-01porta 80 filtrata a montetest esterno su TCP 80aprire il firewall di Windows e quello di rete
unauthorized con 404server o binding sbagliatoDNS, log IIS, bindingcorreggere A/AAAA e l'host header
la validazione tenta un IPv6 sbagliatoAAAA obsoleto o incoerenteResolve-DnsName -Type AAAAcorreggere o rimuovere AAAA
CAA forbids issuanceCAA non autorizza Let's EncryptResolve-DnsName -Type CAAautorizzare letsencrypt.org se conforme alla policy
SERVFAIL DNSDNSSEC o DNS autoritativo guastointerrogazioni su ogni NSriparare DNSSEC o il server DNS
il listener self-hosting non parteprenotazione URL o software incompatibilenetsh http show urlaclcorreggere la prenotazione o usare filesystem/DNS-01
viene servito il certificato sbagliatobinding SNI o impronta erratiGet-WebBinding, netsh http show sslcertcorreggere host header, SNI e certificato
il browser segnala contenuti mistirisorse ancora caricate via HTTPconsole per sviluppatoriconvertire in HTTPS gli URL delle risorse
rinnovo assenteattività eliminata o percorso spostatoUtilità di pianificazionericreare l'attività da simple-acme
rinnovo riuscito ma viene servito il vecchio certificatopassaggio IIS non installato o proxy intermediobinding IIS e test remotoriconfigurare l'installazione, aggiornare il terminatore TLS
troppe richiesteprove eseguite in produzionelog ACME e header Retry-Afterattendere, rispettare Retry-After e usare lo staging

Provare il percorso HTTP-01

La validazione predefinita è gestita in memoria mentre simple-acme è in esecuzione. Per diagnosticare una rotta o un proxy potete comunque verificare che nessuna regola blocchi il prefisso:

curl.exe -I http://example.com/.well-known/acme-challenge/test

Un 404 al di fuori di una validazione è normale; un rifiuto di rete, un'autenticazione obbligatoria, un blocco del WAF o una redirezione verso una porta insolita non lo sono. Durante una validazione reale con --test --verbose, osservate la risposta dettagliata e i log.

Individuare il processo legato alla porta 80

$connection = Get-NetTCPConnection -LocalPort 80 -State Listen |
    Select-Object -First 1

if ($connection) {
    Get-Process -Id $connection.OwningProcess
}

netsh http show urlacl

Il processo System è comune con HTTP.sys e IIS; non significa automaticamente che un software malevolo occupi la porta.

Diagnosticare un certificato SNI sbagliato

Mostrate i binding HTTPS:

Get-WebBinding -Protocol https |
    Select-Object ItemXPath, bindingInformation, sslFlags,
                  certificateHash, certificateStoreName

Quando più siti condividono *:443, ogni nome deve avere il proprio binding e SNI deve essere attivo. Il binding vuoto *:443: può diventare quello predefinito per i client senza SNI e servire un certificato inatteso.

15. Manutenzione, aggiornamento e risposta agli incidenti

Aggiornare simple-acme

Su Windows Server 2025 con WinGet:

winget upgrade simple-acme

Per un'installazione manuale, scaricate il nuovo archivio ufficiale, verificate l'hash, salvate la cartella e sostituite i file del programma. I rinnovi sono archiviati separatamente sotto %ProgramData% e vanno conservati. Dopo l'aggiornamento:

.\wacs.exe --version
.\wacs.exe --list
.\wacs.exe --renew --verbose

Leggete sempre le note di rilascio prima di un cambio di ramo importante.

In caso di fuga della chiave privata

  1. isolate e analizzate il server compromesso;
  2. revocate il certificato;
  3. correggete la causa della fuga;
  4. generate una nuova chiave e un nuovo certificato;
  5. sostituite tutti i binding interessati;
  6. cercate altri certificati o segreti esposti;
  7. documentate l'incidente.

In simple-acme la revoca è disponibile in Manage renewals > Revoke certificate oppure tramite --revoke con l'identificativo del rinnovo. Let's Encrypt indica che la revoca è necessaria quando una chiave privata è compromessa e descrive i motivi accettati in Revoking Certificates.

Annullare un rinnovo non equivale a revocare un certificato. L'annullamento ferma la gestione futura; la revoca segnala che un certificato già emesso non deve più essere considerato attendibile.

Elenco di controllo per la messa in produzione

  • Windows Server e IIS sono aggiornati.
  • Il sito IIS ha host header espliciti.
  • A punta all'IPv4 pubblico corretto.
  • Ogni AAAA pubblicato serve correttamente lo stesso sito.
  • Le porte 80 e 443 sono raggiungibili dall'esterno.
  • La configurazione IIS è stata salvata.
  • simple-acme proviene dalla fonte ufficiale e il suo hash è stato verificato.
  • Lo staging è stato usato per la diagnosi iniziale.
  • Il certificato contiene tutti i SAN attesi.
  • I binding HTTPS usano SNI se l'IP è condiviso.
  • HTTP reindirizza a HTTPS senza ciclo.
  • HSTS è stato introdotto gradualmente.
  • L'attività pianificata esiste, è abilitata e ha già funzionato.
  • Log e scadenza sono monitorati.
  • Il metodo di validazione sarà disponibile anche al prossimo rinnovo.
  • Esiste una procedura di revoca e ripristino.

Domande frequenti

Let's Encrypt è davvero gratuito su IIS?

Sì. Let's Encrypt non fa pagare l'emissione dei suoi certificati DV. Il VPS Windows, il nome a dominio, l'amministrazione ed eventuali servizi DNS restano a pagamento presso i rispettivi fornitori.

Il certificato dura 90 giorni?

Al 29 agosto 2026 il profilo classico resta valido 90 giorni per impostazione predefinita. È disponibile in opzione un profilo breve di circa 6 giorni, e Let's Encrypt prevede di ridurre la durata massima a 45 giorni entro febbraio 2028. Non impostate mai l'esercizio su un rinnovo manuale trimestrale.

La porta 80 è obbligatoria?

È obbligatoria per HTTP-01, anche se il listener interno usa un'altra porta dietro una redirezione o un NAT. Non serve per DNS-01. TLS-ALPN-01 usa la 443 ma si adatta soprattutto a infrastrutture avanzate.

Si può chiudere la porta 80 dopo l'installazione?

No, se il rinnovo resta su HTTP-01. Mantenetela raggiungibile per la redirezione e le validazioni, oppure spostate il rinnovo su DNS-01 prima di chiuderla.

Come ottenere un wildcard *.example.com?

Usate DNS-01 con un plugin API automatizzato, disponibile nella versione full di simple-acme. Aggiungete anche example.com al certificato se il dominio nudo deve essere coperto.

Un certificato wildcard copre tutti i livelli?

No. *.example.com copre un solo livello, come www.example.com, ma né example.coma.b.example.com.

Meglio RSA o ECDSA?

RSA offre una compatibilità molto ampia. ECDSA fornisce chiavi e firme più compatte, ma va verificato con i client più datati. Per un primo deployment IIS di uso generale, l'impostazione predefinita dello strumento è di solito la scelta più prudente.

HTTPS basta a mettere in sicurezza il sito?

No. HTTPS cifra il trasporto e autentica il nome presentato. Non sostituisce aggiornamenti, controllo degli accessi, backup, sicurezza applicativa, protezione dei segreti e monitoraggio.

E su un VPS Linux?

L'approccio è lo stesso, ma cambia lo strumento: su Nginx o Apache si usa di norma Certbot. Vedi la nostra guida su come installare un certificato SSL Let's Encrypt con Certbot su Nginx o Apache.

Conclusione

Su IIS, ottenere un certificato Let's Encrypt richiede pochi minuti con simple-acme. Ciò che merita attenzione è tutto quello che viene dopo: il binding HTTPS corretto su ciascun nome, la redirezione senza cicli, HSTS introdotto gradualmente e soprattutto un rinnovo che funzioni ancora tra tre mesi senza di voi.

Ricordate le tre trappole più comuni: un record AAAA che punta altrove e fa fallire la validazione, una porta 80 chiusa dopo il passaggio a HTTPS benché il rinnovo ne dipenda, e un binding IIS mai aggiornato che continua a servire il vecchio certificato. Verificate questi tre punti e l'automazione reggerà.

Principali fonti tecniche

Let's Encrypt

simple-acme

Microsoft