Configurer ASP.NET Core 2.0 Kestrel pour HTTPS

TL; DR Quelle est aujourd’hui la bonne façon de configurer HTTPS avec ASP.NET Core 2.0?

Je souhaite configurer mon projet pour utiliser https et un certificate comme ils l’ont montré à BUILD 2017 . J’ai essayé plusieurs réglages mais rien n’a fonctionné. Après quelques recherches, je suis encore plus confus. Il semble qu’il existe de nombreuses façons de configurer des URL et des ports… J’ai vu appsettings.json , appsettings.json , via le code, et dans launchsettings.json nous pouvons également définir l’URL et le port.

Existe-t-il une manière “standard” de le faire

Voici mon 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 } } } } } } 

Mais il faut toujours l’url et le port de launchsettings.json lorsque je démarre à partir de la ligne de commande avec l’ dotnet run ou lorsque je lance le débogueur de Visual Studio.

Ceci est mes Program.cs et Startup.cs

 public class Program { public static void Main(ssortingng[] args) { BuildWebHost(args).Run(); } public static IWebHost BuildWebHost(ssortingng[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup() .Build(); } public class Startup { public IConfiguration Configuration { get; } public ssortingng Authority { get; set; } = "Authority"; public ssortingng ClientId { get; set; } = "ClientId"; public Startup(IConfiguration configuration) { Configuration = configuration; } public void ConfigureServices(IServiceCollection services) { services.Configure(options => options.Filters.Add(new RequireHttpsAtsortingbute())); JsonConvert.DefaultSettings = () => new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore }; services.AddSingleton(x => new AzureSqlRepository(Configuration.GetConnectionSsortingng("DefaultConnection"))); services.AddSingleton(); 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" }); }); } } 

Comme je l’ai dit, je n’ai pas réussi à le faire fonctionner dans une constallation. Quelle est aujourd’hui la bonne façon de configurer HTTPS avec ASP.NET Core 2.0?

Malheureusement, la manière de configurer HTTPS basée sur la configuration qui a été présentée dans diverses vidéos ou tutoriels avant le lancement d’ASP.NET Core 2.0 n’a pas été intégrée à la version finale.

Pour la version 2.0, le seul moyen de configurer HTTPS est d’utiliser du code, en configurant explicitement les écouteurs Kestrel, comme expliqué dans cette annonce , et en utilisant ListenOptions.UseHttps pour activer HTTPS:

 var host = new WebHostBuilder() .UseKestrel(options => { options.Listen(IPAddress.Any, 443, listenOptions => { listenOptions.UseHttps("server.pfx", "password"); }); }) .UseStartup() .Build(); 

Malheureusement, au moment de la publication, la documentation officielle ne couvrait pas non plus correctement cette question et annonçait la méthode de configuration non implémentée. Ceci a été corrigé depuis.

À partir de ASP.NET Core 2.1, la configuration HTTPS basée sur la configuration sera possible, comme promis à l’origine. Cela ressemblera probablement à ceci, comme l’explique Tratcher sur GitHub :

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

Dans votre exemple particulier, la configuration basée sur un code ressemblerait à ce qui suit. Notez que si vous ne souhaitez pas utiliser un fichier de certificate , vous devez d’abord extraire manuellement le certificate à partir du magasin de certificates.

 .UseKestrel(options => { // listen for HTTP options.Listen(IPAddress.Parse("127.0.0.1"), 40000); // resortingeve certificatee 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 certificatee = certs[0]; // listen for HTTPS options.Listen(IPAddress.Parse("127.0.0.1"), 40001, listenOptions => { listenOptions.UseHttps(certificatee); }); } } })