kubernetes
HTTPS, TLS, gRPC 등 암호화된 통신을 사용할 때 가장 자주 발생하는 오류 중 하나가 바로 x509 인증서 문제입니다. 특히 다음 메시지는 많은 개발자와 운영자가 경험하는 대표적인 에러입니다.
failed to verify certificate: x509: certificate has expired or is not yet valid
이 오류는 HTTPS/TLS 인증서 검증 과정에서 다음 두 가지 중 하나가 실패했음을 의미합니다.
즉, 인증서의 유효 기간이 현재 서버 시간과 맞지 않아 검증이 실패하는 것입니다.
x509: certificate has expired or is not yet valid
failed to verify certificate
Unable to connect to the server: x509...MicroK8s 환경에서 다음 오류가 발생할 경우 원인은 크게 두 가지입니다.
위 문제를 최소 조치 → 원인 확인 → 복구 순서로 해결하도록 작성되었습니다.
서버 시간이 현재보다 뒤로 밀리거나, 앞으로 가 있을 때 인증서의 “NotBefore” 시간보다 시스템 시간이 과거로 인식되어 인증서가 “아직 유효하지 않다(not yet valid)”로 판단합니다.
$ timedatectl status
$ dateMicroK8s는 시간 민감도가 높아 1~2분만 시계가 어긋나도 x509 오류가 발생합니다. 특이사항이 없으면, 인증서 확인/재발급으로 넘어가면 됩니다.
맞지 않는 부분이 있다면 아래 명령어를 실행하여 확인 합니다.
$ sudo systemctl restart systemd-timesyncd
$ timedatectl statussudo timedatectl set-ntp false
sudo date -s "2025-11-20 14:20:00"
온프라 환경에서는 snap 자동 업데이트 시 인증서가 재생성되거나 시간 오차로 인해 유효기간이 깨질 수 있습니다.
ls /var/snap/microk8s/current/certssudo openssl x509 -in /var/snap/microk8s/current/certs/server.crt -noout -dates
sudo openssl x509 -in /var/snap/microk8s/current/certs/front-proxy-client.crt -noout -dates
# Sample
$ sudo openssl x509 -in /var/snap/microk8s/current/certs/server.crt -noout -dates
notBefore=Nov 5 03:49:22 2025 GMT
notAfter=Nov 5 03:49:22 2026 GMT반드시 1단계 시간 점검 및 조치 후에 시도해야합니다. 문제가 되는 인증서를 재발급 합니다.
sudo microk8s.refresh-certs --cert server.crt
sudo microk8s.stop
sudo microk8s.start엣지 케이스로 kubeconfig가 오래된 cert를 들고 있을 수 있기 때문에 갱신해 줍니다.
sudo microk8s.config > ~/.kube/config
이 작업은 단순히, MicroK8s의 kubeconfig를 사용자 홈 디렉토리에 복사해서 kubectl이 해당 파일을 참조하도록 하는 것이기 때문에 ~/.kube/ 폴더나 ~/.kube/config 파일이 없을 수도 있습니다. 복사본을 만들어 주는 것도 공식 가이드에서 권장하는 방식이기 때문에, 시스템이나 클러스터에 영향이 없어도 만들어 두는 것이 좋습니다. 다만, 기존에 파일이 있다면, 다른 설정들이 사라질 수 도 있기 때문에 백업 후에 확인해보는 것이 좋습니다.
문제 지속 시, 아래의 명령어를 통해 추가 원인 분석이 필요합니다.
$ microk8s.inspect