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)
блокируется на неопределенный срок .