"certificate expired" 및 일반적인 SSL/TLS 오류 해결: 완벽 가이드
SSL(Secure Sockets Layer)과 그 후속 기술인 TLS(Transport Layer Security)는 인터넷 보안을 유지하는 핵심 프로토콜입니다. 브라우저와 웹사이트 간에 전송되는 데이터가 암호화되어 개인정보를 보호하도록 보장합니다. 하지만 인증서에 문제가 생기면 브라우저는 무서운 경고 페이지를 표시하고, 이는 방문자의 99%를 떠나게 만들 수 있습니다.
이 가이드에서는 가장 흔한 SSL/TLS 오류의 의미와 발생 원인, 그리고 사용자와 웹사이트 소유자 모두를 위한 해결 방법을 설명합니다.
1. 일반적인 SSL/TLS 오류 메시지
사용 중인 브라우저(Chrome, Firefox, Safari)나 개발 환경(Node.js, Python)에 따라 다른 오류 코드가 표시됩니다.
- Chrome:
ERR_CERT_DATE_INVALID(인증서 날짜 유효하지 않음),ERR_CERT_AUTHORITY_INVALID(신뢰할 수 없는 인증 기관),ERR_CERT_COMMON_NAME_INVALID,ERR_SSL_PROTOCOL_ERROR - Node.js:
CERT_HAS_EXPIRED,UNABLE_TO_VERIFY_LEAF_SIGNATURE,SELF_SIGNED_CERT_IN_CHAIN - Python (Requests):
SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed - Firefox:
SEC_ERROR_EXPIRED_CERTIFICATE,MOZILLA_PKIX_ERROR_SELF_SIGNED_CERT
2. 주요 원인 및 해결책
2.1 "certificate expired" (ERR_CERT_DATE_INVALID)
SSL 인증서는 특정 기간(보통 90일에서 1년) 동안만 유효하도록 발행됩니다. 이 날짜가 지나면 인증서는 더 이상 유효하지 않습니다.
원인: 웹사이트 소유자가 인증서 갱신을 잊었거나, Let's Encrypt와 같은 자동 갱신 프로세스가 실패한 경우입니다.
해결책:
- 웹사이트 소유자: 즉시 인증서를 갱신하세요. Let's Encrypt를 사용하는 경우
certbot로그나 ACME 클라이언트 설정을 확인하세요. - 사용자: 컴퓨터의 시스템 날짜와 시간을 확인하세요. 시계가 잘못되어 있으면 브라우저가 유효한 인증서를 만료된 것으로 판단할 수 있습니다.
2.2 "self-signed certificate" (ERR_CERT_AUTHORITY_INVALID)
기본적으로 브라우저는 DigiCert나 Let's Encrypt와 같이 알려진 "인증 기관(CA)"에서 발행한 인증서만 신뢰합니다. 자가 서명 인증서(self-signed certificate)는 사용자가 직접 만든 인증서입니다.
원인:
- 운영 중인 웹사이트에 자가 서명 인증서를 사용한 경우.
- 컴퓨터의 "신뢰할 수 있는 루트" 저장소에 추가되지 않은 사설/기업용 CA를 사용하는 경우.
해결책:
- 운영 환경: Let's Encrypt에서 무료 인증서를 받거나 상용 CA에서 유료 인증서를 구입하세요.
- 개발 환경: 로컬에서 자가 서명 인증서를 사용하는 것은 괜찮지만, 도구가 이를 신뢰하도록 설정하거나 검증을 우회해야 합니다(우회는 보안상 좋지 않습니다).
2.3 "certificate chain incomplete" (UNABLE_TO_VERIFY_LEAF_SIGNATURE)
SSL 인증서는 단일 파일이 아니라 루트 CA까지 이어지는 신뢰의 사슬(체인)입니다. 서버 설정에서 "중간 인증서(Intermediate CA)"가 누락되면 브라우저는 체인을 검증할 수 없습니다.
원인: 서버가 "리프(사이트)" 인증서만 제공하고 "풀체인(사이트 + 중간)" 인증서를 제공하지 않는 경우입니다.
해결책:
Nginx나 Apache와 같은 웹 서버가 CA에서 제공한 fullchain.pem(또는 그에 상응하는 파일)을 사용하도록 설정되어 있는지 확인하세요.
2.4 "SSL handshake failed"
이는 클라이언트와 서버 간의 초기 "핸드셰이크" 과정에서 발생하는 광범위한 오류입니다.
원인:
- 프로토콜 불일치(예: 클라이언트는 TLS 1.0만 지원하는데 서버는 TLS 1.3을 요구하는 경우).
- 암호화 스위트(Cipher Suite) 불일치.
- 서버 측 방화벽이나 프록시가 연결을 차단하는 경우.
해결책: 서버의 TLS 구성을 확인하세요. 안전하고 호환성 있는 설정을 위해 Mozilla SSL Configuration Generator를 사용하는 것을 권장합니다.
3. 고급 문제 해결
3.1 SNI (Server Name Indication) 이슈
하나의 IP 주소에서 여러 웹사이트를 호스팅하는 현대적인 서버에서는 서버가 어떤 인증서를 보여줘야 할지 알아야 합니다. 클라이언트가 SNI를 지원하지 않으면(현재는 드묾), 서버가 잘못된 인증서를 보여주어 COMMON_NAME_INVALID 오류가 발생할 수 있습니다.
3.2 HSTS (HTTP Strict Transport Security)
웹사이트가 HSTS를 사용하면, SSL 오류가 발생했을 때 브라우저가 사용자의 "위험을 무릅쓰고 계속하기"를 거부합니다. 이는 중간자 공격을 방지하기 위한 보안 기능입니다. 해결책: 반드시 SSL 오류를 직접 수정해야 합니다. HSTS를 우회할 방법은 없습니다.
4. 예방 및 권장 사항
- 자동 갱신: Let's Encrypt(Certbot 사용) 또는 Cloudflare의 Managed SSL과 같이 자동 갱신 기능을 제공하는 서비스를 사용하세요.
- 모니터링: SSL 인증서 만료 및 상태를 모니터링하는 서비스를 이용하세요.
- 풀체인 사용: 서버 설정에 항상 전체 인증서 체인(Full Chain)을 포함하세요.
- 취약한 프로토콜 비활성화: SSLv2, SSLv3, TLS 1.0, TLS 1.1을 비활성화하고 TLS 1.2 및 1.3만 허용하세요.
5. 자주 묻는 질문 (FAQ)
Q: SSL 경고 창에서 "계속 진행"을 클릭해도 안전한가요?
A: 자신의 로컬 사이트를 테스트하는 개발자인 경우에만 안전합니다. 은행, 이메일, SNS와 같은 공공 사이트에서는 절대 하지 마세요. 데이터 도난의 위험이 큽니다.
Q: 데스크톱에서는 잘 되는데 모바일에서만 SSL 오류가 발생하는 이유는 무엇인가요?
A: 주로 certificate chain incomplete(인증서 체인 불완전) 문제 때문입니다. 데스크톱 브라우저는 누락된 중간 인증서를 자동으로 채우는 능력이 뛰어나지만, 모바일 브라우저는 훨씬 더 엄격합니다.
Q: Cloudflare가 SSL 오류를 고쳐주나요?
A: Cloudflare는 사용자와 Cloudflare 사이의 SSL 오류를 가려줄 수 있지만, 완전한 보안을 위해서는 Cloudflare와 서버 사이에도 유효한 인증서(또는 Cloudflare Origin 인증서)가 필요합니다.
6. 빠른 확인 도구
인증서를 검사하거나 체인을 확인해야 하나요? 저희의 SSL Certificate Checker & Decoder 를 사용해 보세요. 다음 기능을 제공합니다:
- PEM 및 CRT 파일 디코딩: 만료 날짜 및 발행자 정보 확인.
- 인증서 체인 검증: 누락된 중간 인증서 식별.
- 형식 변환: PEM, DER, PFX 등 간의 변환.
관련 오류
- JSON의 'Unexpected token' 오류 해결 방법
- 'invalid base64 string' 오류 수정 방법
- 'JWT expired' 및 일반적인 JWT 오류 해결