HTTPS-туннелирование прокси-сервера с помощью модуля ssl

I ' Я хотел бы вручную (с помощью модулей сокета и ssl ) выполнить запрос HTTPS через прокси, который сам использует HTTPS .

] Я могу без проблем выполнить начальный обмен CONNECT :

import ssl, socket

PROXY_ADDR = ("proxy-addr", 443)
CONNECT = "CONNECT example.com:443 HTTP/1.1\r\n\r\n"

sock = socket.create_connection(PROXY_ADDR)
sock = ssl.wrap_socket(sock)
sock.sendall(CONNECT)
s = ""
while s[-4:] != "\r\n\r\n":
    s += sock.recv(1)
print repr(s)

Приведенный выше код печатает HTTP / 1.1 200 Соединение установлено плюс некоторые заголовки, что я и ожидал. Итак, теперь я должен быть готов сделать запрос, например

sock.sendall("GET / HTTP/1.1\r\n\r\n")

, но приведенный выше код возвращает



400 Bad Request

Bad Request

Your browser sent a request that this server could not understand.
Reason: You're speaking plain HTTP to an SSL-enabled server port.
Instead use the HTTPS scheme to access this URL, please.

Это тоже имеет смысл, поскольку мне все еще нужно выполнить рукопожатие SSL с сервером example.com , чтобы который я прохожу. Однако, если вместо немедленной отправки запроса GET я скажу

sock = ssl.wrap_socket(sock)

, чтобы выполнить рукопожатие с удаленным сервером, то я получу исключение:

Traceback (most recent call last):
  File "so_test.py", line 18, in 
    ssl.wrap_socket(sock)
  File "/usr/lib/python2.6/ssl.py", line 350, in wrap_socket
    suppress_ragged_eofs=suppress_ragged_eofs)
  File "/usr/lib/python2.6/ssl.py", line 118, in __init__
    self.do_handshake()
  File "/usr/lib/python2.6/ssl.py", line 293, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [Errno 1] _ssl.c:480: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol

Итак, как я могу выполнить рукопожатие SSL с удаленным пример. com сервер?

РЕДАКТИРОВАТЬ: Я почти уверен, что до моего второго вызова wrap_socket дополнительных данных не будет, потому что вызов sock.recv (1) блокируется на неопределенный срок .

9
задан Eli Courtwright 8 December 2010 в 23:23
поделиться