HTTPS-proxy-tunneling mit dem ssl-Modul

Möchte ich manuell (über die Buchse und ssl Module) eine HTTPS Anfrage über einen proxy, welcher selbst verwendet HTTPS.

Ich kann die ersten CONNECT exchange gut:

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)

Der obige code druckt HTTP/1.1 200 Connection established plus einige Header, die ist, was ich erwarte. So, jetzt sollte ich bereit sein, die Anfrage zu machen, z.B.

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

aber der obige code gibt

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
Reason: You're speaking plain HTTP to an SSL-enabled server port.<br />
Instead use the HTTPS scheme to access this URL, please.<br />
</body></html>

Dies macht Sinn, auch, da ich noch tun müssen, um einen SSL-handshake mit dem example.com server auf den ich bin tunneling. Jedoch, wenn anstatt sofort senden die GET Anfrage ich sagen

sock = ssl.wrap_socket(sock)

zu tun, den Handschlag mit dem remote-server, dann bekomme ich eine exception:

Traceback (most recent call last):
  File "so_test.py", line 18, in <module>
    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

So, wie kann ich den SSL-handshake mit dem remote - example.com server?

EDIT: ich bin mir ziemlich sicher, dass keine weiteren Daten verfügbar sind, bevor meine zweite Aufruf wrap_socket da ruft sock.recv(1) Blöcke auf unbestimmte Zeit.

  • meine grobe Vermutung ist, dass ssl.wrap_socket kümmert sich um socket-Verbindung Stand. in der Regel würden Sie socket erzeugen, dann wickeln Sie es, dann verbinden. Hier legen Sie die Buchse, verbinden, dann wickeln. vielleicht ssl ist nur verwirrt von bereits verbundenen zugrunde liegenden socket-Zustand. github.com/kennethreitz/requests/blob/...
  • hey, haben Sie noch Glück? Ich komme bei dem gleichen problem, aber auch nichts gefunden...
Schreibe einen Kommentar