Настройка ASP.NET Core 2.0 Kestrel для HTTPS
TL;DR Каков сегодня правильный способ настройки HTTPS с ASP.NET Core 2.0?
Я хотел бы настроить свой проект для использования https и сертификата, который они показали на BUILD 2017. Я пробовал несколько настроек, но ничего не получалось. После некоторых исследований я еще больше запутался. Кажется, есть много способов настроить URL-адреса и порты... Я видел appsettings.json
, hosting.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
}
}
}
}
}
}
Но это всегда берет URL и порт от launchsettings.json
когда я начинаю из командной строки с dotnet run
или когда я начинаю с отладчика из Visual Studio.
Это мое Program.cs
а также Startup.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" });
});
}
}
Как я уже сказал, я не смог заставить его работать ни в одной установке. Какой сегодня правильный способ настройки HTTPS с ASP.NET Core 2.0?
1 ответ
К сожалению, способ настройки HTTPS, основанный на конфигурации, который был показан в различных видео или учебных руководствах перед запуском ASP.NET Core 2.0, не попал в финальную версию.
Для 2.0 единственный способ настроить HTTPS - это код, явно настроив слушателей Kestrel, как описано в этом объявлении, и используя ListenOptions.UseHttps
включить HTTPS:
var host = new WebHostBuilder()
.UseKestrel(options =>
{
options.Listen(IPAddress.Any, 443, listenOptions =>
{
listenOptions.UseHttps("server.pfx", "password");
});
})
.UseStartup<Startup>()
.Build();
К сожалению, во время выпуска официальная документация также не покрывала это должным образом и рекламировала способ, основанный на конфигурации, который не был реализован. Это было исправлено с тех пор.
Начиная с ASP.NET Core 2.1, настройка HTTPS будет возможна, как и было обещано изначально. Скорее всего, это будет выглядеть так, как объяснил Tratcher на GitHub:
"Kestrel": {
"Endpoints": {
"HTTPS": {
"Url": "https://*:443",
"Certificate": {
"Path": "server.pfx",
"Password": "password"
}
}
}
}
В вашем конкретном примере конфигурация на основе кода будет выглядеть следующим образом. Обратите внимание, что если вы не хотите использовать файл сертификата, вам необходимо сначала извлечь сертификат из хранилища сертификатов.
.UseKestrel(options =>
{
// listen for HTTP
options.Listen(IPAddress.Parse("127.0.0.1"), 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.Listen(IPAddress.Parse("127.0.0.1"), 40001, listenOptions =>
{
listenOptions.UseHttps(certificate);
});
}
}
})