← 아티클 목록

SSL 인증서 오류 해결 — 만료·체인·이름 불일치 진단법

2026-09-21#networking#TLS#트러블슈팅

HTTPS 요청이 인증서 검증에서 막히면 브라우저나 curl이 다음 같은 메시지를 냅니다.

OUTPUT
curl: (60) SSL certificate problem: certificate has expired

"certificate problem"으로 뭉뚱그려지지만 원인은 보통 셋 중 하나입니다: 만료, 체인 누락, 이름 불일치. 어느 쪽인지부터 가려내야 합니다.

먼저 인증서를 직접 본다

로컬 터미널
openssl s_client -connect example.com:443 -servername example.com < /dev/null

출력에서 Verify return code 줄이 핵심입니다. 만료·체인·이름에 따라 코드가 다릅니다. 만료일과 도메인만 빠르게 보려면:

로컬 터미널
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \
  | openssl x509 -noout -dates -subject -ext subjectAltName

원인별 해석과 해결

에러 메시지원인해결
certificate has expired유효기간 만료인증서 갱신·재발급
unable to get local issuer certificate중간 인증서(체인) 누락서버에 intermediate 묶어 설치
does not match / name mismatchCN/SAN에 요청 도메인 없음SAN에 도메인 포함해 재발급

① 만료 — notAfter 확인

OUTPUT
notBefore=Jun  1 00:00:00 2026 GMT
notAfter=Sep  1 00:00:00 2026 GMT   -- 이 날짜가 지났으면 만료

② 체인 누락 — 서버가 중간 인증서를 안 보냄 서버 인증서는 멀쩡한데 unable to get local issuer가 뜨면 intermediate가 빠진 것입니다. 풀체인(서버+중간)을 배포합니다.

로컬 터미널
# 서버가 보낸 체인 개수 확인 (보통 2장 이상이어야 정상)
openssl s_client -connect example.com:443 -showcerts < /dev/null 2>/dev/null \
  | grep -c "BEGIN CERTIFICATE"

③ 이름 불일치 — SAN에 도메인이 없음 인증서의 Subject Alternative Name에 접속한 도메인이 없으면 검증 실패입니다. 와일드카드(*.example.com)는 한 단계 서브도메인만 커버한다는 점에 주의하세요.

로컬 터미널
openssl x509 -noout -ext subjectAltName -in cert.pem   # SAN 목록 확인

체크리스트

로컬 터미널
# 1. 만료일
openssl x509 -noout -enddate -in cert.pem

# 2. 체인 (2장 이상인지)
openssl s_client -connect <host>:443 -showcerts </dev/null 2>/dev/null | grep -c CERTIFICATE

# 3. SAN에 도메인 포함 여부
openssl x509 -noout -ext subjectAltName -in cert.pem

세 가지를 순서대로 보면 "certificate problem" 한 줄이 정확히 어떤 문제인지로 좁혀집니다.


openssl로 인증서를 직접 뜯어보고 만료·체인·이름 오류를 재현하는 실습은 네트워크 트랙에서 회원가입 없이 무료로 할 수 있습니다.