SECURITY WARNING: Never run commands you don't understand. Always review code before execution. Use at your own risk.
Ingress New Added 17 October 2026

Kubernetes Ingress Controller Fake Certificate served instead of yours

ingress-nginx serves its built-in self-signed certificate whenever it cannot match the request to a usable TLS secret. The secret may be missing or in a different namespace from the Ingress, the hostname in spec.tls may not match spec.rules, or the client is not sending SNI at all. cert-manager users often see it for a few minutes while the first certificate is still being issued.

Quick fix

Read the commands before running them. Anything that restarts a service, deletes data or changes permissions should be tried on a non-production system first.

Quick fix
# What certificate is actually served for this hostname?
openssl s_client -connect app.example.com:443 -servername app.example.com </dev/null 2>/dev/null | openssl x509 -noout -subject -issuer -dates

# The secret must exist in the same namespace as the Ingress
kubectl get ingress app -n prod -o jsonpath="{.spec.tls}"; echo
kubectl get secret app-tls -n prod -o jsonpath="{.type}"; echo

# Hosts in spec.tls must match spec.rules exactly
kubectl get ingress app -n prod -o yaml | grep -A3 -E "tls:|host:"

# The controller logs why it fell back
kubectl logs -n ingress-nginx deploy/ingress-nginx-controller | grep -i -E "ssl|certificate" | tail

# cert-manager: is the certificate actually ready?
kubectl get certificate -n prod

How to diagnose Ingress errors

An Ingress failure is a routing failure, and there are only a few places it can break: the IngressClass is missing so no controller claims the resource, the path or host does not match, the backing Service has no endpoints, or the TLS secret is absent or in the wrong namespace. The "default backend - 404" page is the controller saying it received the request but found no rule for it.

If the quick fix above does not resolve it, work through these steps. They apply to this whole class of error, not just to this one message, which is usually what saves the time.

  1. Work backwards from the pod: kubectl get endpoints <service>. If it is empty, the Service selector does not match any ready pod and no Ingress configuration will help.
  2. Check that a controller has claimed the Ingress: kubectl describe ingress <name> should show events and an assigned address. No address means no controller is watching that IngressClass.
  3. Read the controller's own logs (kubectl logs -n ingress-nginx deploy/ingress-nginx-controller). They log rejected configuration and certificate problems explicitly.
  4. Remember TLS secrets must live in the same namespace as the Ingress. This is the single most common TLS mistake.
  5. Verify path type semantics: Prefix, Exact and ImplementationSpecific match differently, and regex behaviour varies between controllers.

Tools worth reaching for

  • kubectl describe ingress
  • kubectl get endpoints
  • controller logs
  • curl -H 'Host: …'
  • openssl s_client -servername

Authoritative references

Primary documentation for this error, worth reading before applying any fix in production.

kubernetes.github.io kubernetes.io

Related Ingress errors

See all 20 Ingress errors →

Browse other categories

Something missing or wrong?

This entry is maintained by hand. If the fix is out of date, incomplete, or you have a better one, email a correction and it will be reviewed.