当前位置: 首页 > 知识库问答 >
问题:

如何在Python套接字中加密http请求

公良云
2023-03-14
import socket
import ssl

host = 'postlm.com'   #browsec addon v2.0.7     
port = 443               
def pp(a):
    s = socket.socket()        
    s = ssl.wrap_socket(s)  
    s.connect((host, port))
    s.send(a)
    aaa=b''
    for i in range(2):
        aa=s.recv(10240)
        if not aa:break
        print('='*100)
        if  b'Connection established' in aa:
            a=(a.replace(b'CONNECT ',b'GET https://'))
            s.send(a)
            continue
        aaa+=aa
        break
    s.close()
    return (aaa)

if __name__ == '__main__':
    j=b'CONNECT www.wikipedia.org:443 HTTP/1.1\r\nHost: www.wikipedia.org\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Language: en-GB,en;q=0.5\r\nProxy-Authorization: Basic NWE5MTMxODE5ZjY4NjNlOWJkMDAwYjdiOkdXbHVpTm9JejMzMTRvZXNFemI3emNLTXU2aHZrc214\r\nAccept-Encoding: gzip, deflate\r\nProxy-Connection: keep-alive\r\n\r\n'

    # j=b'GET http://example.com HTTP/1.1\r\nHost: example.com\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Language: en-GB,en;q=0.5\r\nAccept-Encoding: gzip, deflate\r\nConnection: keep-alive\r\n\r\n'
    a=pp(j)
    print(a)
b'HTTP/1.1 400 Bad Request\r\nServer: nginx/1.13.6\r\nDate: Sun, 25 Mar 2018 12:20:29 GMT\r\nContent-Type: text/html\r\nContent-Length: 271\r\nConnection: close\r\n\r\n<html>\r\n<head><title>400 The plain HTTP request was sent to HTTPS port</title></head>\r\n<body bgcolor="white">\r\n<center><h1>400 Bad Request</h1></center>\r\n<center>The plain HTTP request was sent to HTTPS port</center>\r\n<hr><center>nginx/1.13.6</center>\r\n</body>\r\n</html>\r\n'

共有1个答案

都超英
2023-03-14

对于我来说,如果您的代码是什么意图并不完全清楚,因为您只是转储了一些代码,而没有记录它的功能。但我试着从这类事件中找出你可能想做什么,以及你的问题出在哪里。给定代码,我可以看到您正在执行以下操作:

  1. 使用SSL连接到PostLM.com端口443。
  2. 通过此SSL连接发送连接请求:这表明postlm.com:443必须是一个HTTP代理,可以通过HTTPS访问。这不是一个无效但仍然不寻常的设置。这个连接然后建立到www.wikipedia.org的连接。通常连接需要端口号,但您不提供端口号。在这种情况下,可能假设为443(https)。
  3. 在以某种方式读取该代理对请求的响应后,检查是否成功。这种检查是不寻常的,因为您不检查HTTP状态代码200,而是检查一些特定的字符串。但它可能适用于此代理。
  4. 然后通过此连接发送Get https:/请求。CONNECT的期望是,它只构建一个隧道,并且任何加密的流量(例如,您的https://URL)都应该在隧道内完成。这意味着在发送下一个HTTP请求之前,您需要在已经建立的加密(对代理)基础上再进行一次加密(对目标站点)。但您没有这样做,这就是为什么它(wikipedia.org)抱怨一个简单的HTTP请求被发送到HTTPS套接字的原因。

我不认为您可以用Python进行这种双ssl包装。除此之外,您不应该将https:/URL作为HTTP(非代理)请求中的路径,而应该将其作为服务器上的路径。

 类似资料:
  • 我制作了一个简单的服务器程序,可以同时从4个不同的客户端接收数据。现在我想用AES-128加密发送一些数据,但应该在服务器端解码。以下是我的服务器代码: 我从客户端发送这样的数据 我应该如何修改我的客户端代码和服务器代码,以便在其中包含AES-128加密。。请在这方面帮助我。

  • 所以我写了这个服务器脚本,它应该接收一个用户名,然后继续其他一些代码。但是我收到了这个错误: "OSError:[WinError 10057]不允许发送或接收数据的请求,因为套接字未连接,并且(当使用sendto调用在数据报套接字上发送时)未提供地址" 我的理论是服务器和客户端没有同步,所以服务器认为它没有收到消息。如何改进我的代码,以便服务器实际接收消息?(我试过尝试块) 我的代码: sock

  • 问题内容: 我正在尝试使用不带外部库的图像进行下载。这是我所拥有的,我不确定什么不起作用。 为了查看流中正在发生什么,请将该行交换为: 大概该方法在套接字输入流中不希望使用HTTP标头。但是我不确定如何删除标题。我试着用读取标题行,然后将套接字输入流传递给,但这没有用。 这是打印的字符串: 末尾的不可打印字符似乎表明标题之后是某种图像。但是如何将其转换为a 或a ?后者有一个接受输入流的构造函数,

  • 使用lib中的模块在python中解密和加密字符串。最简单的方法 现在我想解密我之前输入的字符串。。

  • 问题内容: 当我通过套接字发送正常的HTTP请求时,服务器不会以OK响应进行响应。我从Firefox复制了HTTP标头。这是代码: 但是,这是我收到的回复: 我知道我可以使用来做到这一点,但是当我手动发送HTTP请求时,服务器为什么不识别HTTP请求? 问题答案: 两件事情: 您应该使用而不是将条目打印到单独的行。 HTTP请求应以空白行(link)结尾。所以加

  • 问题内容: 我希望能够构造一个原始的HTTP请求并使用套接字发送它。显然,您希望我使用urllib和urllib2之类的东西,但我不想使用它。 它必须看起来像这样: 显然,您还必须请求页面/文件并获取和发布参数 问题答案: 您需要了解的大多数内容都在HTTP / 1.1规范中,如果您想推广自己的HTTP实现,则应该进行以下研究:http : //www.w3.org/Protocols/rfc26