43

最近の太字の編集 は .netHttpListenerクラスを使用していますが、IIS でこのアプリケーションを実行する予定はなく、ASP.net も使用していません。このWeb サイトでは、asp.net で SSL を実装するために実際に使用するコードについて説明し、このサイトでは証明書のセットアップ方法について説明しています (IIS でのみ機能するかどうかはわかりませんが)。

クラスのドキュメントには、さまざまな種類の認証 (基本、ダイジェスト、Windows など) が記載されています --- いずれも SSL について言及していません。HTTPS を使用する場合は、サーバー証明書を設定する必要があります。これは 1 行のプロパティ設定でHttpListener残りを把握することになるのでしょうか?

つまり、証明書を設定する方法と、コードを変更して SSL を実装する方法を知る必要があります。

HTTPS にアクセスしようとしているときには発生しませんが、システム イベント ログにエラーがあることに気付きました。ソースは「Schannel」で、メッセージの内容は次のとおりです。

SSL サーバー資格情報の秘密鍵にアクセスしようとしたときに、致命的なエラーが発生しました。暗号化モジュールから返されたエラー コードは 0x80090016 です。

編集:
これまでに行った手順

  • C# で、HTTP 接続で機能する HTTPListener を作成しました (例: " http://localhost:8089/foldername/ "
  • makecert.exe を使用して証明書を作成しました
  • certmgr.exe を使用して信頼される証明書を追加しました
  • Httpcfg.exe を使用して、テスト ポート (8090 など) で SSL 接続をリッスンしました。
  • listener.Prefixes.Add( https://localhost:8090/foldername/ ");を介してポート 8080 を HTTPListener に追加しました。
  • ブラウザーでHTTP クライアント接続 ( http://localhost:8089/foldername/ ") などをテストし、正しいリターンを受け取りました
  • ブラウザーでHTTPS クライアント接続をテストしました (例: http://localhost:8090/foldername/ ")。"Data Transfer Interrupted" を受け取りました (Firefox の場合)。
  • Visual Studio でデバッグすると、HTTPS 接続の開始時に、リクエストを受信するリスナー コールバックがヒットしないことがわかります。以前に何かをキャッチするためにブレークポイントを設定できる場所がありません。
  • netstat は、リッスン ポートが HTTPS と HTTP の両方に対して開いていることを示しています。接続が試行された後、HTTPS ポートは TIME_WAIT になります。
  • FiddlerHTTPAnalyzerはトラフィックをまったくキャッチしません。これらの HTTP 分析ツールに表示されるまでには、プロセスが十分に進んでいないと思います。

質問

  • 問題は何でしょうか?
  • 欠落している.Netコードはありますか(つまり、HTTPSを指すリスナーにプレフィックスを追加するだけでなく、C#でさらに多くのことを行う必要があります。これは私が行ったことです)
  • どこかで設定手順を見逃していませんか?
  • 問題を分析するために他に何ができますか?
  • システム イベント ログのエラー メッセージは問題の兆候ですか? もしそうなら、それはどのように修正されますか?
4

6 に答える 6

6

証明書を ip:port にバインドし、https:// プレフィックスでリスナーを開くだけです。0.0.0.0 はすべての IP に適用されます。appid は任意のランダム GUID であり、certhash は証明書のハッシュ (拇印と呼ばれることもあります) です。

管理者権限を使用して、cmd.exe で次を実行します。

netsh http add sslcert ipport=0.0.0.0:1234 certhash=613bb67c4acaab06def391680505bae2ced4053b  appid={86476d42-f4f3-48f5-9367-ff60f2ed2cdc}

これをテストするために自己署名証明書を作成する場合は、

  1. IIS を開く

  2. コンピューター名をクリックします

  3. サーバー証明書アイコンをクリックします

  4. 自己署名証明書の生成をクリックします

  5. ダブルクリックして詳細へ

  6. そこに拇印が表示されます。スペースを削除するだけです。

     HttpListener listener = new HttpListener();
     listener.Prefixes.Add("https://+:1234/");
     listener.Start();
     Console.WriteLine("Listening...");
     HttpListenerContext context = listener.GetContext();
    
     using (Stream stream = context.Response.OutputStream)
     using (StreamWriter writer = new StreamWriter(stream))
         writer.Write("hello, https world");
    
     Console.ReadLine();
    

このプログラムを実行した後、に移動しhttps://localhost:1234て、テキストが印刷されているのを確認しました。証明書の CN が URL と一致せず、信頼できる証明書ストアにないため、証明書の警告が表示されます。ただし、Wire Shark などのツールで確認できるように、テキストは暗号化されています。

自己署名 x509 証明書の作成をより詳細に制御したい場合は、openssl が優れたツールであり、Windows 用のポートがあります。makecert ツールよりも多くの成功を収めています。


また、ssl 警告のあるコードから https サービスと通信している場合は、サービス ポイント マネージャーで証明書バリデーターをセットアップして、テスト目的でバイパスする必要があることも非常に重要です。

ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, errors) => true;
于 2012-09-29T03:55:20.257 に答える
5

まだ完全には実装していませんが、この Web サイトは、証明書とコードの設定についての適切なウォークスルーを提供しているようです。

于 2008-08-06T22:29:57.073 に答える
4

httpcfg.exe(XP) またはnetsh.exe(Vista+)を使用せずに SSL 証明書を IP/PORT の組み合わせにバインドする別の方法を次に示します。

http://dotnetcodebox.blogspot.com.au/2012/01/how-to-work-with-ssl-certificate.html

その要点は、Windowsに組み込まれているC++ HttpSetServiceConfiguration APIを使用して、コマンドラインではなくプログラムで実行できるため、OSへの依存を取り除き、httpcfgをインストールできることです。

于 2015-03-02T05:14:45.000 に答える
3

クラスのドキュメント

このメモがあります:

https を使用して HttpListener を作成する場合は、そのリスナーのサーバー証明書を選択する必要があります。そうしないと、この HttpListener の HttpWebRequest クエリが失敗し、接続が予期せず閉じられます。

この:

HttpCfg.exe を使用して、サーバー証明書とその他のリスナー オプションを構成できます。詳細については 、 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/http/http/httpcfg_exe.asp を参照してください。実行可能ファイルは Windows Server 2003 に同梱されていますが、プラットフォーム SDK で入手可能なソース コードからビルドすることもできます。

最初の音は 2 番目の音によって説明されますか? 質問で概説したように、httpcfg.exe を使用して証明書を特定のポートにバインドしました。これ以外のことを意図している場合、メモはあいまいです。

于 2008-08-08T16:37:29.820 に答える
2

私はあなたと同じ問題に遭遇しました。幸いなことに、このページで難しい手順をグーグルで調べた後、SSL が HttpListener で動作するようになりました。

于 2009-01-28T10:22:57.570 に答える