빠른 답변
프록시에서 SSL: CERTIFICATE_VERIFY_FAILED는 무엇을 의미하나요?
CERTIFICATE_VERIFY_FAILED는 클라이언트가 웹사이트의 TLS 인증서를 검증할 수 없음을 의미합니다. CrawlRelay 게이트웨이 같은 CONNECT 프록시를 통할 경우 TLS는 종단 간으로 실행되어 프록시는 원인이 아닙니다. 클라이언트 쪽을 확인하세요: 오래된 CA 번들, HTTPS를 검사하는 안티바이러스 또는 사무실 방화벽, 잘못된 시스템 시계가 보통 원인입니다. 절대 verify=False로 프로덕션에서 문제를 해결하지 마세요.
SSL: CERTIFICATE_VERIFY_FAILED 한눈에 보기
| 오류 | SSL: CERTIFICATE_VERIFY_FAILED |
|---|---|
| 유형 | 클라이언트 TLS 인증서 오류 |
| 전송 주체 | 웹사이트의 인증서를 검증할 수 없을 때 사용하는 TLS 라이브러리 |
| 정의 위치 | X.509 path validation: RFC 5280; TLS 1.3: RFC 8446 |
| 다시 시도할까요? | 아니요. 신뢰 저장소나 네트워크를 수정하세요 |
| 먼저 확인하세요 | 같은 기기에서 프록시 없이 동일한 URL을 테스트하세요 |
SSL: CERTIFICATE_VERIFY_FAILED가 무엇을 의미하나요?
TLS 핸드셰이크 중 웹사이트가 인증서 체인을 보냅니다. 클라이언트는 이를 신뢰 저장소에 있는 권한 목록과 이름, 유효 기간 등과 대조해 확인합니다. 어느 하나라도 실패하면 중단됩니다.
CONNECT 터널을 통해 프록시는 핸드셰이크를 수정 없이 전달하므로 본인이 보는 인증서는 웹사이트가 직접 보내는 것입니다. 자신의 인증서를 삽입하는 검사 소프트웨어나 시스템의 오래된 신뢰 저장소가 보통 원인입니다.
Python, curl, Node.js, 브라우저에서 CERTIFICATE_VERIFY_FAILED는 어떻게 나타나나요?
같은 실패가 도구마다 다르게 출력됩니다. 로그에서 검색할 메시지들:
- Python:
[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate - Node.js:
UNABLE_TO_GET_ISSUER_CERT_LOCALLY또는SELF_SIGNED_CERT_IN_CHAIN - curl:
curl: (60) SSL certificate problem: unable to get local issuer certificate - 브라우저:
NET::ERR_CERT_AUTHORITY_INVALID
CERTIFICATE_VERIFY_FAILED의 원인은 무엇인가요?
가장 가능성 높은 첫 번째 원인:
- 오래된 CA 번들 예를 들어 Python의 오래된
certifi패키지 - 안티바이러스, 기업용 방화벽 또는 디버깅 프록시의 HTTPS 검사로 자체 인증서를 제시하는 경우
- 유효한 인증서를 만료되었거나 아직 유효하지 않은 것으로 만드는 잘못된 시스템 시계
- 중간 인증서가 누락된 깨진 인증서 체인
- 시스템 CA 인증서 패키지가 없는 컨테이너 이미지
CERTIFICATE_VERIFY_FAILED를 단계별로 진단하는 방법은?
- 프록시 없이 같은 요청을 실행해 보세요. 실패하면 프록시 원인이 아닙니다.
openssl s_client또는 curl-v로 인증서 발급자를 출력하세요. 안티바이러스나 방화벽 이름이 보이면 가로채기입니다.- 시스템 날짜와 시간을 확인하세요.
- CA 번들을 업데이트하고 다시 테스트하세요.
# Use the URL that fails; with https://api.ipify.org instead, you test the gateway alone.
# "HTTP/1.1 200 Connection established" first, then the site's own status: the site answered.
curl -v -x http://USERNAME:[email protected]:7777 https://TARGET_URL
# Same test through the SOCKS5 port, with DNS resolved at the exit
curl -v --socks5-hostname gw.crawlrelay.com:7778 --proxy-user USERNAME:PASSWORD https://TARGET_URLCERTIFICATE_VERIFY_FAILED를 어떻게 고치나요?
certifi(pip install -U certifi)이나 시스템 CA 패키지를 업데이트하세요.- 네트워크가 HTTPS 검사를 한다면 기업용 검사 인증서를 신뢰 저장소에 추가하거나 검사를 하지 않는 네트워크에서 스크래퍼를 실행하세요.
- 네트워크 시간 동기화로 시계를 수정하세요.
- 슬림 컨테이너 이미지에는 CA 인증서를 설치하세요. 예:
ca-certificates패키지. - 신뢰하거나 데이터 수집에 매우 중요한 코드에서는 검증을 비활성화하지 마세요.
CERTIFICATE_VERIFY_FAILED 이후에 다시 시도해야 하나요?
재시도하지 마세요: 같은 신뢰 저장소에서 같은 실패가 반복됩니다. 신뢰 저장소, 시스템 시계, 네트워크 경로 문제를 해결한 뒤 다시 실행하세요.
SSL: CERTIFICATE_VERIFY_FAILED가 CrawlRelay에 어떻게 적용되나요?
CrawlRelay의 HTTP 포트는 CONNECT와 함께 HTTPS를 터널링하므로 클라이언트가 검증하는 인증서는 웹사이트가 보내는 인증서입니다. 오류가 게이트웨이를 통해서만 발생하고 게이트웨이를 통하지 않으면 발생하지 않으면, 대상 호스트 이름과 전체 오류 메시지를 포함해 지원팀에 문의해 주세요.
게이트웨이: gw.crawlrelay.com, 포트 7777 (CONNECT를 통한 HTTP, HTTPS) 및 포트 7778 (SOCKS5). 사용자 이름 형식: USERNAME-country-{cc}-state-{state}-city-{city}-zip-{zip}-asn-{asn}-session-{id}-ttl-{minutes}. 관련: SSL: WRONG_VERSION_NUMBER · Connection reset · Python 안내.
SSL: CERTIFICATE_VERIFY_FAILED: 개발자들이 묻는 질문들
프록시가 SSL 인증서 오류를 유발할 수 있나요?
가로채기 프록시는 자체 인증서를 제시하기 때문에 오류를 유발할 수 있습니다. CONNECT 터널 프록시는 암호화된 바이트만 전달하고 핸드셰이크 내용은 보지 않기 때문에 오류를 유발하지 않습니다. 프록시 없이 동일 요청을 실행했고 오류가 계속되면 클라이언트 기기나 네트워크 쪽 문제입니다.
스크래핑 시 verify=False가 안전한가요?
수정 수단으로는 적합하지 않습니다. 가로채기나 인증서 체인 이상을 숨기게 되어 공격자가 경로에서 트래픽, 토큰이나 쿠키를 읽거나 변경할 수 있습니다. 빠른 로컬 테스트 용도로만 사용하고 자동화 작업이나 인증 정보 전송용에서는 절대 사용하지 마세요.
왜 Docker에서는 실패하는데 노트북에서는 되나요?
슬림 컨테이너 이미지는 CA 인증서가 같이 포함되지 않아 인증서 검증이 불가능할 수 있습니다. 이미지에 시스템 CA 패키지를 설치하거나 Python에서 certifi 번들을 사용하세요. 컨테이너 시계도 정확한지 꼭 확인하세요.
이 참조에서 다른 프록시 오류들
HTTP 상태 코드
- 401 Unauthorized vs 407
- 403 Forbidden
- 407 Proxy Authentication Required
- 429 Too Many Requests
- 502 Bad Gateway
- 503 Service Unavailable
- 504 Gateway Timeout
브라우저 및 클라이언트 오류
연결 및 TLS 오류
실패 사례를 다루는 문서가 있는 레지덴셜 프록시들
US$0.50/GB의 레지덴셜 프록시 CrawlRelay개, 트래픽이 절대 만료되지 않음.