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.comrisponde sulla porta 80 e reindirizza a HTTPS;https://example.comehttps://www.example.compresentano 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?
| Componente | Funzione |
|---|---|
| Let's Encrypt | autorità di certificazione pubblica che verifica il controllo del nome e firma il certificato |
| ACME v2 | protocollo che automatizza validazione, emissione, rinnovo e revoca |
| simple-acme | client ACME di terze parti che dialoga con Let's Encrypt e pilota IIS |
| Archivio certificati di Windows | conserva il certificato e la sua chiave privata sul server |
| IIS e HTTP.sys | associano il certificato a un indirizzo, una porta e un nome host |
| Attività pianificata di Windows | esegue 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.
| Metodo | Validazione | Porta o servizio necessario | Wildcard | Uso consigliato |
|---|---|---|---|---|
| HTTP-01 | risorsa sotto /.well-known/acme-challenge/ | TCP 80 pubblica | no | un sito IIS pubblico su un solo server |
| DNS-01 | record TXT sotto _acme-challenge | API DNS pubblica | sì | wildcard, cluster, porta 80 non disponibile |
| TLS-ALPN-01 | risposta TLS specifica | TCP 443 pubblica | no | infrastrutture 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:
| Parametro | Esempio |
|---|---|
| Sito IIS | IlMioSito |
| ID IIS | 2 |
| Dominio principale | example.com |
| Alias | www.example.com |
| IPv4 pubblico | 203.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:
- aprite
Manage renewalsin simple-acme; - individuate il rinnovo legato al server di staging;
- annullatelo se non vi serve più;
- eseguite poi la procedura di produzione;
- 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:
- scegliete
N: Create certificate (default settings); - selezionate il sito IIS
IlMioSito; - selezionate soltanto
example.comewww.example.com; - verificate che non siano inclusi nomi interni, vecchi alias o ambienti di prova;
- accettate le condizioni del servizio ACME;
- indicate un indirizzo e-mail operativo;
- lasciate HTTP-01 e il modulo self-hosting predefinito;
- 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:
- sorgente: binding IIS o nomi inseriti manualmente;
- nomi:
example.come*.example.comse servono entrambi; - validazione: DNS-01;
- plugin: quello del vostro provider DNS;
- chiave: RSA o EC secondo la vostra policy e i vostri client;
- archiviazione: archivio certificati di Windows;
- installazione: binding IIS.
Il wildcard *.example.com copre www.example.com o app.example.com, ma non il dominio nudo example.com né a.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
| Sintomo | Causa probabile | Verifica | Correzione |
|---|---|---|---|
connection timed out su HTTP-01 | porta 80 filtrata a monte | test esterno su TCP 80 | aprire il firewall di Windows e quello di rete |
unauthorized con 404 | server o binding sbagliato | DNS, log IIS, binding | correggere A/AAAA e l'host header |
| la validazione tenta un IPv6 sbagliato | AAAA obsoleto o incoerente | Resolve-DnsName -Type AAAA | correggere o rimuovere AAAA |
CAA forbids issuance | CAA non autorizza Let's Encrypt | Resolve-DnsName -Type CAA | autorizzare letsencrypt.org se conforme alla policy |
SERVFAIL DNS | DNSSEC o DNS autoritativo guasto | interrogazioni su ogni NS | riparare DNSSEC o il server DNS |
| il listener self-hosting non parte | prenotazione URL o software incompatibile | netsh http show urlacl | correggere la prenotazione o usare filesystem/DNS-01 |
| viene servito il certificato sbagliato | binding SNI o impronta errati | Get-WebBinding, netsh http show sslcert | correggere host header, SNI e certificato |
| il browser segnala contenuti misti | risorse ancora caricate via HTTP | console per sviluppatori | convertire in HTTPS gli URL delle risorse |
| rinnovo assente | attività eliminata o percorso spostato | Utilità di pianificazione | ricreare l'attività da simple-acme |
| rinnovo riuscito ma viene servito il vecchio certificato | passaggio IIS non installato o proxy intermedio | binding IIS e test remoto | riconfigurare l'installazione, aggiornare il terminatore TLS |
| troppe richieste | prove eseguite in produzione | log ACME e header Retry-After | attendere, 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
- isolate e analizzate il server compromesso;
- revocate il certificato;
- correggete la causa della fuga;
- generate una nuova chiave e un nuovo certificato;
- sostituite tutti i binding interessati;
- cercate altri certificati o segreti esposti;
- 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.
Apunta all'IPv4 pubblico corretto.- Ogni
AAAApubblicato 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.com né a.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
- Challenge Types: HTTP-01, DNS-01 e TLS-ALPN-01
- IPv6 Support
- Certificate Authority Authorization (CAA)
- Staging Environment
- Rate Limits
- Certificate Lifetimes
- Integration Guide e rinnovo ARI
- Revoking Certificates
simple-acme
- Download e somme SHA-256
- Installazione
- Getting started per IIS
- Automatic renewal
- Sorgente IIS
- Installare e aggiornare i binding IIS
- Validazione HTTP self-hosting
- Validazione DNS
- Riferimento della riga di comando
