Python Requests SSL 인증서 오류 CERTIFICATE_VERIFY_FAILED 완벽 해결 가이드

Python으로 웹 크롤링이나 API 호출 중 CERTIFICATE_VERIFY_FAILED 에러를 마주했다면, 이는 SSL/TLS 인증서 검증 실패로 인한 핸드셰이크 오류입니다. 단순히 verify=False로 우회하는 것은 보안상 위험하며, 근본 원인을 파악하고 환경별로 적절한 해결책을 적용해야 합니다. 이 글에서는 인증서 오류의 주요 원인과 실전에서 검증된 해결 방법을 단계별로 제시합니다.

1. SSL 인증서 오류의 주요 원인

Python의 requests 라이브러리는 기본적으로 verify=True 옵션으로 동작하며, 원격 서버의 TLS 인증서를 검증합니다. 이 과정에서 오류가 발생하는 주요 원인은 다음과 같습니다.

  • 인증서 만료 또는 유효 기간 문제: 서버의 인증서가 만료되었거나, 클라이언트 시스템 시간이 동기화되지 않아 인증서가 아직 유효하지 않다고 판단되는 경우
  • CA 인증서 번들 누락 또는 구버전: Python 환경의 certifi 패키지가 최신 루트 인증서를 포함하지 않거나, OS 레벨의 CA 인증서가 손상된 경우
  • 자체 서명 인증서(Self-Signed Certificate): 내부망이나 개발 환경에서 공인 CA가 아닌 자체 서명된 인증서를 사용하는 경우
  • 프록시 또는 방화벽: 기업 네트워크의 프록시 서버가 중간에서 인증서를 재발급(MITM)하거나, 방화벽이 SSL 트래픽을 검사하는 경우
  • 서버 측 설정 오류: 중간 인증서(Intermediate Certificate) 체인이 누락되었거나, 지원하지 않는 TLS 버전을 사용하는 경우

에러 메시지에서 'self signed certificate in certificate chain', 'unable to get local issuer certificate', 'certificate is not yet valid' 등의 힌트를 통해 원인을 좁힐 수 있습니다.


Python Requests SSL 인증서 오류 CERTIFICATE_VERIFY_FAILED 완벽 해결 가이드



2. 환경별 해결 방법 (권장 순서)

2-1. 시스템 시간 동기화 확인

인증서 유효 기간 검증은 시스템 시간을 기준으로 수행됩니다. 시간이 부정확하면 유효한 인증서도 거부될 수 있습니다.

  • Linux/macOS: date 명령으로 현재 시간 확인 후, sudo timedatectl set-ntp true로 NTP 동기화 활성화
  • Windows: 제어판 → 날짜 및 시간 → 인터넷 시간 탭에서 '지금 업데이트' 실행

2-2. certifi 패키지 업데이트

Python의 requests는 certifi 패키지가 제공하는 CA 인증서 번들을 사용합니다. 이를 최신 버전으로 업데이트하는 것이 가장 우선입니다.

pip install --upgrade certifi

설치 후 Python에서 인증서 경로를 확인하고, SSL 컨텍스트에 명시적으로 적용할 수 있습니다.

import certifi
import ssl

print(certifi.where())  # 인증서 번들 경로 확인

ssl_context = ssl.create_default_context(cafile=certifi.where())
# requests에서는 기본적으로 certifi를 사용하므로 별도 설정 불필요

2-3. OS 레벨 CA 인증서 재설치

OS의 루트 인증서가 손상되었거나 누락된 경우, 다음 명령으로 재설치합니다.

  • macOS: Python 설치 시 포함된 인증서 설치 스크립트 실행
    open "/Applications/Python 3.x/Install Certificates.command"
  • Ubuntu/Debian: sudo apt-get install --reinstall ca-certificates
  • RHEL/CentOS: sudo yum reinstall ca-certificates

2-4. pip 및 의존성 업그레이드

urllib3 버전 불일치 경고가 나타나는 경우, pip와 requests를 함께 업그레이드합니다.

python -m pip install --upgrade pip
pip install --upgrade requests urllib3

경고 메시지 예시(DependencyWarning: urllib3 (2.2.1) or chardet (none)/charset_normalizer (3.4.0) doesn't match a supported version)는 버전 불일치를 알리는 것으로, 업그레이드로 해결됩니다.

3. 특수 환경 대응 전략

3-1. 자체 서명 인증서 또는 내부 CA 처리

기업 내부망에서 자체 CA를 사용하는 경우, 해당 루트 인증서를 시스템에 신뢰할 수 있는 CA로 등록해야 합니다.

  • 내부 CA 루트 인증서(.crt 또는 .pem 파일)를 OS의 신뢰 저장소에 추가
  • 또는 환경변수 SSL_CERT_FILE에 certifi 경로를 지정
    export SSL_CERT_FILE=$(python -m certifi) (Linux/macOS)
    set SSL_CERT_FILE=C:\Users\...\site-packages\certifi\cacert.pem (Windows)

3-2. 프록시 환경 설정

회사 프록시를 경유하는 경우, pip 설치 시 프록시 설정을 명시하거나 네트워크 관리자에게 프록시 인증서를 요청합니다.

pip install requests --proxy=http://proxy.company.com:8080

3-3. 임시 우회 (개발 환경 전용, 보안 주의)

개발 단계에서 빠른 확인이 필요한 경우에만 제한적으로 사용합니다. 운영 환경에서는 절대 사용 금지입니다.

# requests에서 인증서 검증 비활성화
import requests
response = requests.get('https://example.com', verify=False)

# 전역 SSL 컨텍스트 우회 (권장하지 않음)
import ssl
ssl._create_default_https_context = ssl._create_unverified_context

# pip 설치 시 임시 우회
pip install package_name --trusted-host pypi.org --trusted-host files.pythonhosted.org

verify=False를 사용하면 중간자 공격(MITM)에 노출될 수 있으며, 민감한 데이터 전송 시 치명적인 보안 위험이 됩니다.

4. 서버 측 점검 (가능한 경우)

클라이언트 측 조치로도 해결되지 않는다면, 서버 관리자와 협력하여 다음 사항을 점검합니다.

  • 인증서 만료 여부: openssl s_client -connect example.com:443 -servername example.com로 확인
  • 중간 인증서 체인 누락: SSL Labs 등의 도구로 체인 완전성 검증
  • TLS 버전 호환성: 오래된 TLS 1.0/1.1 사용 여부 확인, 최소 TLS 1.2 이상 권장

5. 요약 및 실행 체크리스트

CERTIFICATE_VERIFY_FAILED 오류는 대부분 클라이언트 환경의 인증서 번들 문제에서 발생합니다. 다음 순서로 점검하면 90% 이상 해결됩니다.

  1. 시스템 시간 동기화 확인 및 수정
  2. pip install --upgrade certifi 실행
  3. OS별 CA 인증서 재설치 (macOS의 경우 Install Certificates.command 필수)
  4. pip 및 requests 업그레이드
  5. 내부망 사용 시 조직 CA 루트 인증서 등록 또는 SSL_CERT_FILE 환경변수 설정
  6. 프록시 설정 점검 및 네트워크 팀 협의
  7. 서버 인증서 만료 및 체인 완전성 검증

Action Item: 지금 당장 터미널을 열어 pip install --upgrade certifi를 실행하고, Python 인터프리터에서 import certifi; print(certifi.where())로 인증서 경로가 정상적으로 출력되는지 확인하십시오. 이것만으로도 대부분의 인증서 오류는 해결됩니다.


#함께 읽으면 좋은 글

Selenium SessionNotCreatedException 해결 완벽 가이드 ChromeDriver 버전 불일치 오류 종결 : 바로보기


댓글