【问题标题】:How to encrypt http request in Python Sockets如何在 Python 套接字中加密 http 请求
【发布时间】:2018-09-03 16:11:15
【问题描述】:
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'

普通的 HTTP 请求被发送到 HTTPS 端口

Browsec Uncompatible Addon 这是带有此插件的旧版本插件,我可以在整个系统中使用它,代理为 localhost:49736

【问题讨论】:

标签: python sockets ssl


【解决方案1】:

我并不完全清楚您的代码的意图是什么,因为您只是转储了一些代码而没有记录其功能。但是我试图从这种类型中提取您可能正在尝试做的事情以及您的问题在哪里。鉴于代码,我可以看到您正在执行以下操作:

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

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

【讨论】:

  • @SmartManoj:我不知道你想用这个评论问什么。我特别不知道你对 P2 或 P4 的意思。并且 CONNECT 方法在请求中没有协议,见Wikipedia。而且我不知道你的意思是什么工具可以用来实现这一点 - 我仍然不知道你想要什么,因为你还没有记录你真正想要做什么。
  • 我正在尝试连接到 Browsec(Legacy Extension) 代理
  • @SmartManoj:我不知道这个代理的作用以及连接它的要求。
  • 我尝试模仿python中的扩展
猜你喜欢
  • 1970-01-01
  • 2014-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-17
  • 2022-01-26
  • 1970-01-01
相关资源
最近更新 更多