복붙노트

[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. ==============================

    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. ==============================

    2.트위스트에 대해 잘 모르겠지만 HTTPS 프록시를 구현하면 웹 브라우저는 서버의 SSL 인증서가 URL (주소 표시 줄)의 도메인 이름과 일치 할 것으로 기대합니다. 그렇지 않으면 웹 브라우저가 보안 경고를 발행합니다.

    트위스트에 대해 잘 모르겠지만 HTTPS 프록시를 구현하면 웹 브라우저는 서버의 SSL 인증서가 URL (주소 표시 줄)의 도메인 이름과 일치 할 것으로 기대합니다. 그렇지 않으면 웹 브라우저가 보안 경고를 발행합니다.

    즉석에서 인증서를 생성하는 것과 같은 방법이 있지만 브라우저에서 신뢰할 수있는 루트 인증서가 필요합니다.

  3. from https://stackoverflow.com/questions/3118602/convert-http-proxy-to-https-proxy-in-twisted by cc-by-sa and MIT license