Konfigurace koncových bodů pro ASP.NET Core Kestrel serveru
Ve výchozím nastavení ASP.NET Core vazby na:
http://localhost:5000https://localhost:5001(když je k dispozici místní certifikát pro vývoj)
Adresy URL můžete zadat pomocí:
ASPNETCORE_URLSproměnná prostředí.--urlsargument příkazového řádku.urlskonfigurační klíč hostitele.UseUrlsextension method.
Hodnota poskytovaná pomocí těchto přístupů může být jeden nebo více koncových bodů HTTP a HTTPS (HTTPS, pokud je k dispozici výchozí certifikát). Nakonfigurujte hodnotu jako seznam oddělený středníkem (například "Urls": "http://localhost:8000;http://localhost:8001" ).
Další informace o těchto přístupech najdete v tématu Adresy URL serveru a Konfigurace přepsání.
Vytvoří se certifikát pro vývoj:
- Když je nainstalovaná sada .NET SDK.
- Nástroj dev-certs slouží k vytvoření certifikátu.
Některé prohlížeče vyžadují udělení explicitního oprávnění k důvěřování místnímu vývojovému certifikátu.
Project šablony konfigurují aplikace tak, aby ve výchozím nastavení běží na HTTPS, a zahrnují přesměrování HTTPS a podporu HSTS.
Voláním Listen metody nebo můžete nakonfigurovat ListenUnixSocket KestrelServerOptions předpony adres URL a porty pro Kestrel .
UseUrls, argument příkazového řádku, konfigurační klíč hostitele a proměnná prostředí fungují také, ale mají omezení, která jsou uvedená dále v této části (pro konfiguraci koncového bodu HTTPS musí být k dispozici --urls urls výchozí ASPNETCORE_URLS certifikát).
KestrelServerOptions Konfigurace:
ConfigureEndpointDefaults(Action <ListenOptions> )
Určuje konfiguraci, která Action se má spustit pro každý zadaný koncový bod. Volání ConfigureEndpointDefaults vícekrát nahradí předchozí Action hodnoty za poslední Action zadané.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureEndpointDefaults(listenOptions =>
{
// Configure endpoint defaults
});
});
Poznámka
U koncových bodů Listen vytvořených voláním ConfigureEndpointDefaults před voláním se nebudou uplatňovat výchozí hodnoty.
Configure(IConfiguration)
Umožňuje Kestrel načíst koncové body z IConfiguration . Konfigurace musí být vymezená konfiguračním oddílem pro Kestrel .
Přetížení Configure(IConfiguration, bool) lze použít k povolení opětovného načtení koncových bodů při změně zdroje konfigurace.
IHostBuilder.ConfigureWebHostDefaults ve Configure(context.Configuration.GetSection("Kestrel"), reloadOnChange: true) výchozím nastavení volá pro načtení konfigurace a povolení Kestrel opětovného načítání.
{
"Kestrel": {
"Endpoints": {
"Http": {
"Url": "http://localhost:5000"
},
"Https": {
"Url": "https://localhost:5001",
"Certificate": {
"Path": "<path to .pfx file>",
"Password": "<certificate password>"
}
}
}
}
}
Pokud je konfigurace opětovného načtení povolená a signalizována změna, jsou podnikovány následující kroky:
- Nová konfigurace se porovnává se starou konfigurací, žádný koncový bod bez změn konfigurace se nezmění.
- Odebrané nebo upravené koncové body mají 5 sekund na dokončení zpracování požadavků a vypnutí.
- Jsou spuštěny nové nebo upravené koncové body.
Klienti připojující se k upravenému koncovému bodu se mohou během restartování koncového bodu odpojit nebo odmítnout.
ConfigureHttpsDefaults(Akce <HttpsConnectionAdapterOptions> )
Určuje konfiguraci, která Action se má spustit pro každý koncový bod HTTPS. Volání ConfigureHttpsDefaults vícekrát nahradí předchozí Action hodnoty za poslední Action zadané.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
// certificate is an X509Certificate2
listenOptions.ServerCertificate = certificate;
});
});
Poznámka
U koncových bodů Listen vytvořených voláním ConfigureHttpsDefaults před voláním se nebudou uplatňovat výchozí hodnoty.
ListenOptions.UseHttps
Nakonfigurujte Kestrel pro použití HTTPS.
ListenOptions.UseHttps Rozšíření:
UseHttps: Nakonfigurujte Kestrel použití protokolu HTTPS s výchozím certifikátem. Vyvolá výjimku, pokud není nakonfigurovaný žádný výchozí certifikát.UseHttps(string fileName)UseHttps(string fileName, string password)UseHttps(string fileName, string password, Action<HttpsConnectionAdapterOptions> configureOptions)UseHttps(StoreName storeName, string subject)UseHttps(StoreName storeName, string subject, bool allowInvalid)UseHttps(StoreName storeName, string subject, bool allowInvalid, StoreLocation location)UseHttps(StoreName storeName, string subject, bool allowInvalid, StoreLocation location, Action<HttpsConnectionAdapterOptions> configureOptions)UseHttps(X509Certificate2 serverCertificate)UseHttps(X509Certificate2 serverCertificate, Action<HttpsConnectionAdapterOptions> configureOptions)UseHttps(Action<HttpsConnectionAdapterOptions> configureOptions)
ListenOptions.UseHttps Parametry:
filenameje cesta a název souboru certifikátu vzhledem k adresáři, který obsahuje soubory obsahu aplikace.passwordje heslo potřebné pro přístup k datům certifikátu X.509.configureOptionsjeActionpro konfiguraciHttpsConnectionAdapterOptions. VrátíListenOptions.storeNameje úložiště certifikátů, ze kterého se má certifikát načíst.subjectje název subjektu certifikátu.allowInvalidoznačuje, jestli se mají považovat za neplatné certifikáty, například certifikáty podepsané svým držitelem.locationje umístění úložiště, ze které se má certifikát načíst.serverCertificateje certifikát X.509.
V produkčním prostředí musí být https explicitně nakonfigurovaný. Musí být poskytnut minimálně výchozí certifikát.
Podporované konfigurace popsané dále:
- Žádná konfigurace
- Nahrazení výchozího certifikátu z konfigurace
- Změna výchozích hodnot v kódu
Žádná konfigurace
Kestrel naslouchá na http://localhost:5000 a https://localhost:5001 (pokud je k dispozici výchozí certifikát).
Nahrazení výchozího certifikátu z konfigurace
Pro je k dispozici výchozí schéma konfigurace nastavení aplikace Kestrel HTTPS. Nakonfigurujte několik koncových bodů, včetně adres URL a certifikátů, které se mají použít, ze souboru na disku nebo z úložiště certifikátů.
V následujícím appsettings.json příkladu:
- Nastavte
AllowInvalidna , pokud chcete povolit použití neplatných certifikátů (například certifikátůtruepodepsaných svým držitelem). - Jakýkoli koncový bod HTTPS, který nezadá certifikát (v následujícím příkladu), se vrátí zpět k certifikátu definovanému v souboru nebo
HttpsDefaultCertCertificates:Defaultvývojovému certifikátu.
{
"Kestrel": {
"Endpoints": {
"Http": {
"Url": "http://localhost:5000"
},
"HttpsInlineCertFile": {
"Url": "https://localhost:5001",
"Certificate": {
"Path": "<path to .pfx file>",
"Password": "<certificate password>"
}
},
"HttpsInlineCertAndKeyFile": {
"Url": "https://localhost:5002",
"Certificate": {
"Path": "<path to .pem/.crt file>",
"KeyPath": "<path to .key file>",
"Password": "<certificate password>"
}
},
"HttpsInlineCertStore": {
"Url": "https://localhost:5003",
"Certificate": {
"Subject": "<subject; required>",
"Store": "<certificate store; required>",
"Location": "<location; defaults to CurrentUser>",
"AllowInvalid": "<true or false; defaults to false>"
}
},
"HttpsDefaultCert": {
"Url": "https://localhost:5004"
}
},
"Certificates": {
"Default": {
"Path": "<path to .pfx file>",
"Password": "<certificate password>"
}
}
}
}
Poznámky ke schématu:
- V názvech koncových bodů se velká a malá písmena nelišují. Například a
HTTPSHttpsjsou ekvivalentní. - Parametr
Urlje vyžadován pro každý koncový bod. Formát tohoto parametru je stejný jako konfigurační parametr nejvyšší úrovně s tím rozdílem, že jeUrlsomezený na jednu hodnotu. - Tyto koncové body nahrazují ty, které jsou definované v konfiguraci nejvyšší
Urlsúrovně, místo aby je přidávají. Koncové body definované v kódu prostřednictvímListenjsou kumulativní s koncovými body definovanými v konfiguračním oddílu. - Oddíl
Certificateje volitelný. PokudCertificateoddíl není zadaný, použije se výchozí hodnoty definované vCertificates:Default. Pokud nejsou k dispozici žádné výchozí hodnoty, použije se certifikát pro vývoj. Pokud neexistují žádné výchozí hodnoty a vývojový certifikát neexistuje, server vyvolá výjimku a nespustí se. - Oddíl
Certificatepodporuje více zdrojů certifikátů. - V konfiguraci může být definovaný libovolný počet koncových bodů, pokud nezpůsobí konflikty portů.
Zdroje certifikátů
Uzly certifikátů je možné nakonfigurovat tak, aby načítaly certifikáty z několika zdrojů:
PathaPasswordpro načtení souborů .pfx.PathaKeyPathPasswordpro načtení souborů .pem / .crt a .key.Subject``Storea , které se načtou z úložiště certifikátů.
Certifikát můžete Certificates:Default zadat například takto:
"Default": {
"Subject": "<subject; required>",
"Store": "<cert store; required>",
"Location": "<location; defaults to CurrentUser>",
"AllowInvalid": "<true or false; defaults to false>"
}
ConfigurationLoader
options.Configure(context.Configuration.GetSection("{SECTION}")) vrací KestrelConfigurationLoader s metodou .Endpoint(string name, listenOptions => { }) , kterou je možné použít k doplnění nastavení nakonfigurovaného koncového bodu:
webBuilder.UseKestrel((context, serverOptions) =>
{
serverOptions.Configure(context.Configuration.GetSection("Kestrel"))
.Endpoint("HTTPS", listenOptions =>
{
listenOptions.HttpsOptions.SslProtocols = SslProtocols.Tls12;
});
});
KestrelServerOptions.ConfigurationLoader je možné přímo přistupovat a pokračovat v iteraci stávajícího zavaděče, jako je například ten, který poskytuje CreateDefaultBuilder .
- Konfigurační oddíl pro jednotlivé koncové body je k dispozici u možností v metodě , aby bylo možné číst
Endpointvlastní nastavení. - Více konfigurací se může načíst tak, že
options.Configure(context.Configuration.GetSection("{SECTION}"))se znovu zavolá s jiným oddílem. Použije se pouze poslední konfigurace, pokudLoadnení explicitně volána pro předchozí instance. Metabalíček nevolá , takže je možné nahradit jeho výchozí konfiguračníLoadoddíl. KestrelConfigurationLoaderzrcadlí rodinu rozhraní API z jako přetížení, takže koncové body kódu a konfigurace je možné nakonfigurovatListenKestrelServerOptionsna stejnémEndpointmístě. Tato přetížení nevyužívají názvy a využívají pouze výchozí nastavení z konfigurace.
Změna výchozích hodnot v kódu
ConfigureEndpointDefaults a lze použít ke změně výchozích nastavení pro a , včetně přepsání výchozího ConfigureHttpsDefaults certifikátu zadaného v předchozím ListenOptions HttpsConnectionAdapterOptions scénáři. ConfigureEndpointDefaults Před ConfigureHttpsDefaults nakonfigurování koncových bodů by se měly volat a .
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureEndpointDefaults(listenOptions =>
{
// Configure endpoint defaults
});
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
listenOptions.SslProtocols = SslProtocols.Tls12;
});
});
Konfigurace koncových bodů pomocí Indikace názvu serveru
Indikace názvu serveru (SNI) je možné použít k hostování více domén na stejné IP adrese a portu. Aby SNI fungovala, klient odešle název hostitele pro zabezpečenou relaci na server během metody handshake protokolu TLS, aby server mohl poskytnout správný certifikát. Klient používá certifikát pro šifrovanou komunikaci se serverem během zabezpečené relace, která následuje po metodě handshake protokolu TLS.
SNI je možné nakonfigurovat dvěma způsoby:
- Vytvořte koncový bod v kódu a vyberte certifikát s použitím názvu hostitele se ServerCertificateSelector zpětným voláním.
- Nakonfigurujte mapování mezi názvy hostitelů a možnostmi HTTPS v části Konfigurace. Například JSON v
appsettings.jsonsouboru .
SNI s ServerCertificateSelector
Kestrel podporuje SNI prostřednictvím ServerCertificateSelector zpětného volání. Zpětné volání se vyvolá jednou pro připojení, aby aplikace mohla zkontrolovat název hostitele a vybrat příslušný certifikát. Následující kód zpětného volání lze použít ve volání metody souboru ConfigureWebHostDefaults Program.cs projektu:
//using System.Security.Cryptography.X509Certificates;
//using Microsoft.AspNetCore.Server.Kestrel.Https;
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.ListenAnyIP(5005, listenOptions =>
{
listenOptions.UseHttps(httpsOptions =>
{
var localhostCert = CertificateLoader.LoadFromStoreCert(
"localhost", "My", StoreLocation.CurrentUser,
allowInvalid: true);
var exampleCert = CertificateLoader.LoadFromStoreCert(
"example.com", "My", StoreLocation.CurrentUser,
allowInvalid: true);
var subExampleCert = CertificateLoader.LoadFromStoreCert(
"sub.example.com", "My", StoreLocation.CurrentUser,
allowInvalid: true);
var certs = new Dictionary<string, X509Certificate2>(StringComparer.OrdinalIgnoreCase)
{
{ "localhost", localhostCert },
{ "example.com", exampleCert },
{ "sub.example.com", subExampleCert },
};
httpsOptions.ServerCertificateSelector = (connectionContext, name) =>
{
if (name != null && certs.TryGetValue(name, out var cert))
{
return cert;
}
return exampleCert;
};
});
});
});
SNI s ServerOptionsSelectionCallback
Kestrel podporuje další dynamickou konfiguraci protokolu TLS prostřednictvím ServerOptionsSelectionCallback zpětného volání. Zpětné volání se vyvolá jednou pro připojení, aby aplikace mohla zkontrolovat název hostitele a vybrat odpovídající certifikát a konfiguraci protokolu TLS. Výchozí certifikáty a ConfigureHttpsDefaults nejsou používány s tímto zpětným voláním.
//using System.Security.Cryptography.X509Certificates;
//using Microsoft.AspNetCore.Server.Kestrel.Https;
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.ListenAnyIP(5005, listenOptions =>
{
listenOptions.UseHttps(httpsOptions =>
{
var localhostCert = CertificateLoader.LoadFromStoreCert(
"localhost", "My", StoreLocation.CurrentUser,
allowInvalid: true);
var exampleCert = CertificateLoader.LoadFromStoreCert(
"example.com", "My", StoreLocation.CurrentUser,
allowInvalid: true);
listenOptions.UseHttps((stream, clientHelloInfo, state, cancellationToken) =>
{
if (string.Equals(clientHelloInfo.ServerName, "localhost", StringComparison.OrdinalIgnoreCase))
{
return new ValueTask<SslServerAuthenticationOptions>(new SslServerAuthenticationOptions
{
ServerCertificate = localhostCert,
// Different TLS requirements for this host
ClientCertificateRequired = true,
});
}
return new ValueTask<SslServerAuthenticationOptions>(new SslServerAuthenticationOptions
{
ServerCertificate = exampleCert,
});
}, state: null);
});
});
});
SNI s TlsHandshakeCallbackOptions
Kestrel podporuje další dynamickou konfiguraci protokolu TLS prostřednictvím TlsHandshakeCallbackOptions.OnConnection zpětného volání. Zpětné volání se vyvolá jednou pro připojení, aby aplikace mohla zkontrolovat název hostitele a vybrat příslušný certifikát, konfiguraci PROTOKOLU TLS a další možnosti serveru. Výchozí certifikáty a ConfigureHttpsDefaults nejsou používány s tímto zpětným voláním.
//using System.Security.Cryptography.X509Certificates;
//using Microsoft.AspNetCore.Server.Kestrel.Https;
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.ListenAnyIP(5005, listenOptions =>
{
listenOptions.UseHttps(httpsOptions =>
{
var localhostCert = CertificateLoader.LoadFromStoreCert(
"localhost", "My", StoreLocation.CurrentUser,
allowInvalid: true);
var exampleCert = CertificateLoader.LoadFromStoreCert(
"example.com", "My", StoreLocation.CurrentUser,
allowInvalid: true);
listenOptions.UseHttps(new TlsHandshakeCallbackOptions()
{
OnConnection = context =>
{
if (string.Equals(context.ClientHelloInfo.ServerName, "localhost", StringComparison.OrdinalIgnoreCase))
{
// Different TLS requirements for this host
context.AllowDelayedClientCertificateNegotation = true;
return new ValueTask<SslServerAuthenticationOptions>(new SslServerAuthenticationOptions
{
ServerCertificate = localhostCert,
});
}
return new ValueTask<SslServerAuthenticationOptions>(new SslServerAuthenticationOptions
{
ServerCertificate = exampleCert,
});
}
});
});
});
});
SNI v konfiguraci
Kestrel podporuje SNI definované v konfiguraci. Koncový bod lze nakonfigurovat s Sni objektem, který obsahuje mapování mezi názvy hostitelů a možnostmi HTTPS. Název hostitele připojení odpovídá možnostem a používá se pro toto připojení.
Následující konfigurace přidá koncový bod s názvem MySniEndpoint , který používá SNI k výběru možností HTTPS na základě názvu hostitele:
{
"Kestrel": {
"Endpoints": {
"MySniEndpoint": {
"Url": "https://*",
"SslProtocols": ["Tls11", "Tls12"],
"Sni": {
"a.example.org": {
"Protocols": "Http1AndHttp2",
"SslProtocols": ["Tls11", "Tls12", "Tls13"],
"Certificate": {
"Subject": "<subject; required>",
"Store": "<certificate store; required>",
},
"ClientCertificateMode" : "NoCertificate"
},
"*.example.org": {
"Certificate": {
"Path": "<path to .pfx file>",
"Password": "<certificate password>"
}
},
"*": {
// At least one subproperty needs to exist per SNI section or it
// cannot be discovered via IConfiguration
"Protocols": "Http1",
}
}
}
},
"Certificates": {
"Default": {
"Path": "<path to .pfx file>",
"Password": "<certificate password>"
}
}
}
}
Možnosti HTTPS, které lze přepsat pomocí SNI:
Certificatenakonfiguruje zdroj certifikátu.Protocolsnakonfiguruje povolené protokoly HTTP.SslProtocolsnakonfiguruje povolené protokoly SSL.ClientCertificateModenakonfiguruje požadavky na klientský certifikát.
Název hostitele podporuje porovnávání se zástupnými znaky:
- Přesná shoda. Například odpovídá
a.example.orga.example.org. - Předpona se zástupným znakem. Pokud existuje více shod se zástupnými znaky, zvolí se nejdelší vzor. Například odpovídá
*.example.orgab.example.orgc.example.org. - Úplný zástupný znak.
*odpovídá všemu ostatnímu, včetně klientů, kteří nepou3/4í sni a neposílejí název hostitele.
Pro koncový bod pro připojení se použije odpovídající konfigurace SNI, která přepíše hodnoty v koncovém bodě. Pokud se připojení neshoduje s nakonfigurovaným názvem hostitele SNI, připojení se zamítne.
Požadavky na SNI
- Spuštění v cílovém rozhraní
netcoreapp2.1nebo novějším. Vnet461systému nebo novějším je zpětné volání vyvoláno, alenameje vždynull. je také v případě, že klient při ověřování TLS handshake nezadá parametr názvunamenullhostitele. - Všechny weby běží na stejné Kestrel instanci. Kestrel nepodporuje sdílení IP adresy a portu mezi více instancemi bez reverzního proxy serveru.
Protokoly SSL/TLS
Protokoly SSL jsou protokoly, které se používají k šifrování a dešifrování provozu mezi dvěma partnerskými vztahy, tradičně klientem a serverem.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
listenOptions.SslProtocols = SslProtocols.Tls13;
});
});
{
"Kestrel": {
"Endpoints": {
"MyHttpsEndpoint": {
"Url": "https://localhost:5001",
"SslProtocols": ["Tls12", "Tls13"],
"Certificate": {
"Path": "<path to .pfx file>",
"Password": "<certificate password>"
}
}
}
}
}
Výchozí hodnota způsobí, že použije výchozí nastavení operačního systému pro SslProtocols.None výběr Kestrel nejlepšího protokolu. Pokud nemáte konkrétní důvod pro výběr protokolu, použijte výchozí nastavení.
Klientské certifikáty
ClientCertificateModenakonfiguruje požadavky na klientský certifikát.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
listenOptions.ClientCertificateMode = ClientCertificateMode.AllowCertificate;
});
});
{
"Kestrel": {
"Endpoints": {
"MyHttpsEndpoint": {
"Url": "https://localhost:5001",
"ClientCertificateMode": "AllowCertificate",
"Certificate": {
"Path": "<path to .pfx file>",
"Password": "<certificate password>"
}
}
}
}
}
Výchozí hodnota je , ClientCertificateMode.NoCertificate kde nebude požadovat nebo Kestrel vyžadovat certifikát od klienta.
Další informace naleznete v tématu Konfigurace ověřování certifikátů v ASP.NET Core.
Protokolování připojení
Voláním UseConnectionLogging vysíláte protokoly na úrovni ladění pro komunikaci na úrovni byte u připojení. Protokolování připojení je užitečné při řešení potíží při komunikaci nízké úrovně, například během šifrování TLS a za nástroji prox. Pokud UseConnectionLogging je umístěný před , UseHttps šifrovaný provoz se zaprotokoluje. Pokud UseConnectionLogging se umístí za , UseHttps dešifrovaný provoz se zaprotokoluje. Jedná se o integrovaný middleware pro připojení.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Listen(IPAddress.Any, 8000, listenOptions =>
{
listenOptions.UseConnectionLogging();
});
});
Vytvoření vazby k soketu TCP
Metoda Listen se váže na soket TCP a možnost lambda povoluje konfiguraci certifikátu X.509:
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Listen(IPAddress.Loopback, 5000);
serverOptions.Listen(IPAddress.Loopback, 5001,
listenOptions =>
{
listenOptions.UseHttps("testCert.pfx",
"testPassword");
});
})
.UseStartup<Startup>();
});
Příklad konfiguruje HTTPS pro koncový bod pomocí ListenOptions . Stejné rozhraní API použijte ke konfiguraci dalších Kestrel nastavení pro konkrétní koncové body.
Ve Windows je možné certifikáty podepsané svým držitelem vytvořit pomocí rutiny PowerShellu New-SelfSignedCertificate. Nepodporovaný příklad najdete v UpdateIISExpressSSLForChrome.ps1.
V systémech macOS, Linux a Windows je možné certifikáty vytvářet pomocí OpenSSL.
Vytvoření vazby k unixovému soketu
Naslouchejte unixovému soketu a vylepšete výkon serveru ListenUnixSocket Nginx, jak je znázorněno v tomto příkladu:
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.ListenUnixSocket("/tmp/kestrel-test.sock");
serverOptions.ListenUnixSocket("/tmp/kestrel-test.sock",
listenOptions =>
{
listenOptions.UseHttps("testCert.pfx",
"testpassword");
});
})
- V konfiguračním souboru Nginx nastavte
server>location>proxy_passpoložku nahttp://unix:/tmp/{KESTREL SOCKET}:/;.{KESTREL SOCKET}je název soketu poskytnutého ListenUnixSocket pro (napříkladkestrel-test.sockv předchozím příkladu). - Ujistěte se, že je soket zapisovatelný pro Nginx (například
chmod go+w /tmp/kestrel-test.sock).
Port 0
Když je zadané číslo 0 portu, Kestrel dynamicky se sváže s dostupným portem. Následující příklad ukazuje, jak určit port vázaný Kestrel za běhu:
public void Configure(IApplicationBuilder app)
{
var serverAddressesFeature =
app.ServerFeatures.Get<IServerAddressesFeature>();
app.UseStaticFiles();
app.Run(async (context) =>
{
context.Response.ContentType = "text/html";
await context.Response
.WriteAsync("<!DOCTYPE html><html lang=\"en\"><head>" +
"<title></title></head><body><p>Hosted by Kestrel</p>");
if (serverAddressesFeature != null)
{
await context.Response
.WriteAsync("<p>Listening on the following addresses: " +
string.Join(", ", serverAddressesFeature.Addresses) +
"</p>");
}
await context.Response.WriteAsync("<p>Request URL: " +
$"{context.Request.GetDisplayUrl()}<p>");
});
}
Když je aplikace spuštěná, výstup okna konzoly indikuje dynamický port, na kterém je aplikace k dispozici:
Listening on the following addresses: http://127.0.0.1:48508
Omezení
Koncové body nakonfigurujte následujícími přístupy:
- UseUrls
--urlsArgument příkazového řádkuurlskonfigurační klíč hostiteleASPNETCORE_URLSproměnná prostředí
Tyto metody jsou užitečné pro práci kódu s jinými servery než Kestrel . Je však třeba mít na paměti následující omezení:
- HTTPS nelze s těmito přístupy použít, pokud není v konfiguraci koncového bodu HTTPS poskytnut výchozí certifikát (například pomocí konfigurace nebo konfiguračního souboru, jak je uvedeno výše
KestrelServerOptionsv tomto článku). - Pokud se současně používají přístupy
Listeni , koncové bodyUseUrlsListenpřepíšíUseUrlskoncové body.
Konfigurace koncového bodu služby IIS
Při použití služby IIS jsou vazby adresy URL pro vazby přepsání služby IIS nastaveny buď pomocí Listen , nebo UseUrls . Další informace najdete v tématu ASP.NET Core Module.
ListenOptions.Protocols
Vlastnost vytváří protokoly HTTP ( ) povolené na koncovém bodu Protocols HttpProtocols připojení nebo pro server. Přiřaďte Protocols hodnotu vlastnosti z HttpProtocols výčtu.
HttpProtocols hodnota výčtu |
Povolený protokol připojení |
|---|---|
Http1 |
Pouze HTTP/1.1. Je možné použít s protokolem TLS nebo bez něj. |
Http2 |
Pouze HTTP/2. Bez protokolu TLS se může používat jenom v případě, že klient podporuje režim předchozí znalostní báze. |
Http1AndHttp2 |
HTTP/1.1 a HTTP/2. PROTOKOL HTTP/2 vyžaduje, aby klient v handshake protokolu TLS s protokolem RDPN (Application-Layer Protocol Negotiation) vybírá http/2. Jinak je výchozí nastavení připojení HTTP/1.1. |
Výchozí hodnota ListenOptions.Protocols pro každý koncový bod je HttpProtocols.Http1AndHttp2 .
Omezení PROTOKOLU TLS pro HTTP/2:
- TLS verze 1.2 nebo novější
- Zakázáno znovuschopné vyjednávání
- Komprese zakázaná
- Minimální velikosti dočasného výměny klíčů:
- Diffie-Hellman eliptické křivky (ECDH) [ RFC4492 ] : 224 bity minima
- Omezené pole Diffie-Hellman (DHE) [
TLS12] : 2048 bity minima
- Šifrovací sada není zakázaná.
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256[TLS-ECDHE] [ FIPS186 ] ve výchozím nastavení je podporována eliptická křivka P-256.
Následující příklad povoluje připojení HTTP/1.1 a HTTP/2 na portu 8000. Připojení TLS zabezpečuje pomocí zadaného certifikátu:
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Listen(IPAddress.Any, 8000, listenOptions =>
{
listenOptions.UseHttps("testCert.pfx", "testPassword");
});
});
V systému Linux se CipherSuitesPolicy dá použít k filtrování ověřování TLS metodou handshake na základě jednotlivých připojení:
// using System.Net.Security;
// using Microsoft.AspNetCore.Hosting;
// using Microsoft.AspNetCore.Server.Kestrel.Core;
// using Microsoft.Extensions.DependencyInjection;
// using Microsoft.Extensions.Hosting;
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
listenOptions.OnAuthenticate = (context, sslOptions) =>
{
sslOptions.CipherSuitesPolicy = new CipherSuitesPolicy(
new[]
{
TlsCipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
TlsCipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
// ...
});
};
});
});
Middleware připojení
Middleware vlastního připojení může v případě potřeby filtrovat handshake TLS na základě jednotlivých připojení pro konkrétní šifry.
Následující příklad vyvolá NotSupportedException jakýkoli šifrovací algoritmus, který aplikace nepodporuje. Případně můžete definovat a porovnat ITlsHandshakeFeature. CipherAlgorithm se seznamem přijatelných šifrovacích sad.
Pro šifrovací algoritmus CipherAlgorithmType. null se nepoužívá žádné šifrování.
// using System.Net;
// using Microsoft.AspNetCore.Connections;
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Listen(IPAddress.Any, 8000, listenOptions =>
{
listenOptions.UseHttps("testCert.pfx", "testPassword");
listenOptions.UseTlsFilter();
});
});
using System;
using System.Security.Authentication;
using Microsoft.AspNetCore.Connections.Features;
namespace Microsoft.AspNetCore.Connections
{
public static class TlsFilterConnectionMiddlewareExtensions
{
public static IConnectionBuilder UseTlsFilter(
this IConnectionBuilder builder)
{
return builder.Use((connection, next) =>
{
var tlsFeature = connection.Features.Get<ITlsHandshakeFeature>();
if (tlsFeature.CipherAlgorithm == CipherAlgorithmType.Null)
{
throw new NotSupportedException("Prohibited cipher: " +
tlsFeature.CipherAlgorithm);
}
return next();
});
}
}
}
Filtrování připojení lze také nakonfigurovat prostřednictvím IConnectionBuilder lambda:
// using System;
// using System.Net;
// using System.Security.Authentication;
// using Microsoft.AspNetCore.Connections;
// using Microsoft.AspNetCore.Connections.Features;
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Listen(IPAddress.Any, 8000, listenOptions =>
{
listenOptions.UseHttps("testCert.pfx", "testPassword");
listenOptions.Use((context, next) =>
{
var tlsFeature = context.Features.Get<ITlsHandshakeFeature>();
if (tlsFeature.CipherAlgorithm == CipherAlgorithmType.Null)
{
throw new NotSupportedException(
$"Prohibited cipher: {tlsFeature.CipherAlgorithm}");
}
return next();
});
});
});
Nastavení protokolu HTTP z konfigurace
CreateDefaultBuilder Při serverOptions.Configure(context.Configuration.GetSection("Kestrel")) načítání konfigurace volá ve výchozím nastavení Kestrel .
Následující appsettings.json příklad vytvoří HTTP/1.1 jako výchozí protokol připojení pro všechny koncové body:
{
"Kestrel": {
"EndpointDefaults": {
"Protocols": "Http1"
}
}
}
Následující appsettings.json příklad vytvoří protokol připojení HTTP/1.1 pro konkrétní koncový bod:
{
"Kestrel": {
"Endpoints": {
"HttpsDefaultCert": {
"Url": "https://localhost:5001",
"Protocols": "Http1"
}
}
}
}
Protokoly zadané v hodnotách přepisu kódu nastavených podle konfigurace
Předpony adresy URL
Při použití UseUrls , --urls argumentu příkazového řádku, urls konfiguračního klíče hostitele nebo ASPNETCORE_URLS proměnné prostředí můžou být předpony adresy URL v některém z následujících formátů.
Platné jsou pouze předpony adresy URL protokolu HTTP. Kestrel Při konfiguraci vazeb URL pomocí nepodporuje HTTPS UseUrls .
Adresa IPv4 s číslem portu
http://65.55.39.10:80/0.0.0.0je zvláštní případ, který se váže ke všem adresám IPv4.Adresa IPv6 s číslem portu
http://[0:0:0:0:0:ffff:4137:270a]:80/[::]je ekvivalentem protokolu IPv4 pro protokol IPv60.0.0.0.Název hostitele s číslem portu
http://contoso.com:80/ http://*:80/Názvy hostitelů,
*a+nejsou speciální. Cokoli se nerozpoznalo jako platná IP adresa nebolocalhostse váže ke všem IP adresám IPv4 a IPv6. pokud chcete navazovat různé názvy hostitelů na různé ASP.NET Core aplikace na stejném portu, použijte HTTP.sys nebo reverzní proxy server. Mezi příklady zpětného proxy server patří IIS, Nginx nebo Apache.Upozornění
Hostování v konfiguraci reverzního proxy serveru vyžaduje filtrování hostitele.
localhostNázev hostitele s číslem portu nebo IP adresou zpětné smyčky s číslem portuhttp://localhost:5000/ http://127.0.0.1:5000/ http://[::1]:5000/Při
localhostzadání se Kestrel pokusí vytvořit propojení s rozhraními zpětné smyčky IPv4 i IPv6. Pokud je požadovaný port používán jinou službou na rozhraní zpětné smyčky, Kestrel spuštění se nespustí. Pokud je rozhraní zpětné smyčky v žádném jiném případě nedostupné (většinou vzhledem k tomu, že protokol IPv6 není podporovaný), Kestrel zaznamená upozornění.