web-dev-qa-db-ja.com

ASP.NETセルフホストWeb APIでのSSLの構成

セルフホストWeb APIサービスを作成しています。セキュリティを確保するために、 this の記事を調べて実装し、makecertを使用してローカルSSL証明書を正常に生成し、使用している場合は認証されたサービスとトークンを生成します

http://localhost/webapi/authentication/authenticate

リンクしますが、HTTPSを使用してサービスにアクセスしようとすると、Firefoxで次のようになります。

ssl_error_rx_record_too_long

そして、同じリクエストに対して、フィドラーは私に示します:

HTTP/1.1 502 Fiddler-接続失敗日:月、2013年8月26日10:44:27 GMTコンテンツタイプ:text/html; charset = UTF-8接続:閉じるタイムスタンプ:13:44:27.433

[フィドラー] localhostへのソケット接続に失敗しました。
server.fiddler.network.https>とのHTTPS接続のネゴシエートに失敗しましたlocalhostの既存の接続の保護に失敗しました。予期しないパケット形式のため、ハンドシェイクは失敗しました。

私のセルフホスト構成:

    private HttpSelfHostServer _server;
    private ExtendedHttpsSelfHostConfiguration _config;
    public const string ServiceAddress = "https://localhost/webapi";
    _config = new ExtendedHttpsSelfHostConfiguration(ServiceAddress);
    _server = new HttpSelfHostServer(_config);
    _server.OpenAsync();

この投稿 から取得したExtendedHttpSelfHostConfigurationは次のとおりです。

public class ExtendedHttpSelfHostConfiguration : HttpSelfHostConfiguration
{
    public ExtendedHttpSelfHostConfiguration(string baseAddress) : base(baseAddress) { }
    public ExtendedHttpSelfHostConfiguration(Uri baseAddress) : base(baseAddress) { }

    protected override BindingParameterCollection OnConfigureBinding(HttpBinding httpBinding)
    {
        if (BaseAddress.ToString().ToLower().Contains("https://"))
        {
            httpBinding.Security.Mode = HttpBindingSecurityMode.Transport;
        }

        return base.OnConfigureBinding(httpBinding);
    }
}

私は何が欠けていますか?前もって感謝します!

36
insomnium_

このブログ記事 によれば、SSL証明書を作成して特定のポート(私の場合は99)に割り当てる必要があることがわかりました。

ローカルで署名されたSSLを作成しました。次に、ThumbprintApplicationIdを取得しました。 CMDコマンドnetshを使用(Win7以前のシステムにはhttpcfgツールがあります)、ポートに証明書を割り当てました

netsh http add sslcert ipport=0.0.0.0:99 certhash=3e49906c01a774c888231e5092077d3d855a6861 appid={2d6059b2-cccb-4a83-ae08-8ce209c2c5c1}、ここでcerthash = SSLThumbprint、およびappid =ApplicationIdI '以前にコピーしました。

これで、HTTPSリクエストを作成できるようになりました!

35
insomnium_
  1. IISを開く
  2. 「サーバー証明書」をダブルクリックします
  3. 右側のペインで、「自己署名証明書の作成」をクリックします
  4. 名前「localhost」を入力してください
  5. 終わり

指定した名前で証明書が作成されます。それを見つけます。

  1. 証明書をダブルクリックすると、そのプロパティが開き、「Thumbprint」を選択して値をコピーします。

これで証明書を作成できました。次は、自己ホストで使用しているポートに証明書をバインドします。 https:// localhost:50 の場合

  1. 高架CMDを開く
  2. このコマンドを実行して、作成した証明書を使用しているポートにバインドします。

_netsh http add sslcert ipport=0.0.0.0:5000 certhash=[cert-thumbprint] appid={[App-Id]}_

  1. [Cert-thumbprint](角かっこを含む)を手順6でコピーした値に置き換えます。
  2. [アプリID](角かっこを含む)を置き換えるアプリのGUID

[Assembly: Guid("[app-id]")]

完了です!

3
Mahmoud