urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate signature failure (_ssl.c:1002)
파이썬에서 HTTPS 요청을 보낼 때 SSL 인증서 검증에 실패했음 을 의미한다.
회사 네트워크 등 제한된 상황에서는 보안 정책에 따라 특정 루트 인증서가 설치되지 않았거나, 내부적으로 사용하는 프록시 서버가 SSL 트래픽을 모니터링하면서 인증서 검증에 영향을 줄 수 있다.
인증서가 만료되었거나 유효하지 않음: 서버의 SSL 인증서가 만료되었거나 신뢰할 수 없는 인증 기관에서 발급된 경우
인증서 검증 비활성화: 임시로 SSL 인증서 검증을 비활성화 (단, 보안 취약)
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
루트 인증서 누락: 파이썬 환경에 필요한 루트 인증서가 설치되지 않았거나 업데이트되지 않은 경우
certifi 라이브러리 사용: 최신 루트 인증서를 사용
pip install certifi
import ssl
import certifi
# certifi 라이브러리에서 제공하는 최신 루트 인증서를 사용하여 기본 ssl 컨텍스트 생성
ssl_context = ssl.create_default_context(cafile=certifi.where())
ssl.create_default_context()
: 기본적으로 SSL 컨텍스트를 생성한다. SSL 컨텍스트는 SSL/TLS 설정을 포함하는 객체로, HTTPS 요청 시 사용할 인증서와 키, 프로토콜 등을 설정할 수 있다.
cafile=cerifi.where()
: cafile
매개변수는 SSL 컨텍스트가 신뢰할 수 있는 인증서 파일의 경로를 지정한다. certifi.where()
은 certifi
라이브러리가 제공하는 최신 루트 인증서 번들을 포함하는 파일의 경로를 반환한다. 이를 통해 최신 루트 인증서를 사용하여 SSL 인증서 검증을 수행할 수 있다.
루트 인증서 업데이트: 운영 체제에 따라 루트 인증서를 업데이트
예를 들어, 네이버 API를 사용하는 경우 네이버 서버의 SSL 인증서를 신뢰할 수 있도록 우리 컴퓨터에 적절한 루트 인증서가 설치되어 있어야 한다.
네이버 서버에서 사용하는 SSL 인증서는 DigiCert Global Root G2 인증서에 의해 서명된 경우가 많다. 따라서, 이 루트 인증서를 설치해야 한다.