[PYTHON] 뒤틀린 상태에서 HTTP 프록시를 HTTPS 프록시로 변환
PYTHON뒤틀린 상태에서 HTTP 프록시를 HTTPS 프록시로 변환
최근에 저는 HTTP Proxy를 꼬아 서 놀았습니다. 많은 시행 착오 끝에 마침내 나는 뭔가 효과가 있다고 생각합니다. 내가 알고 싶은 것은 그것이 가능하다면 HTTPS 페이지를 처리 할 수 있도록이 프록시를 확장하는 방법입니까? 여기 내가 지금까지 가지고있는 것이있다.
from twisted.internet import reactor
from twisted.web import http
from twisted.web.proxy import Proxy, ProxyRequest, ProxyClientFactory, ProxyClient
class HTTPProxyClient(ProxyClient):
def handleHeader(self, key, value):
print "%s : %s" % (key, value)
ProxyClient.handleHeader(self, key, value)
def handleResponsePart(self, buffer):
print buffer
ProxyClient.handleResponsePart(self, buffer)
class HTTPProxyFactory(ProxyClientFactory):
protocol = HTTPProxyClient
class HTTPProxyRequest(ProxyRequest):
protocols = {'http' : HTTPProxyFactory}
def process(self):
print self.method
for k,v in self.requestHeaders.getAllRawHeaders():
print "%s : %s" % (k,v)
print "\n \n"
ProxyRequest.process(self)
class HTTPProxy(Proxy):
requestFactory = HTTPProxyRequest
factory = http.HTTPFactory()
factory.protocol = HTTPProxy
reactor.listenSSL(8001, factory)
reactor.run()
이 코드가 보여 주듯이 예를 들어 지금은 연결을 통해 진행되는 모든 것을 인쇄하고 있습니다. 동일한 클래스로 HTTPS를 처리 할 수 있습니까? 그렇지 않다면 그런 일을 어떻게 수행해야합니까?
해결법
-
==============================
1.HTTP 프록시를 통해 HTTPS 웹 사이트에 연결하려면 CONNECT HTTP 동사를 사용해야합니다 (HTTPS에서 프록시가 작동하는 방식이기 때문에). 이 경우 프록시 서버는 대상 서버에 연결하고 서버에서 보낸 모든 내용을 클라이언트의 소켓으로 중계합니다 (반대의 경우도 마찬가지 임). 이 경우에는 캐싱이 필요하지 않습니다 (그러나 연결중인 호스트를 기록 할 수 있습니다).
HTTP 프록시를 통해 HTTPS 웹 사이트에 연결하려면 CONNECT HTTP 동사를 사용해야합니다 (HTTPS에서 프록시가 작동하는 방식이기 때문에). 이 경우 프록시 서버는 대상 서버에 연결하고 서버에서 보낸 모든 내용을 클라이언트의 소켓으로 중계합니다 (반대의 경우도 마찬가지 임). 이 경우에는 캐싱이 필요하지 않습니다 (그러나 연결중인 호스트를 기록 할 수 있습니다).
교환은 다음과 같습니다 (클라이언트 대 프록시).
C->P: CONNECT target.host:443 HTTP/1.0 C->P: P->C: 200 OK P->C:
그런 다음 프록시는 단순히 대상 서버 (HTTP 또는 SSL / TLS 없음)에 일반 소켓을 열고 클라이언트가 시작하는 TLS 핸드 셰이크를 포함하여 초기 클라이언트와 대상 서버 사이의 모든 것을 릴레이합니다. 클라이언트는 SSL / TLS 핸드 셰이크를 시작하여 기존의 소켓을 TLS / SSL을 사용하도록 프록시로 업그레이드합니다. 클라이언트가 '200'상태 표시 줄을 읽은 후에는 클라이언트가 대상 서버에 직접 연결 한 것처럼 보입니다.
-
==============================
2.트위스트에 대해 잘 모르겠지만 HTTPS 프록시를 구현하면 웹 브라우저는 서버의 SSL 인증서가 URL (주소 표시 줄)의 도메인 이름과 일치 할 것으로 기대합니다. 그렇지 않으면 웹 브라우저가 보안 경고를 발행합니다.
트위스트에 대해 잘 모르겠지만 HTTPS 프록시를 구현하면 웹 브라우저는 서버의 SSL 인증서가 URL (주소 표시 줄)의 도메인 이름과 일치 할 것으로 기대합니다. 그렇지 않으면 웹 브라우저가 보안 경고를 발행합니다.
즉석에서 인증서를 생성하는 것과 같은 방법이 있지만 브라우저에서 신뢰할 수있는 루트 인증서가 필요합니다.
from https://stackoverflow.com/questions/3118602/convert-http-proxy-to-https-proxy-in-twisted by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] pyqt에서 로그를 표시하는 가장 좋은 방법은 무엇입니까? (0) | 2018.11.10 |
---|---|
[PYTHON] Pyodbc 오류 데이터 원본 이름을 찾을 수없고 기본 드라이버가 역설을 지정하지 않았습니다. (0) | 2018.11.10 |
[PYTHON] qt 디자이너에서 만든 ui 파일에 비디오를 삽입하는 방법은 무엇입니까? (0) | 2018.11.10 |
[PYTHON] PHP 내부에서 루비 / 파이썬 스크립트를 실행하고 매개 변수를 전달하는 방법은 무엇입니까? (0) | 2018.11.10 |
[PYTHON] pip install numpy (python 2.7)가 오류 코드 1로 실패합니다. (0) | 2018.11.10 |