0

OK、簡単な質問ですが、その前に説明が必要です。

System.Net.WebClient (または WebRequest、同じ結果) を使用して、プロキシ サーバー経由で https ページをダウンロードしようとしています。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication3
{
    static class Program
    {
        static void Main(string[] args)
        {
             var wc = new WebClient();
             wc.Proxy = new WebProxy("MyProxyAddress") { UseDefaultCredentials = true };
             wc.Headers.Add("xyz", "abc");

            try
            {
                 Console.WriteLine(wc.DownloadString("https://www.google.co.nz"));
            }
            catch (WebException wex)
            {
                if (wex.Response != null)
                    using (var reader = new StreamReader(wex.Response.GetResponseStream()))
                        Console.WriteLine(reader.ReadToEnd());
            }
        }
    }
}

この時点で Fiddler を起動すると、リクエストが次のように表示されます。Fiddler を Require Proxy Authentication に設定したことに注意してください。

CONNECT www.google.co.nz:443 HTTP/1.1
Host: www.google.co.nz
Proxy-Connection: Keep-Alive

応答は

HTTP/1.1 407 Proxy Auth Required
Connection: close

、 予想通り。アドレスを https://... から http://... に変更すると、これが表示されます。xyz ヘッダーが表示されていることに注意してください。

GET http://www.google.co.nz/ HTTP/1.1
xyz: abc
Host: www.google.co.nz
Proxy-Connection: Keep-Alive

私が通過しているプロキシがユーザーエージェントを必要とする場合を除いて、すべて問題ありません。User-Agent を含むすべてのヘッダーがリクエストから削除されるため、プロキシはリクエストを拒否します。User-Agent ヘッダーをリクエストに強制するように Fiddler を構成すると、すべて正常に機能します。

では、私のヘッダーが CONNECT リクエストに含まれていないのはなぜですか? これは MS のバグですか、それとも何か不足していますか?

4

1 に答える 1

0

Web プロキシ経由の HTTPS は次のように機能します。

  1. クライアントCONNECTはリクエストをプロキシに送信します - これが Fiddler で見られるものです。
  2. Proxy は接続に同意し、 を返し200 CONNECTED、ロジックのないデータ ポンプとして機能するようになりました
    • プロキシが認証を必要とする場合、それは を返し407 Proxy Auth Required、クライアントはCONNECT適切なプロキシ認証で同じリクエストを行います。
  3. クライアントは、やみくもにデータをポンプするプロキシを介して、実サーバーと直接通信できるようになりました。
    • 通常、クライアントは HTTPS セッション ネゴシエーションを実行し、暗号化されたセッションを介して「実際の」HTTP 要求を送信します。

私は に 100% 精通しているわけではありませんWebClientが、追加されたヘッダーは「実際の」HTTP 要求 (上記の 3) にのみ適用されると思います。インスタンスで何かできるかもしれませんがWebProxy、解決策も見つかりませんでした。

于 2012-12-12T09:38:19.033 に答える