브라우저에서 서비스에 접속했는데 NET::ERR_CERT_AUTHORITY_INVALID가 뜨거나, curl이 SSL certificate problem을 뱉는다면 Ingress의 TLS 설정이 어긋난 것입니다. Ingress는 클러스터 외부 트래픽을 받는 입구라서, 여기에 인증서를 제대로 매달아야 HTTPS가 끝까지 동작합니다. 증상은 인증서 자체 문제, host 불일치, Secret 누락 중 하나인 경우가 대부분입니다.
TLS는 Secret으로 들어간다
Ingress는 인증서 파일을 직접 들고 있지 않습니다. kubernetes.io/tls 타입 Secret으로 만들어 두고 Ingress가 그걸 참조합니다.
Kubernetes
kubectl create secret tls myapp-tls \
--cert=tls.crt --key=tls.key
그다음 Ingress의 spec.tls에서 이 Secret과 host를 연결합니다.
YAML
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myapp
spec:
tls:
- hosts:
- app.example.com
secretName: myapp-tls
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: myapp
port:
number: 80
원인별 해결
| 증상 | 원인 | 해결 |
|---|---|---|
ERR_CERT_AUTHORITY_INVALID | 자체 서명 인증서 | 신뢰 CA 발급(또는 cert-manager) |
ERR_CERT_COMMON_NAME_INVALID | 인증서 CN/SAN과 host 불일치 | 인증서 SAN에 접속 도메인 포함 |
| 기본 인증서(fake)로 응답 | spec.tls.hosts와 rules.host 불일치 | 두 host를 정확히 일치 |
default-token 같은 인증서 | Secret 이름 오타·미생성 | kubectl get secret myapp-tls 확인 |
cert-manager로 자동 발급
수동 갱신은 만료 사고의 원인이라, 보통 cert-manager로 Let's Encrypt 인증서를 자동 발급·갱신합니다. Ingress에 어노테이션만 달면 됩니다.
YAML
metadata:
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-prod"
발급이 안 되면 Certificate와 Order 리소스의 상태를 봅니다.
Kubernetes
kubectl describe certificate myapp-tls
kubectl get challenges # HTTP-01 검증이 막혔는지
점검 체크리스트
Kubernetes
kubectl get ingress myapp # ADDRESS·PORTS(443) 확인
kubectl get secret myapp-tls -o yaml # tls.crt/tls.key 존재
openssl s_client -connect app.example.com:443 -servername app.example.com # 실제 응답 인증서
servername을 줘서 SNI로 어떤 인증서가 돌아오는지 보면, host 매칭 문제인지 인증서 문제인지가 바로 갈립니다.
Ingress에 인증서를 직접 매달고 cert-manager로 자동 발급까지 해보는 실습은 쿠버네티스 트랙에서 회원가입 없이 무료로 해볼 수 있습니다.