0

BaseHTTPServerに基づくPythonでプロキシサーバーを作成しています。これは、squidプロキシへの接続を作成し、ブラウザー要求(GET、CONNECT、POSTなど)を識別し、それにproxy-authorizationヘッダーを追加してから、この要求をsquidプロキシに転送します。

問題は、私が理解しているように、接続要求を送信するときに、対応するすべてのトラフィックをsquidプロキシに中継する必要があることです。しかし、wiresharkで確認できるように、squidプロキシはハンドシェイクの「ClientHello」部分に応答しません。これは、squidプロキシが転送しているSSLのバイナリデータを理解していないためだと思います。

この場合、HTTPSリクエストを処理するにはどうすればよいですか?

コードは多かれ少なかれTinyHTTPProxyに似ています:http ://www.oki-osk.jp/esc/python/proxy/

4

1 に答える 1

1

RFC 2817CONNECTでメソッドが定義されています。受信側プロキシ (Python プロキシ) が宛先ホスト ( RFC ではオーソリティと呼ばれる) への生の TCPトンネルを直接確立するように指示されるという点で、他の HTTP メソッドとは異なります。

プロキシは、そのトンネルを介して送信されるデータについて何の仮定もできません。必ずしも HTTP であるとは限りません。クライアントはトンネルを使用して、好きなプロトコルを話すことができます。確かに、SSL ≠ HTTP です。

次の 2 つのオプションがあります。

  • 要求された宛先ホストへの TCP 接続を直接開きます。
  • CONNECTアップストリーム プロキシ (Squid) にリクエストを送信します。これは仕様内です:

    プロキシ自体が、別のプロキシを介してのみ要求されたオリジン サーバーに到達できる場合があります。この場合、最初のプロキシCONNECTは、その次のプロキシの要求を行い、機関へのトンネルを要求する必要があります。プロキシは、オーソリティへの直接接続またはトンネル接続が確立されていない限り、2xx ステータス コードで応答してはなりません (MUST NOT)。

    Host要求に必要なヘッダーが含まれていることを確認してください。

    CONNECT www.google.com:443 HTTP/1.1
    Host: www.google.com:443
    Proxy-Authorization: ...
    ​
    
于 2013-03-03T21:41:46.930 に答える