Watch at Ease세상을 읽고, 일상의 답을 찾다.

기술 · 실용 가이드

Python SSL WRONG_VERSION_NUMBER? 프록시 스킴과 TLS 종단을 증명하세요

대상·프록시 스킴, 상속 설정, CONNECT 경로와 첫 응답 지점을 기록한 뒤 인증서나 TLS 버전을 바꾸세요.

대상과 프록시 스킴의 네 경로를 보여 주는 원본 일러스트.
원본 일러스트: TLS가 처음 시작되는 종단을 증명합니다. Watch at Ease

WRONG_VERSION_NUMBER는 TLS 경계로 예상한 곳의 바이트가 해당 연결의 유효한 TLS 레코드가 아니었다는 뜻일 수 있습니다. 평문 HTTP 프록시나 포트에 TLS를 보내는 경우가 흔하지만 유일한 원인은 아닙니다.

대상 URL, 적용된 프록시, 환경과 OS 검색, CONNECT와 첫 응답 지점을 보존하세요. verify=False로 경로 오류를 인증서 문제처럼 만들지 마세요.

실패 요청과 모든 프록시 원천 고정하기

Python, Requests, urllib3, OpenSSL 버전과 URL, 포트, 전체 예외를 기록합니다. PreparedRequest, 요청·Session 설정, 환경과 OS 프록시를 보존합니다.

아직 신뢰나 TLS 버전을 바꾸지 마세요. 민감하지 않은 대상으로 깨끗한 환경과 의도한 프록시를 비교합니다.

대상과 프록시 스킴을 따로 매핑하기

HTTP 프록시는 CONNECT로 HTTPS 대상을 운반합니다. HTTPS 프록시는 클라이언트가 먼저 프록시와 TLS를 만듭니다.

따라서 HTTPS_PROXY=http://proxy:port가 맞을 수 있습니다. 변수명이 아니라 실제 프록시 포트의 프로토콜이 URL 스킴을 결정합니다.

TLS를 처음 받는 종단 증명하기

적용된 설정에서 프록시 호스트와 포트를 구하고 CONNECT 및 첫 응답이 평문 HTTP, 인증 요구, TLS 중 무엇인지 기록합니다. 로그에서 자격 증명을 제거합니다.

허용되면 대상 포트도 직접 시험합니다. https://가 평문 HTTP 포트를 가리키면 같은 오류가 나며 LB나 중간 장비도 경계를 바꿀 수 있습니다.

인증서와 프로토콜 오류를 분리하기

CERTIFICATE_VERIFY_FAILED는 TLS 이후 인증 문제이며 verify=False는 평문 종단을 TLS로 바꾸지 않습니다. WRONG_VERSION_NUMBER는 더 앞 단계입니다.

UNSUPPORTED_PROTOCOL은 별도 분기입니다. 종단이 TLS를 말한다는 증거 후에만 SSLContext와 지원 버전을 비교합니다.

한 설정 원천만 고치고 종료 조건 증명하기

잘못된 경로를 공급한 요청, Session, 환경, OS 또는 배포 설정만 고칩니다. HTTP 프록시는 HTTPS 대상에도 http:// URL을 씁니다.

검증을 켠 채 프록시, CONNECT, 대상 인증서와 응답을 확인합니다. 실제 서비스도 다시 시작해 임시 셸에서만 성공한 것이 아님을 증명합니다.

요청, 프록시 원천, 네트워크 경계와 종료 증명의 원본 일러스트.
원본 일러스트: 인증서나 TLS 정책을 바꾸기 전에 경로를 고정합니다. Watch at Ease