Security2분 읽기· 연습 문제 3개

x509 unknown authority와 중간 인증서 누락 점검법

서버 인증서 자체보다 chain, CA bundle, trust store 차이 때문에 TLS 검증이 실패하는 상황에서 먼저 볼 신호, CLI 확인 순서, 흔한 오진, 안전한 복구 방향을 정리한 InfraTree 가이드입니다.

목차
  1. “certificate signed by unknown authority”는 대개 인증서가 아니라 체인 문제다
  2. 1) 중간 인증서(intermediate) 누락 — “브라우저는 되는데 curl은 안 됨”
  3. 2) 클라이언트 트러스트 스토어에 루트가 없다
  4. 3) 시스템 시간
  5. 순서
  6. 빠른 진단 체크리스트

“certificate signed by unknown authority”는 대개 인증서가 아니라 체인 문제다

이 오류는 서버 인증서가 나빠서가 아니라, 클라이언트가 리프 인증서에서 신뢰하는 루트까지 체인을 잇지 못했다는 뜻이다. 원인은 세 가지로 갈린다.

1) 중간 인증서(intermediate) 누락 — “브라우저는 되는데 curl은 안 됨”

서버가 리프 인증서만 보내고 중간 CA를 안 보내면 클라이언트가 루트까지 체인을 못 잇는다. 브라우저는 캐시했거나 AIA로 중간을 채워 넘어가지만, curl·앱 런타임은 그대로 실패한다. 이 “브라우저 OK / CLI 실패”가 전형적 신호다. 해법은 서버가 fullchain(리프+중간)을 제시하게 하는 것.

openssl s_client -connect <host>:443 -showcerts </dev/null
# 서버가 보내는 인증서가 리프 하나뿐이면 중간 누락이다

2) 클라이언트 트러스트 스토어에 루트가 없다

사내/사설 CA로 발급했다면 클라이언트 OS·런타임 트러스트에 그 루트를 넣어야 한다. 특히 슬림 컨테이너 이미지는 ca-certificates가 얇아 사내 루트가 빠지기 쉽다.

openssl verify -CAfile fullchain-ca.pem server.pem   # 로컬에서 체인 검증
ls /etc/ssl/certs                                     # 컨테이너 트러스트 확인

3) 시스템 시간

시계가 크게 어긋나면 notBefore/notAfter 위반이 “unknown authority”처럼 보이기도 한다. 컨테이너·VM의 시간 동기화를 확인한다.

순서

s_client로 서버가 보내는 체인 확인 → (중간 누락이면) fullchain 제시 → (사내 CA면) 클라이언트 트러스트에 루트 추가 → 시간 동기화. “인증서를 다시 발급”하기 전에 체인부터 보는 게 거의 항상 빠르다.

빠른 진단 체크리스트

  • 인증서가 아니라 체인 연결 실패로 보는 데서 시작한다
  • openssl s_client -showcerts로 서버가 보내는 체인을 본다
  • 리프만 보내면 중간 인증서(intermediate) 누락이다
  • 브라우저는 되고 curl은 안 되면 중간 누락 신호다
  • 해법은 서버가 fullchain(리프+중간)을 제시하게 하는 것이다
  • 사내 CA면 클라이언트 트러스트에 루트를 추가한다
  • 슬림 컨테이너는 ca-certificates가 얇아 루트가 빠지기 쉽다
  • 시스템 시간 어긋남이 unknown authority로 보이기도 한다

이 가이드로 연습하기

같은 장애를 다룬 검수된 문제입니다. 원인·복구·재발 방지를 직접 적어 보고 모범 풀이와 비교해 보세요.

다음에 읽을 가이드