I’m trying to get ACME HTTP challenge to work. But no matter what I do, I can’t persuade Traefik to accept HTTP requests. It accepts the HTTPS requests just fine (albeit with an invalid certificate) but rejects all HTTP requests with:
404 page not found
I first noticed that the ACME requests were failing
"GET /.well-known/acme-challenge/<snip> HTTP/1.1" 404 19 "-" "-" 1 "-" "-" 0ms
2025-12-16T08:26:05Z ERR Unable to obtain ACME certificate for domains error="unable to generate a certificate for the domains [hello.example.com]: error: one or more domains had a problem:\n[hello.example.com] invalid authorization: acme: error: 403 :: urn:ietf:params:acme:error:unauthorized :: <snip>: Invalid response from http://hello.example.com/.well-known/acme-challenge/<snip>: 404\n" ACME CA=https://acme-staging-v02.api.letsencrypt.org/directory acmeCA=https://acme-staging-v02.api.letsencrypt.org/directory domains=["hello.example.com"] providerName=default.acme routerName=websecure-app-hello-world-hello-world-hello-example-com@kubernetes rule="Host(`hello.example.com`) && PathPrefix(`/`)"
But then when I tried a browser accessing via HTTP, I realised all requests were failing to get through to the service. I’m deploying using helm (Traefik Charts | charts)
ports:
web:
port: 8089
# Have tried with and without this section
http:
redirections:
entryPoint:
to: websecure
scheme: https
permanent: true
websecure:
port: 8443
providers:
kubernetesIngress:
ingressEndpoint:
publishedService: traefik/traefik
enabled: true
kubernetesGateway:
enabled: false
service:
enabled: true
type: LoadBalancer
logs:
general:
level: INFO
access:
enabled: true
persistence:
enabled: true
accessMode: ReadWriteOnce
size: 128Mi
path: "/data"
# The "volume-permissions" init container is required if you run into permission issues.
# Related issue: https://github.com/traefik/traefik-helm-chart/issues/396
deployment:
initContainers:
- name: volume-permissions
image: docker.io/busybox:latest
command: ["sh", "-c", "touch /data/acme.json ; chown 65532:65532 /data /data/acme.json ; chmod -v 600 /data/acme.json"]
volumeMounts:
- name: data
mountPath: /data
resources:
requests:
cpu: "100m"
memory: "50Mi"
limits:
cpu: "300m"
memory: "150Mi"
certificatesResolvers:
default:
acme:
email: "example@example.com"
caserver: https://acme-staging-v02.api.letsencrypt.org/directory
storage: "/data/acme.json"
httpChallenge:
entryPoint: "web"
Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: hello-world
annotations:
kubernetes.io/ingress.class: traefik
traefik.ingress.kubernetes.io/router.entrypoints: websecure,web
traefik.ingress.kubernetes.io/router.tls: "true"
traefik.ingress.kubernetes.io/router.tls.certresolver: default
spec:
rules:
- host: hello.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: hello-world
port:
name: http
Any suggestions on what I’m missing?