It means no client certificate was presented/validated on the TLS handshake—i.e., client mTLS auth did not happen for that request.
Think of it like Nginx’s $ssl_client_verify = NONE: the server (Cloudflare/F5/Kong) didn’t see a client cert, so mTLS status is absent.
Why it happens
- Client didn’t send a cert (missing
--cert/--keyin curl, or browser/keystore not configured). - mTLS not required on that hop (e.g., F5/Cloudflare set to “request/ignore” instead of “require”; Kong’s
mtls-authplugin not enabled). - TLS terminates before Kong (Cloudflare/F5 terminates TLS; the origin can’t see the client cert unless that proxy enforces mTLS itself).
- Wrong host/port/SNI that doesn’t have the mTLS policy.
Quick checks
# PEM pair
curl -vk https://api.example.com/path \
--cert client.crt --key client.key
# or PKCS#12
curl -vk https://api.example.com/path \
--cert-type P12 --cert client.p12:password
Look for SSL client certificate lines in the verbose output.
- On Cloudflare/F5:
- Require client certs on the relevant hostname/path.
- Ensure the CA used to validate client certs is uploaded/selected.
- If using Cloudflare, remember: the client’s cert terminates at Cloudflare; the origin (Kong) won’t receive it. Enforce mTLS at Cloudflare edge and use origin controls (e.g., Authenticated Origin Pulls) separately.
- On Kong:
- If using Enterprise
mtls-authplugin, enable it on the route/service and upload your CA certificate to/ca-certificates; reference it in the plugin. - If relying on Nginx-level mTLS, ensure the proxy listener is configured with
ssl_client_certificateandssl_verify_client on;(or the equivalent in your deployment).
- If using Enterprise
Interpreting statuses
- absent = no cert presented.
- failed/invalid = cert presented but couldn’t be validated (untrusted/expired/CN mismatch).
- success/verified = cert was validated.
If you share how traffic flows (Client → Cloudflare/F5 → Kong) and where you intend to enforce mTLS, I’ll give you the exact config and a working curl for that hop.