[ad_1]
こんにちは、
知っていて使っている人も多いと思います HttpListener[^] クラス。
MSDN のメモを見る限り、https トラフィックがサポートされています。
If you create an HttpListener using https, you must select a Server Certificate for that listener. Otherwise, an HttpWebRequest query of this HttpListener will fail with an unexpected close of the connection.
ルート証明書をローカルストレージの信頼できるものに追加し、ルート証明書で署名されたもう 1 つの証明書をローカルストレージの個人用に追加しました。
ROOT makecert.exe -sr localmachine -ss MY -a sha1 -n "CN=Root,O=DO_NOT_TRUST,OU=test purposes" -sky signature -pe -r "Root.cer" -sv "RootKey.pvk" Personal makecert.exe -sr localmachine -ss MY -a sha1 -n "CN=*.codeproject.com,O=DO_NOT_TRUST,OU=test purposes" -sky exchange -pe -ir localmachine -iv "RootKey.pvk" -ic "Root.cer"
次のように証明書をポートにバインドしました。
netsh http add sslcert ipport=0.0.0.0:8081 certhash="{hash}" appid={guid}
すべてが機能しますが、ローカルホスト上のサイトに対してのみ機能します。 たとえば https://codeproject.com を開こうとすると。 HttpListener はリクエストを「聞きません」。 ブラウザが Web ページを開こうとしましたが、タイムアウトで失敗しました。
ところで、これが中間者攻撃のようなものと呼ばれていることは知っていますが、これはテスト目的のみであり、残念ながらこの手法を使用する Fiddler は使用できません。
伝統的に、私の質問は単純ではありません。ここには「無料評価」はないと思います、申し訳ありません:) しかし、もしあなたが私を助けることができれば、それは素晴らしいことです。
もう 1 つ注意してください。私はこれに関するほぼすべての記事と、そこにある localhost のすべての例を読みました。 したがって、記事へのリンクを提供する場合は、この例がローカルホストにも当てはまる可能性があることを確認してください 😉
そしてもう 1 つ – おそらく、TcpListner などを使用することをお勧めします。 今のところロジックは変更したくありませんが、解決策のみがあればロジックを変更します。
どうもありがとう。 ティムール。
解決策 1
すばらしい! いつものように 50 件以上のビューがありますが、回答はありません 🙂 いつものように、自分で回答します。
HttpListener は TCPListener よりも高レベルのクラスです。 もちろん、これは HttpListener の操作が容易になることを意味しますが、! これは機能が欠如していることも意味します。 つまり、HTTPListener では本格的なプロキシを構築することはできません。
セキュアソケット (SSL) を使用するには、SSL ハンドシェイク (CONNECT メソッドなど) を行う必要があることがわかっています。 ただし、HttpListener の場合は、証明書バインディング (netsh http add sslcert) を介して実行する必要があります。 私が言えるのは、すべてを試してみましたが、リモートホストではうまくいかず、ローカルホストでのみうまくいったということだけです。 理由は分かりません、ごめんなさい。
次に、この証明書入札はプロキシとして使用するのが快適ではありません。 正しい CN 件名を使用して証明書をオンザフライで作成したい場合はどうすればよいですか?
このため、TCPListener を使用して CONNECT メソッドを処理するようにアプリケーションを書き直す必要がありました。
次の記事は基本を理解するのに役立ちます。
C# でのマルチスレッド HTTP/HTTPS デバッグ プロキシ サーバーの実装[^]
[ad_2]
コメント