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 mismatch | CN/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로 인증서를 직접 뜯어보고 만료·체인·이름 오류를 재현하는 실습은 네트워크 트랙에서 회원가입 없이 무료로 할 수 있습니다.