当前位置: 首页 > 面试题库 >

在Twisted中将HTTP代理转换为HTTPS代理

黎玺
2023-03-14
问题内容

最近,我一直在扭曲使用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网站,则需要使用CONNECTHTTP动词(因为这是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”状态行,就好像它已直接建立到目标服务器的连接一样。



 类似资料:
  • 我用的是k8s和istio。而且,我有带有httpsendpoint的外部api(相互tls) 我不希望k8s pod的每个api请求都实现相互tls调用,所以如果istio特使代理可以处理相互tls,那就太好了。pod可以通过http调用api,特使将请求转换为https mtls请求。 我设法找到了与特使共同解决tls的办法。如何将自定义客户端证书用于istio的外部服务? 现在我应该找到如何

  • 我编写了一个SOCKS代理,如果关闭链接,它可以同时处理HTTP和HTTPS流量。 如果链接已打开并且转发主机和端口属于过滤HTTP代理,则只有HTTP流量可以流动。HTTPS流量不流动并报告SSL错误。 请注意,当请求直接来自浏览器而不是SOCKS服务器时,HTTP代理会处理HTTPS流量。 例如,如果我向https://www.google.com出现以下情况: 1)客户端发送SOCKS 5问

  • 我有一个用Spring Boot(2.0.5)编写的服务器。它位于提供SSL的代理服务器后面。代理同时接受HTTP(80)和HTTPS(443),并将两者转发到我的服务器,该服务器只接受端口2222上的HTTP。代理设置以下请求标头。 null 我在类中测试了以下代码,但它没有工作。 我还编写了以下代码将HTTP重定向到HTTPS。但它也会重定向HTTPS流量。但我只需要重定向HTTP。 我正在寻

  • 问题内容: 简而言之 :如何在Mac OS X上为Docker设置HTTP / HTTPS代理? 详细说明 : 我在代理后面的Mac OS X上运行Docker(1.12)。我按照安装说明进行操作,并安装了boot2docker。如果我从网络内部Docker注册表中提取信息,则此方法工作正常。 但是,从docker.io拉出时出现以下错误: 注1 :,并在环境中可用(运行显示全部三个)。 注2 :

  • JVM 允许代理属性 http.代理主机和 http.代理端口用于指定 HTTP 代理服务器,以及 https.proxyHost 和 https.proxyPort 用于指定 HTTPS 代理服务器。 我想知道与HTTP代理服务器相比,使用HTTPS代理服务器是否有任何优势? 通过HTTPS代理访问https url是否比从HTTP代理访问它更麻烦?

  • 问题内容: 我正在使用Spring来为专门用于使用Hibernate的DAO类的依赖关系进行接线,但是却遇到了一个让我感到困惑的异常: $ Proxy58无法转换为UserDao 我的DAO的配置如下: 我有一个接口,抽象基类和最终实现,如下所示。 接口: 抽象基类: 实现方式: 以下引发上述异常: UserDao dao =(UserDao)context.getBean(“ userDao”)