web-dev-qa-db-ja.com

HTTPS用のASP.NET Core 2.0ケストレルの構成

TL; DR今日、ASP.NET Core 2.0でHTTPSをセットアップする正しい方法は何ですか?

BUILD 2017 で示したようなhttpsと証明書を使用するようにプロジェクトを構成したいと思います。いくつかの設定を試しましたが、何も機能しませんでした。いくつかの研究の後、私はさらに混乱しています。 URLとポートを設定する方法はたくさんあるようです…コードを介してappsettings.jsonhosting.jsonを見てきましたが、launchsettings.jsonでURLとポートも設定できます。

それを行うための「標準的な」方法はありますか?

これが私のappsettings.development.jsonです

{
  "Kestrel": {
    "Endpoints": {
      "Localhost": {
        "Address": "127.0.0.1",
        "Port": "40000"
      },
      "LocalhostWithHttps": {
        "Address": "127.0.0.1",
        "Port": "40001",
        "Certificate": {
          "HTTPS": {
            "Source": "Store",
            "StoreLocation": "LocalMachine",
            "StoreName": "My",
            "Subject": "CN=localhost",
            "AllowInvalid": true
          }
        }
      }
    }
  }
}

ただし、launchsettings.jsonを使用してコマンドラインから起動するとき、またはVisual Studioからデバッガーを起動するときは、常にdotnet runからURLとポートを取得します。

これは私のProgram.csStartup.csです

public class Program
{
    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .Build();
}

public class Startup
{
    public IConfiguration Configuration { get; }
    public string Authority { get; set; } = "Authority";
    public string ClientId { get; set; } = "ClientId";

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<MvcOptions>(options => options.Filters.Add(new RequireHttpsAttribute()));

        JsonConvert.DefaultSettings = () => new JsonSerializerSettings() {
            NullValueHandling = NullValueHandling.Ignore
        };

        services.AddSingleton<IRepository, AzureSqlRepository>(x => new AzureSqlRepository(Configuration.GetConnectionString("DefaultConnection")));
        services.AddSingleton<ISearchSplitService, SearchSplitService>();

        services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(options => new JwtBearerOptions {
                Authority = this.Authority,
                Audience = this.ClientId
        });

        services.AddMvc();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions() { HotModuleReplacement = true, ReactHotModuleReplacement = true, HotModuleReplacementEndpoint = "/dist/__webpack_hmr" });
        }

        app.UseStaticFiles();
        app.UseAuthentication();

        app.UseMvc(routes => {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{id?}");

            routes.MapSpaFallbackRoute(
                name: "spa-fallback",
                defaults: new { controller = "Home", action = "Index" });
        });
    }
}

先ほど言ったように、どのコンスタレーションでも機能させることはできませんでした。現在、ASP.NET Core 2.0でHTTPSをセットアップする正しい方法は何ですか?

18
VSDekar

残念ながら、ASP.NET Core 2.0のリリース前にさまざまなビデオやチュートリアルで紹介されていたHTTPSの設定ベースの設定方法は、最終リリースには至りませんでした。

2.0の場合、HTTPSを構成する唯一の方法は、 このアナウンスメントで を使用してKestrelリスナーを明示的に設定し、 ListenOptions.UseHttps HTTPSを有効にするには:

var Host = new WebHostBuilder()
    .UseKestrel(options =>
    {
        options.ListenAnyIP(443, listenOptions => 
        {
            listenOptions.UseHttps("server.pfx", "password");
        });
    })
    .UseStartup<Startup>()
    .Build();

残念ながら、リリースの時点で、公式ドキュメントalsoはこれを適切にカバーしておらず、実装されていない設定ベースの方法を宣伝していました。 これは以降修正されました。

ASP.NET Core 2.1以降では、当初約束されていた構成ベースのHTTPSセットアップが可能になります。 GitHubのトラッカー で説明されているように、これはおそらく次のようになります。

"Kestrel": {
  "Endpoints": {
    "HTTPS": {
      "Url": "https://*:443",
      "Certificate": {
        "Path": "server.pfx",
        "Password": "password"
      }
    }
  }
}

特定の例では、コードベースの構成は次のようになります。 証明書ファイルを使用したくない場合は、最初に証明書ストアから証明書を手動で取得する必要があることに注意してください。

.UseKestrel(options =>
{
    // listen for HTTP
    options.ListenLocalhost(40000);

    // retrieve certificate from store
    using (var store = new X509Store(StoreName.My))
    {
        store.Open(OpenFlags.ReadOnly);
        var certs = store.Certificates.Find(X509FindType.FindBySubjectName, 
            "localhost", false);
        if (certs.Count > 0)
        {
            var certificate = certs[0];

            // listen for HTTPS
            options.ListenLocalhost(40001, listenOptions =>
            {
                listenOptions.UseHttps(certificate);
            });
        }
    }
})
30
poke