빠른 답변
프록시에서 SSL: WRONG_VERSION_NUMBER는 무엇을 의미하나요?
[SSL: WRONG_VERSION_NUMBER] 오류는 거의 항상 클라이언트가 평문으로 응답하는 곳과 TLS 핸드셰이크를 시도했을 때 발생합니다. 일반적으로 https:// 프록시 URL이 평문 HTTP 프록시 포트를 가리킬 때 나타납니다. CrawlRelay에서는 HTTP와 HTTPS 대상 모두 게이트웨이 주소 앞에 http://를 씁니다; 사이트 자체의 HTTPS는 터널을 통해 여전히 작동합니다.
SSL: WRONG_VERSION_NUMBER 한눈에 보기
| 오류 | SSL: WRONG_VERSION_NUMBER |
|---|---|
| 유형 | 클라이언트에서 TLS 오류 |
| 전송 주체 | 상대편이 TLS를 사용하지 않을 때 TLS 라이브러리 오류 |
| 정의 위치 | TLS 1.3: RFC 8446; HTTP proxy CONNECT: RFC 9110, section 9.3.6 |
| 다시 시도할까요? | 아니요. 구성 오류입니다 |
| 먼저 확인하세요 | 프록시 URL 앞 스킴을 확인하세요 |
SSL: WRONG_VERSION_NUMBER가 무엇을 의미하나요?
TLS는 핸드셰이크 레코드로 시작합니다. 응답이 HTTP라면 TLS 라이브러리는 이상한 버전 번호를 읽고 중단하며, Python은 WRONG_VERSION_NUMBER 오류를 발생합니다; OpenSSL 버전과 클라이언트에 따라 다릅니다.
프록시 URL 스킴이 클라이언트와 프록시 간 통신 방식을 결정합니다. http://는 프록시에 일반 HTTP로 접속하여 CONNECT 터널 후 사이트와 TLS를 진행합니다. https://는 프록시 자체와 TLS로 연결하는 방식이며, 프록시 포트가 이를 지원해야 합니다.
Python, curl, Node.js, 브라우저에서 SSL: WRONG_VERSION_NUMBER는 어떻게 나타나나요?
같은 실패가 도구마다 다르게 출력됩니다. 로그에서 검색할 메시지들:
- Python requests / urllib3 2.x:
SSLError(SSLError(1, '[SSL: WRONG_VERSION_NUMBER] wrong version number'))가ProxyError로 감싸짐 - httpx:
httpx.ConnectError: [SSL: WRONG_VERSION_NUMBER] wrong version number - curl: 일반 프록시에
-x https://를 쓸 때curl: (35) ... wrong version number - Node.js: 오류 메시지 내
EPROTO ... wrong version number
SSL: WRONG_VERSION_NUMBER의 원인은 무엇인가요?
가장 가능성 높은 첫 번째 원인:
- 프록시 주소 앞에
https://가 있는 경우(평문 HTTP 포트). 가장 흔한 사례입니다. - TLS를 요구하는 프록시 포트 제공자의 설정 복사 붙여넣기
- 포트 80에서
https://사용하거나 TLS 요구하는 사이트 포트에http://사용, 프록시가 아닌 경우 - 코드가 상속받은 환경 변수
HTTPS_PROXY=https://...
SSL: WRONG_VERSION_NUMBER를 단계별로 진단하는 방법은?
- 코드가 사용하는 프록시 URL과 스킴 확인
- 환경 변수
HTTPS_PROXY,ALL_PROXY점검 - 아래 curl 테스트에서
-x http://로 정상 동작 확인 - curl은 작동하는데 코드가 안 된다면 코드나 환경에
https://가 남아 있음
# 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_URLSSL: WRONG_VERSION_NUMBER를 어떻게 고치나요?
- 프록시 URL에
http://사용: 모든 키에{"http": "http://...", "https": "http://..."} - TLS 검증은 켠 상태 유지: 문제는 스킴이며
verify=False가 아님 - 환경 변수 수정: 스크립트 내에서 덮어쓰기보다 환경 변수 정리가 필요
SSL: WRONG_VERSION_NUMBER 이후에 다시 시도해야 하나요?
이 오류는 재시도하지 마세요: 시도 때마다 동일한 실패입니다. 한 글자만 수정하면 해결되는 구성 오류입니다.
SSL: WRONG_VERSION_NUMBER가 CrawlRelay에 어떻게 적용되나요?
CrawlRelay의 HTTP 포트는 HTTPS 사이트를 CONNECT 터널로 전달하는 평문 HTTP 프록시 포트입니다. TLS는 터널 내부에서 클라이언트와 사이트 간 종단 간 암호화로 이루어지므로 게이트웨이에는 https:// 프록시 URL이 필요 없습니다.
게이트웨이: 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 인증서 검증 실패 · 프록시 연결 불가](/docs/errors/cannot-connect-to-proxy/) · Python 가이드](/docs/python/).
SSL: WRONG_VERSION_NUMBER: 개발자들이 묻는 질문들
http:// 프록시 URL을 사용하면 내 트래픽이 암호화되지 않나요?
HTTPS 사이트에는 아닙니다. http:// 스킴은 프록시와의 짧은 CONNECT 교환에만 적용되며 여기에는 프록시 인증 정보가 포함됩니다. 이후 클라이언트는 터널 내부에서 사이트와 직접 TLS를 수행하고, 프록시는 암호화된 바이트만 전달합니다. 평문 http:// 사이트는 프록시 유무와 관계없이 암호화되지 않습니다.
urllib3 업그레이드 후 갑자기 이런 문제가 발생한 이유는?
urllib3 2.x는 HTTPS 프록시를 지원해, https:// 프록시 URL을 문자 그대로 받아 프록시와 TLS 세션을 초기화합니다. 이전 버전에서는 잘못된 스킴에도 운 좋게 동작하는 경우가 있었습니다. 평문 HTTP 프록시 포트에는 http://을 쓰면 오류가 사라집니다.
오류를 없애기 위해 verify=False로 설정해도 되나요?
아니요. 인증서 검사를 끈다고 스킴 오류가 고쳐지지 않으며, 요청마다 중간자 공격에 노출됩니다. 프록시 URL 스킴을 수정하고, 운영 환경에서는 검증을 유지하세요.
이 참조에서 다른 프록시 오류들
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개, 트래픽이 절대 만료되지 않음.