feat(acme): (b) HTTP-01 Webroot-Handler in der API
internal/handlers/acme.go: GET /.well-known/acme-challenge/:token serviert Token-Files aus /var/lib/edgeguard/acme/.well-known/ acme-challenge/ (default; override via EDGEGUARD_ACME_WEBROOT). Validiert Token-Charset gegen RFC 8555 §8.3 (base64url, 1..128 chars) und prüft mit filepath.Abs+HasPrefix gegen path-traversal. Mounted auf der bare gin Engine vor SetupGate/RequireAuth — ACME muss unmittelbar nach HAProxy-Start funktionieren, lange bevor ein Admin Setup abgeschlossen hat. 4 Unit-Tests (valid/missing/dir/invalid-charset). Live-Smoke gegen /tmp/eg-acme bestanden. Test gegen 89.163.205.6 mit echtem certbot wird Teil von (d) — unnötig Let's-Encrypt-Rate-Limits zu verbrennen ohne stehendes HAProxy-Frontend auf dem Server. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -67,6 +67,13 @@ func main() {
|
||||
response.OK(c, gin.H{"status": "ok", "version": version})
|
||||
})
|
||||
|
||||
// ACME HTTP-01 webroot — HAProxy proxies these through pre-setup
|
||||
// so certbot can issue the first cert. Webroot location matches
|
||||
// certbot's default; override via EDGEGUARD_ACME_WEBROOT for
|
||||
// dev/tests.
|
||||
acmeWebroot := os.Getenv("EDGEGUARD_ACME_WEBROOT")
|
||||
handlers.NewACMEHandler(acmeWebroot).Register(r)
|
||||
|
||||
v1 := r.Group("/api/v1")
|
||||
v1.Use(handlers.SetupGate(setupStore))
|
||||
|
||||
|
||||
Reference in New Issue
Block a user