Come appare il messaggio
Type: unauthorized Detail: 2001:db8::10: Invalid response from http://beispiel.de/.well-known/acme-challenge/kX3v9...: 404Cause frequenti
- Un record AAAA punta a un IPv6 dove non risponde nessun vhost o quello sbagliato: Let's Encrypt preferisce IPv6.
- Il DNS punta ancora al vecchio server (migrazione, TTL alto).
- Regole di rewrite o redirect (Nextcloud, WordPress, HTTPS forzato verso un altro host) intercettano il percorso.
- Percorso
--webrootsbagliato: il file non finisce dove nginx lo serve. - Un CDN, un proxy o il firewall blocca la porta 80.
Verifica
- Controlla i record A e AAAA
dig +short A example.com; dig +short AAAA example.com - Testa il percorso della challenge via IPv6
curl -6 -sI http://example.com/.well-known/acme-challenge/test - nginx ascolta su IPv6, porta 80?
nginx -T 2>/dev/null | grep -E 'listen .*\[::\]:80' - Prova l'emissione senza consumare i rate limit
certbot certonly --dry-run --webroot -w /var/www/letsencrypt -d example.com
Soluzione
- Aggiungi
listen [::]:80;al vhost HTTP oppure elimina il record AAAA sbagliato. - Servi il percorso della challenge prima di ogni redirect:
location ^~ /.well-known/acme-challenge/ { root /var/www/letsencrypt; }. - Prima di una migrazione abbassa il TTL e chiedi il certificato solo dopo lo switch.
- Se la porta 80 non è raggiungibile, passa alla challenge DNS-01 (ad esempio con un plugin DNS di certbot).
Domande frequenti
Perché nel browser funziona e per Let's Encrypt no?
Il browser magari usa IPv4 o una cache. Let's Encrypt interroga via IPv6 appena esiste un record AAAA e valida da più punti nel mondo.
Quanti tentativi falliti sono ammessi?
Let's Encrypt consente 5 validazioni fallite per account, hostname e ora. Prova prima con --dry-run sull'ambiente di staging.