.NETのHttpWebRequestを使用したSSL接続について
-
03-07-2019 - |
質問
この問題を回避することはできません。 HttpWebRequestを使用して、データを別のサイトに送信しようとしています。ファイアウォールを設定する最良の方法を見つけようとしていますが、途方に暮れています。 NetMonのトレースを見ると、あたかもそれを無視しているように見えます。リクエストから出てくるHTTPヘッダー(ブラウザからmy-serverへのリクエストではなく、my-server-to-remote-serverリクエスト)は加算されません。
Http: Request, CONNECT some.random.url:443
Command: CONNECT
URI: some.random.url:443
Location: some.random.url:443
ProtocolVersion: HTTP/1.1
Host: some.random.url
ProxyConnection: Keep-Alive
HeaderEnd: CRLF
TCP DstPortも常にHTTP(80)で始まるようです。最初に443を処理するようには思えません。 SSLが「実際の」開始前にポート80でネゴシエートしますか?送信?ブートするために、このリクエストはリクエストを開始する前に設定しようとするHttpWebRequest設定を無視しているようです:HTTP 1.0またはkeep-aliveをfalseに設定しても、上記のヘッダーで開始します。
何をしているの?どうやってそれを許可するのか知りたいのですが、なぜそのような振る舞いを示しているのか分かりませんか?
以下のコード(役立つ場合)。
Uri newUri = new Uri("https://some.random.url:443/random");
System.Net.HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(newUri);
wr.Method = "POST";
wr.ContentType = "application/x-www-form-urlencoded";
ASCIIEncoding encoding = new ASCIIEncoding();
byte[] requestBytes = encoding.GetBytes("test");
wr.ContentLength = requestBytes.Length;
System.IO.Stream stream = wr.GetRequestStream(); //FAILS HERE, ServerProtocolViolation
Googleおよびその他のSSL / HttpWebRequestの問題を調査しましたが、特効薬を思い付くことができません。
解決
問題は、ASP.NETサーバーとリモートサーバー間のプロキシサーバーのようです。プロキシサーバー(wr.Proxy = null)を使用しないで試すことができますが、ネットワークのセットアップに必要な場合があります。
サーバーが存在するネットワークの責任者と話し、プロキシがSSLパススルーをサポートしているかどうかを確認することをお勧めします(.NETがユーザーに代わって送信するCONNECTコマンド経由)。
他のヒント
SSLを介して HttpWebRequest
呼び出しを実行しましたが、この問題に遭遇したことはありません。あなたが私がやったことがないことを私が見ることができる唯一のことは、URLにポート番号(443)を含めることです。
https
プロトコルを使用するときに、使用するポートを通知されることなく、.NETがSSL接続の作成を処理する必要があります。まだポート番号がない場合は試してください。あなたが持っているなら、私はアイデアがありません;)
これを試して、見つけ方を教えてください!
htw.Credentials =新しいNetworkCredentials(ユーザー名、パスワード)