kubectl doesn't trust the API server's certificate authority. Either the kubeconfig's certificate-authority-data is wrong/missing, or a corporate proxy intercepts TLS. One curl distinguishes them.
The cluster stanza needs the cluster's real CA bundle in base64. A regenerated kubeconfig, a hand-edited file, or a copied cluster entry without the CA field produces exactly this error.
An on-path box re-signs traffic with its own CA: kubectl sees a cert chain it never agreed to trust. curl -v https://<api> shows the intercepted issuer immediately.
openssl s_client -connect <api-host>:6443 -servername <api-host> </dev/null 2>/dev/null | openssl x509 -noout -issuer
kubectl config view --minify -o jsonpath='{.clusters[0].cluster.certificate-authority-data}' | base64 -d | openssl x509 -noout -subject # empty or wrong = found it
# for managed clusters: re-download the kubeconfig (aks get-credentials, gcloud container clusters...) — regenerating is safer than hand-patching
# Debian: cp corp-ca.crt /usr/local/share/ca-certificates/ && update-ca-certificates
insecure-skip-tls-verify: true makes the error vanish and removes ALL server identity checking — a debug-only tool, never a kubeconfig you commit. The issuer line is the whole diagnosis: your cluster's internal CA means kubeconfig problems; a corporate CA name means the network path is intercepted.
The browser (via corporate policy) trusts the intercepting CA; kubectl only trusts the kubeconfig's CA bundle and the system store. Same bytes, different trust anchors.
Yes: kubectl --insecure-skip-tls-verify get nodes as a one-off proves whether the error is trust-only (it works) or something deeper (it still fails).
Kustomize base with probes, PDBs, and zero-downtime rollouts already wired.
Kubernetes Production Blueprints — $27 →One-time. Yours to modify. Instant download from the NinjaOps template store.