76

.NET HTTPListener を HTTPS 対応にすることに関して、多くの混乱し、時には矛盾する情報があるようです。私の理解は次のとおりです。

  • リスナーがこのポートで SSL 要求を処理する必要があることを理解するには、C# コードにhttpsプレフィックス (たとえば、 ) が必要です。https://*:8443

  • 実際の SSL ハンドシェイクは内部で行われ、http.sys(Windows マシンのどこかに埋め込まれている) によって処理されます。SSL ハンドシェイクは内部で行われるため、C# コードで明示的に SSL ハンドシェイクを管理する必要はありません。

  • マシンに「X.509 信頼できる証明書」がhttpListener必要であり、何らかの方法でその証明書をポート 8443 にバインドする必要があります (この例では)。

上記の私の理解は正しいですか?そうでない場合は、私を教育してください。

X.509 証明書に関して、私の理解は次のとおりです。

  • makecertX.509 証明書の作成に使用します。この証明書は個人用ストアに保存され、信頼できるストアに移動する必要があります (これは、HTTP リスナーが参照する場所です)。を使っcertMgrて技を出したり、技を出したりできるmmcようです。複数の X.509 証明書形式 ( DERBase64pks、pswd 保護、pks非公開など) があるようです...使用すべき好ましい形式はありますか?

信頼できるストアに証明書を取得したら、それを TCP ポートにバインドする必要があります。Windows 7 を使用しています。またはを使用する必要がありますhttpcfgnetsh?

4

5 に答える 5

89

私はたくさんの宿題をして、これを機能させました。.NET HttpListener の SSL サポートを追加する手順は次のとおりです。

  1. C# アプリケーション コードを更新して、httpsプレフィックスを含めます。例:

    String[] prefixes = { "http://*:8089/","https://*:8443/" };
    

    コードの観点からは以上です。

  2. 証明書側では、Windows SDKコマンド コンソールまたは Visual Studio Professional コマンド コンソールを使用します。

    • makecert.exe認証局の作成に使用します。例:

      makecert -n "CN=vMargeCA" -r -sv vMargeCA.pvk vMargeCA.cer
      
    • makecert.exeSSL証明書の作成に使用

      makecert -sk vMargeSignedByCA -iv vMargeCA.pvk -n "CN=vMargeSignedByCA" -ic vMargeCA.cer vMargeSignedByCA.cer -sr localmachine -ss My
      
    • MMC GUI を使用して CA を信頼できる機関ストアにインストールする

    • MMC GUI を使用して SSL 証明書を個人ストアにインストールする
    • アプリケーションに証明書をバインドIP address:portします。例:

      netsh http add sslcert ipport=0.0.0.0:8443 certhash=585947f104b5bce53239f02d1c6fed06832f47dc appid={df8c8073-5a4b-4810-b469-5975a9c95230}
      

      certhash は、SSL 証明書の拇印です。これは mmc を使用して見つけることができます。appid は Visual Studio にあります...通常は assembly.cs にあり、GUID 値を探します。

上記を達成する他の方法があるかもしれませんが、これは私にとってはうまくいきました。

于 2012-07-12T17:55:07.233 に答える
42

HTTPListenerここでは、OpenSSL を使用して C#アプリケーション用の自己署名証明書を作成し、Windows でスタンドアロン サーバーをセットアップするための詳細な手順を示します。さらに調査したい場合に備えて、たくさんのリンクが含まれています。

  1. 次の方法で、.NET にスタンドアロン サーバーを作成しますHttpListener

    var prefixes = {"http://localhost:8080/app/root", "https://localhost:8443/app/root"};
    var listener = new HttpListener();
    foreach (string s in prefixes)
        listener.Prefixes.Add(s);
    listener.Start();
    
  2. 自己署名証明書を作成: *

    1. openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365これにより、コマンド ラインで証明書の各フィールドの値を入力するよう求められます。共通名には、ドメイン名を入力します (例: localhost)
    2. openssl pkcs12 -inkey bob_key.pem -in bob_cert.cert -export -out bob_pfx.pfx、ターゲット マシンでそのキーを使用してインポートできるようにします。

    *を使用した別の方法については、makecertWalter 自身の回答を参照してください。

  3. ローカル マシンの証明書マネージャーを開きます。を実行すると、現在のユーザーcertmgr.mscの Certificate Manager が開きますが、これはここで必要なものではありません。その代わり:

    1. ターゲット マシンの管理コマンド プロンプトから、次のコマンドを実行します。mmc
    2. を押すか、クリックCtrl + MFile > Add/Remove Snap-in
    3. を選択CertificatesしてクリックAdd >
    4. 表示されるダイアログで、 を選択Computer Accountし、Next
    5. を選択しLocal Computerます。をクリックしFinishてからOkay
  4. ターゲット マシンのWindows 証明書ストアpfxに証明書 ( ) をインポートします。

    1. 前に開いたmmcウィンドウで、ドリルダウンしてCertificates (Local Computer) > Personal
    2. を右クリックしてPersonalから、All Tasks -> Import...
    3. 表示されるダイアログの 2 番目の画面で、証明書を見つけてインポートします。それを見つけるには、ファイル タイプ フィルタをPersonal Information Exchangeまたはに変更する必要があります。All Files
    4. 次の画面で、ステップ 2.1 で選択したパスワードを入力し、最初のチェック ボックスに注意してください。これにより、証明書がどの程度安全に保存され、どの程度使いやすいかが決まります。
    5. 最後の画面で、 を選択しますPlace all certificates in the following store。と表示されていることを確認してからPersonalFinish
    6. Trusted Root Certification Authorities証明書セクションについて、上記のインポート手順を繰り返します。
  5. アプリケーションのポートの関連付けを作成します。Windows Vista 以降ではnetsh、私が行ったように を使用します。(Windows XP 以前の場合は、を使用httpcfg)

    • 管理コマンド ラインから次のように入力して、アプリへ のSSL バインド*と適切なポートを設定します。注: (PowerShell では) 中かっこをエスケープする必要があるため、このコマンドは間違いやすいです。次の PowerShell コマンドが機能します。

      netsh http add sslcert ipport=0.0.0.0:8443 `
          certhash=110000000000003ed9cd0c315bbb6dc1c08da5e6 `
          appid=`{00112233-4455-6677-8899-AABBCCDDEEFF`}
      

      の場合cmd.exe、代わりに次を使用する必要があります。

      netsh http add sslcert ipport=0.0.0.0:8443 certhash=110000000000003ed9cd0c315bbb6dc1c08da5e6 appid={00112233-4455-6677-8899-AABBCCDDEEFF}
      
      • このipportパラメーターにより、SSL 証明書が8443すべてのネットワーク インターフェイスのポートにバインドされます。特定のインターフェイス (のみ) にバインドするには、そのネットワーク インターフェイスに関連付けられている IP アドレスを選択します。
      • certhash、スペースが削除された単なる証明書の拇印です。
      • これappidは、アプリケーションのアセンブリ情報に格納されている GUID です。(補足:この質問とその回答netshから判断すると、メカニズムは明らかにCOMインターフェースです)

      * Microsoft は、SSL バインディングリンクをここからそこにリダイレクトしました。

  6. Web サーバーを起動すれば準備完了です。

于 2015-11-24T22:23:34.380 に答える
1

回答で独自の自己署名証明書を作成してもうまくいかず、.NET HTTPListener を HTTPS 対応にすることを具体的に要求し、ヒントやアドバイスを求めているため、私のアプローチを共有したいと思います。

www.made-up.com のようなホスト名が必要です。これは、WAN IP アドレスを指し (ホスト プロバイダーに指示を求めるなど)、そのポート (443 など) をローカル マシンに転送する必要があります。ローカル マシンのファイアウォールで受信 443 ポートを開くことを忘れないでください。

https://letsencrypt.org/を使用しました。Windows では、Windows 用の公式の certbot ACME クライアントがないため、これは Linux ほど簡単ではありません。ただし、 https://github.com/Lone-Coder/letsencrypt-win-simpleを使用することもできます。その中にはバイナリもあります。ただし、「現在は IIS のみがサポートされています」。しかし、SSL の方法で HTTP リスナーにアプローチできるように、コンピューター上に証明書を作成するよう簡単にだますことができます。

  1. IIS を (Windows の機能のオン/オフを介して) インストールし、IIS 内に Web サイトを作成して、ホスト名を割り当てます。また、それの安全な (443 ポート) Web サイトを作成します。
  2. letsencrypt-win-simple EXE ファイルを実行します (バージョン 1.9.1 を使用しました)。質問に答えて証明書を生成します。
  3. その後、IIS サーバーを停止できます。

数か月後に成功するかどうかわからないため、生成された更新タスクに注意する必要があると思います (証明書を更新するには、おそらく IIS を再起動する必要があります)。

于 2016-12-27T20:39:06.763 に答える