簡體   English   中英

在Twisted中將HTTP代理轉換為HTTPS代理

[英]Convert HTTP Proxy to HTTPS Proxy in Twisted

最近我一直在使用扭曲的HTTP代理。 經過多次反復試驗后,我想我終於有了一些工作。 我想知道的是,如果有可能,我是否可以擴展此代理以便能夠處理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? 如果沒有,我該如何實施這樣的事情呢?

如果要通過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握手)。 客戶端將其擁有的現有套接字升級到代理以使用TLS / SSL(通過啟動SSL / TLS握手)。 一旦客戶端讀取了'200'狀態行,就客戶端而言,就好像它已直接連接到目標服務器。

我不確定是否會扭曲,但我想提醒您,如果您實施HTTPS代理,Web瀏覽器將期望服務器的SSL證書與URL(地址欄)中的域名匹配。 否則,Web瀏覽器將發出安全警告。

有很多方法可以解決這個問題,例如動態生成證書,但是您需要在瀏覽器上信任根證書。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM