簡體   English   中英

如何在Python套接字中加密HTTP請求

[英]How to encrypt http request in Python Sockets

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不兼容的插件這是帶有該插件的插件的較舊版本,我可以在整個系統中使用它,並將代理作為localhost:49736

對於我來說,尚不清楚您的代碼的意圖是什么,因為您僅轉儲了一些代碼而未記錄其功能。 但是我已經嘗試從這種類型中提取您可能正在嘗試做的事情以及問題所在。 給定代碼,我可以看到您正在執行以下操作:

  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包裝。 除此之外,您不應在HTTP(非代理)請求中放置https:// URL作為路徑,而應僅放置服務器上的路徑。

暫無
暫無

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

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