Konfigurace koncových bodů pro webový server ASP.NET Core Kestrel
Poznámka:
Toto není nejnovější verze tohoto článku. Aktuální vydání si přečtěte v článku o verzi .NET 9.
Upozornění
Tato verze ASP.NET Core se už nepodporuje. Další informace najdete v zásadách podpory .NET a .NET Core. Pro aktuální vydání si přečtěte verzi článku .NET 9.
Důležité
Tyto informace se týkají předběžného vydání produktu, který může být podstatně změněn před komerčním vydáním. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Aktuální verzi tohoto článku najdete ve verzi .NET 9.
Kestrel koncové body poskytují infrastrukturu pro naslouchání příchozím požadavkům a jejich směrování do příslušného middlewaru. Kombinace adresy a protokolu definuje koncový bod.
- Adresa určuje síťové rozhraní, na které server naslouchá příchozím požadavkům, jako je port TCP.
- Protokol určuje komunikaci mezi klientem a serverem, například HTTP/1.1, HTTP/2 nebo HTTP/3.
- Koncový bod je možné zabezpečit pomocí schématu
https
adresy URL neboUseHttps
metody.
Koncové body je možné nakonfigurovat pomocí adres URL, JSON v appsettings.json
a kódu. Tento článek popisuje použití jednotlivých možností ke konfiguraci koncového bodu:
Výchozí koncový bod
Nové projekty ASP.NET Core jsou nakonfigurované tak, aby se svážely s náhodným portem HTTP mezi 5000–5300 a náhodným portem HTTPS mezi 7000–7300. Vybrané porty se ukládají do vygenerovaného Properties/launchSettings.json
souboru a můžou je upravit vývojáři. Soubor launchSetting.json
se používá pouze v místním vývoji.
Pokud neexistuje žádná konfigurace koncového bodu, vytvoří Kestrel vazbu na http://localhost:5000
.
Konfigurace koncových bodů
Kestrel koncové body naslouchají příchozím připojením. Když se koncový bod vytvoří, musí být nakonfigurován pro adresu, na kterou bude naslouchat. Obvykle se jedná o adresu TCP a číslo portu.
Pro konfiguraci koncových bodů existuje několik možností:
- Konfigurace koncových bodů pomocí adres URL
- Zadat pouze porty
- Konfigurace koncových bodů v appsettings.json
- Konfigurace koncových bodů v kódu
Konfigurace koncových bodů pomocí adres URL
V následujících částech se dozvíte, jak nakonfigurovat koncové body pomocí následujících možností:
-
ASPNETCORE_URLS
proměnná prostředí. -
--urls
argument příkazového řádku. -
urls
konfigurační klíč hostitele. - UseUrls rozšiřující metoda.
- WebApplication.Urls vlastnost.
Formáty adres URL
Adresy URL označují IP nebo hostitelské adresy s porty a protokoly, na které by měl server naslouchat. Port je možné vynechat, pokud se jedná o výchozí hodnotu protokolu (obvykle 80 a 443). Adresy URL můžou být v libovolném z následujících formátů.
Adresa IPv4 s číslem portu
http://65.55.39.10:80/
0.0.0.0
je zvláštní případ, který se sváže se všemi adresami IPv4.Adresa IPv6 s číslem portu
http://[0:0:0:0:0:ffff:4137:270a]:80/
[::]
je ekvivalentem IPv6 protokolu IPv40.0.0.0
.Hostitel se zástupným znakem a číslem portu
http://contoso.com:80/ http://*:80/
Cokoli, co se nerozpoznalo jako platná IP adresa nebo
localhost
se považuje za zástupný znak, který je vázán na všechny adresy IPv4 a IPv6. Někteří lidé rádi používají*
nebo+
, aby byli explicitnější. Pokud chcete svázat různé názvy hostitelů s různými aplikacemi ASP.NET Core na stejném portu, použijte HTTP.sys nebo reverzní proxy server.Příklady reverzního proxy serveru zahrnují IIS, YARP, Nginx a Apache.
Název hostitele
localhost
s číslem portu nebo IP adresa se zpětnou smyčkou a číslem portuhttp://localhost:5000/ http://127.0.0.1:5000/ http://[::1]:5000/
Po zadání
localhost
se Kestrel pokusí vytvořit vazbu na rozhraní zpětné smyčky IPv4 i IPv6. Pokud je požadovaný port používán jinou službou na některém z rozhraní zpětné smyčky, Kestrel se nepodaří spustit. Pokud je některé z rozhraní zpětné smyčky z jakéhokoli jiného důvodu nedostupné (nejčastěji kvůli tomu, že se nepodporuje protokol IPv6), Kestrel zaznamená upozornění.
Pomocí oddělovače středníku (;
) je možné zadat více předpon adres URL:
http://*:5000;http://localhost:5001;https://hostname:5002
Další informace naleznete v tématu Překonfigurace.
Předpony adresy URL HTTPS
Předpony adresy URL HTTPS je možné použít k definování koncových bodů pouze v případě, že je v konfiguraci koncového bodu HTTPS zadaný výchozí certifikát. Použijte KestrelServerOptions například konfiguraci nebo konfigurační soubor, jak je znázorněno dále v tomto článku.
Další informace najdete v tématu Konfigurace HTTPS.
Zadat pouze porty
Aplikace a kontejnery mají často jenom port pro naslouchání, jako je port 80, bez dalších omezení, jako je hostitel nebo cesta. HTTP_PORTS a HTTPS_PORTS jsou konfigurační klíče, které určují porty naslouchání pro Kestrel servery a servery HTTP.sys. Tyto klíče mohou být zadány jako proměnné prostředí definované s předponou DOTNET_
nebo ASPNETCORE_
, anebo mohou být zadány přímo prostřednictvím jakéhokoli jiného vstupu konfigurace, například appsettings.json
. Každý z nich je seznam hodnot portů oddělený středníkem, jak je znázorněno v následujícím příkladu:
ASPNETCORE_HTTP_PORTS=80;8080
ASPNETCORE_HTTPS_PORTS=443;8081
Předchozí příklad je zkratka pro následující konfiguraci, která určuje schéma (HTTP nebo HTTPS) a libovolného hostitele nebo IP adresy.
ASPNETCORE_URLS=http://*:80/;http://*:8080/;https://*:443/;https://*:8081/
Konfigurační klíče HTTP_PORTS a HTTPS_PORTS mají nižší prioritu a jsou přepsány adresami URL nebo hodnotami zadanými přímo v kódu. Certifikáty je stále potřeba nakonfigurovat samostatně prostřednictvím mechaniky specifické pro server pro PROTOKOL HTTPS.
Konfigurace koncových bodů v appsettings.json
Kestrel může načíst koncové body z IConfiguration instance. Ve výchozím nastavení se konfigurace Kestrel načte z oddílu Kestrel
a koncové body se konfigurují v Kestrel:Endpoints
:
{
"Kestrel": {
"Endpoints": {
"MyHttpEndpoint": {
"Url": "http://localhost:8080"
}
}
}
}
Předchozí příklad:
- Používá se
appsettings.json
jako zdroj konfigurace. Lze však použít jakýkoliIConfiguration
zdroj. - Přidá koncový bod s názvem
MyHttpEndpoint
na portu 8080.
Další informace o konfiguraci koncových bodů pomocí formátu JSON najdete v dalších částech tohoto článku, které diskutují o konfiguraci protokolu HTTPS a konfiguraci protokolů HTTP v appsettings.json.
Opětovné načtení koncových bodů z konfigurace
Opětovné načtení konfigurace koncového bodu, když je ve výchozím nastavení povolená změna zdroje konfigurace. Lze ho zakázat pomocí KestrelServerOptions.Configure(IConfiguration, Boolean).
Pokud je změna signalována, provede se následující kroky:
- Nová konfigurace se porovná se starou konfigurací a žádný koncový bod bez změn konfigurace se nezmění.
- Odebrané nebo upravené koncové body mají 5 sekund k dokončení požadavků na zpracování a vypnutí.
- Spustí se nové nebo upravené koncové body.
Klienti, kteří se připojují k upravenému koncovému bodu, můžou být při restartování koncového bodu odpojeni nebo odmítnuti.
Načítání konfigurace
KestrelServerOptions.Configure vrátí hodnotu KestrelConfigurationLoader. Metoda zavaděče Endpoint(String, Action<EndpointConfiguration>), kterou lze použít k doplnění nakonfigurovaných nastavení koncového bodu:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
var kestrelSection = context.Configuration.GetSection("Kestrel");
serverOptions.Configure(kestrelSection)
.Endpoint("HTTPS", listenOptions =>
{
// ...
});
});
KestrelServerOptions.ConfigurationLoader
lze přímo přistoupit k tomu, abyste mohli pokračovat v iteraci na existujícím zavaděči, jako je například ten, který poskytuje WebApplicationBuilder.WebHost.
- Konfigurační část pro každý koncový bod je dostupná v možnostech metody Endpoint, aby mohla být načtena vlastní nastavení.
-
KestrelServerOptions.Configure(IConfiguration) lze volat vícekrát, ale pouze poslední konfigurace je použita, pokud
Load
není explicitně volána u předchozích instancí. Výchozí hostitel nevoláLoad
, aby se jeho výchozí konfigurační oddíl mohl nahradit. -
KestrelConfigurationLoader
zrcadlíListen
řadu rozhraní API zKestrelServerOptions
Endpoint
přetížení, takže koncové body kódu a konfigurace je možné nakonfigurovat na stejném místě. Tato přetížení nepoužívají názvy a využívají pouze výchozí nastavení z konfigurace.
Konfigurace koncových bodů v kódu
KestrelServerOptions poskytuje metody konfigurace koncových bodů v kódu:
Listen
Když se současně použijí rozhraní API UseUrls, Listen
přepíší UseUrls
koncové body.
Vytvoření vazby k soketu TCP
Metody Listen, ListenLocalhost a ListenAnyIP se vážou na soket TCP:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.Listen(IPAddress.Loopback, 5000);
serverOptions.Listen(IPAddress.Loopback, 5001, listenOptions =>
{
listenOptions.UseHttps("testCert.pfx", "testPassword");
});
});
Předchozí příklad:
- Konfiguruje koncové body, které naslouchají na portu 5000 a 5001.
- Nakonfiguruje HTTPS pro koncový bod pomocí metody rozšíření UseHttps na ListenOptions. Další informace najdete v tématu Konfigurace HTTPS v kódu.
Ve Windows je možné vytvořit samo podepsané certifikáty pomocí rutiny PowerShellNew-SelfSignedCertificate
. Nepodporovaný příklad naleznete na UpdateIISExpressSSLForChrome.ps1
.
V systémech macOS, Linux a Windows je možné certifikáty vytvářet pomocí OpenSSL.
Připojit na unixový soket
Naslouchejte na soketu Unix s lepším výkonem ListenUnixSocket pomocí Nginx, jak je znázorněno v tomto příkladu:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.ListenUnixSocket("/tmp/kestrel-test.sock");
});
- V konfiguračním souboru Nginx nastavte
server
>location
>proxy_pass
položku na .http://unix:/tmp/{KESTREL SOCKET}:/;
{KESTREL SOCKET}
je název zadaného soketu ListenUnixSocket (napříkladkestrel-test.sock
v předchozím příkladu). - Ujistěte se, že je soket zapisovatelný pomocí Nginx (například
chmod go+w /tmp/kestrel-test.sock
).
Konfigurace výchozích hodnot koncového bodu
ConfigureEndpointDefaults(Action<ListenOptions>)
určuje konfiguraci, která se spouští pro každý zadaný koncový bod. Volání ConfigureEndpointDefaults
několikrát nahrazuje předchozí konfiguraci.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureEndpointDefaults(listenOptions =>
{
// ...
});
});
Poznámka:
Koncové body vytvořené voláním Listenpřed voláním ConfigureEndpointDefaults nebudou mít použité výchozí hodnoty.
Dynamická vazba portu
Pokud je zadáno číslo 0
portu, Kestrel dynamicky vytvoří vazbu k dostupnému portu. Následující příklad ukazuje, jak určit port Kestrel vázaný za běhu:
app.Run(async (context) =>
{
var serverAddressFeature = context.Features.Get<IServerAddressesFeature>();
if (serverAddressFeature is not null)
{
var listenAddresses = string.Join(", ", serverAddressFeature.Addresses);
// ...
}
});
Dynamická vazba portu není v některých situacích dostupná:
- KestrelServerOptions.ListenLocalhost
- Propojování HTTP/1.1 a HTTP/2 založených na TCP a HTTP/3 založeného na QUIC.
Konfigurace HTTPS
Kestrel podporuje zabezpečení koncových bodů pomocí protokolu HTTPS. Data odesílaná přes PROTOKOL HTTPS se šifrují pomocí protokolu TLS (Transport Layer Security), aby se zvýšilo zabezpečení dat přenášených mezi klientem a serverem.
HTTPS vyžaduje certifikát TLS. Certifikát TLS je uložený na serveru a Kestrel je nakonfigurovaný tak, aby ho používal. Aplikace může používat vývojový certifikát ASP.NET Core HTTPS v místním vývojovém prostředí. Vývojový certifikát není nainstalovaný v prostředích, která nejsou součástí vývoje. V produkčním prostředí musí být certifikát TLS explicitně nakonfigurovaný. Je nutné poskytnout alespoň výchozí certifikát.
Způsob konfigurace protokolu HTTPS a certifikátu TLS závisí na konfiguraci koncových bodů:
- Pokud se k definování koncových bodů používají předpony adres URL nebo pouze zadání portů, lze HTTPS použít jen tehdy, pokud je v konfiguraci koncového bodu HTTPS uveden výchozí certifikát. Výchozí certifikát lze nakonfigurovat s jednou z následujících možností:
- Konfigurovat HTTPS v appsettings.json
- Konfigurace HTTPS v kódu
Konfigurace HTTPS v appsettings.json
Pro nastavení aplikace HTTPS je k dispozici výchozí schéma konfigurace pro Kestrel. Nakonfigurujte několik koncových bodů, včetně adres URL a certifikátů, které se mají použít, a to buď ze souboru na disku, nebo z úložiště certifikátů.
Jakýkoli koncový bod HTTPS, který neurčuje certifikát (HttpsDefaultCert
v následujícím příkladu), se vrátí k certifikátu definovanému v rámci Certificates:Default
nebo vývojovém certifikátu.
Následující příklad je pro appsettings.json
, ale jakýkoli zdroj konfigurace lze použít:
{
"Kestrel": {
"Endpoints": {
"Http": {
"Url": "http://localhost:5000"
},
"HttpsInlineCertFile": {
"Url": "https://localhost:5001",
"Certificate": {
"Path": "<path to .pfx file>",
"Password": "$CREDENTIAL_PLACEHOLDER$"
}
},
"HttpsInlineCertAndKeyFile": {
"Url": "https://localhost:5002",
"Certificate": {
"Path": "<path to .pem/.crt file>",
"KeyPath": "<path to .key file>",
"Password": "$CREDENTIAL_PLACEHOLDER$"
}
},
"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": "$CREDENTIAL_PLACEHOLDER$"
}
}
}
}
Varování
V předchozím příkladu je heslo certifikátu uloženo ve formátu prostého textu .appsettings.json
Token $CREDENTIAL_PLACEHOLDER$
se používá jako zástupný symbol pro heslo certifikátu. Pokud chcete bezpečně ukládat hesla certifikátů ve vývojových prostředích, přečtěte si téma Ochrana tajných kódů při vývoji. Pokud chcete bezpečně ukládat hesla certifikátů v produkčních prostředích, přečtěte si o poskytovateli konfigurace služby Azure Key Vault. Tajné kódy pro vývoj by se neměly používat pro produkční ani testovací prostředí.
Poznámky ke schématu
- Názvy koncových bodů nerozlišují malá a velká písmena. Například
HTTPS
aHttps
jsou ekvivalentní. - Parametr
Url
se vyžaduje pro každý koncový bod. Formát tohoto parametru je stejný jako konfigurační parametr nejvyšší úrovněUrls
s tím rozdílem, že je omezený na jednu hodnotu. Viz formáty adres URL dříve v tomto článku. - Tyto koncové body nahrazují ty, které jsou definované v konfiguraci nejvyšší úrovně
Urls
, nikoli jejich přidáním. Koncové body definované v kódu prostřednictvímListen
jsou kumulativní s koncovými body definovanými v konfigurační části. - Oddíl
Certificate
je nepovinný. Pokud není zadaný oddíl vCertificate
, použijí se výchozí hodnoty definované v oddíluCertificates:Default
. Pokud nejsou k dispozici žádné výchozí hodnoty, použije se vývojový certifikát. Pokud neexistují žádné výchozí hodnoty a není k dispozici vývojový certifikát, server vyvolá výjimku a nespustí se. - Tato
Certificate
část podporuje více zdrojů certifikátů. - Libovolný počet koncových bodů může být definován v
Configuration
případě, že nezpůsobují konflikty portů.
Zdroje certifikátů
Uzly certifikátů je možné nakonfigurovat tak, aby načítá certifikáty z řady zdrojů:
-
Path
aPassword
načíst soubory .pfx . -
Path
,KeyPath
aPassword
k načtení souborů .pem, .crt a .key. -
Subject
aStore
z úložiště certifikátů načíst.
Certificates:Default
Například certifikát lze zadat takto:
"Default": {
"Subject": "<subject; required>",
"Store": "<cert store; required>",
"Location": "<location; defaults to CurrentUser>",
"AllowInvalid": "<true or false; defaults to false>"
}
Konfigurace klientských certifikátů v appsettings.json
ClientCertificateMode slouží ke konfiguraci chování klientského certifikátu.
{
"Kestrel": {
"Endpoints": {
"MyHttpsEndpoint": {
"Url": "https://localhost:5001",
"ClientCertificateMode": "AllowCertificate",
"Certificate": {
"Path": "<path to .pfx file>",
"Password": "$CREDENTIAL_PLACEHOLDER$"
}
}
}
}
}
Varování
V předchozím příkladu je heslo certifikátu uloženo ve formátu prostého textu .appsettings.json
Token $CREDENTIAL_PLACEHOLDER$
se používá jako zástupný symbol pro heslo certifikátu. Pokud chcete bezpečně ukládat hesla certifikátů ve vývojových prostředích, přečtěte si téma Ochrana tajných kódů při vývoji. Pokud chcete bezpečně ukládat hesla certifikátů v produkčních prostředích, přečtěte si o poskytovateli konfigurace služby Azure Key Vault. Tajné kódy pro vývoj by se neměly používat pro produkční ani testovací prostředí.
Výchozí hodnota je ClientCertificateMode.NoCertificate
, kde Kestrel nevyžaduje nebo nevyžaduje certifikát od klienta.
Další informace najdete v tématu Konfigurace ověřování certifikátů v ASP.NET Core.
Konfigurace protokolů SSL/TLS v appsettings.json
Protokoly SSL jsou protokoly používané k šifrování a dešifrování provozu mezi dvěma uzly, obvykle mezi klientem a serverem.
{
"Kestrel": {
"Endpoints": {
"MyHttpsEndpoint": {
"Url": "https://localhost:5001",
"SslProtocols": ["Tls12", "Tls13"],
"Certificate": {
"Path": "<path to .pfx file>",
"Password": "$CREDENTIAL_PLACEHOLDER$"
}
}
}
}
}
Varování
V předchozím příkladu je heslo certifikátu uloženo ve formátu prostého textu .appsettings.json
Token $CREDENTIAL_PLACEHOLDER$
se používá jako zástupný symbol pro heslo certifikátu. Pokud chcete bezpečně ukládat hesla certifikátů ve vývojových prostředích, přečtěte si téma Ochrana tajných kódů při vývoji. Pokud chcete bezpečně ukládat hesla certifikátů v produkčních prostředích, přečtěte si o poskytovateli konfigurace služby Azure Key Vault. Tajné kódy pro vývoj by se neměly používat pro produkční ani testovací prostředí.
Výchozí hodnota SslProtocols.None
umožní Kestrel použít výchozí nastavení operačního systému, aby zvolil nejlepší protokol. Pokud nemáte konkrétní důvod k výběru protokolu, použijte výchozí nastavení.
Konfigurace HTTPS v kódu
Při použití rozhraní API Listen
je k dispozici metoda rozšíření UseHttps na ListenOptions pro konfiguraci HTTPS.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.Listen(IPAddress.Loopback, 5000);
serverOptions.Listen(IPAddress.Loopback, 5001, listenOptions =>
{
listenOptions.UseHttps("testCert.pfx", "testPassword");
});
});
ListenOptions.UseHttps
parametry:
-
filename
je cesta a název souboru certifikátu vzhledem k adresáři, který obsahuje soubory obsahu aplikace. -
password
je heslo potřebné pro přístup k datům certifikátu X.509. -
configureOptions
jeAction
pro konfiguraciHttpsConnectionAdapterOptions
. Vrátí hodnotuListenOptions
. -
storeName
je úložiště certifikátů, ze kterého se má certifikát načíst. -
subject
je název subjektu certifikátu. -
allowInvalid
označuje, zda by se měly považovat za neplatné certifikáty, jako jsou certifikáty podepsané svým držitelem. -
location
je umístění úložiště, ze které se má certifikát načíst. -
serverCertificate
je certifikát X.509.
Úplný seznam UseHttps
přetížení najdete v sekci UseHttps.
Konfigurace klientských certifikátů v kódu
ClientCertificateMode nakonfiguruje požadavky na klientský certifikát.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
listenOptions.ClientCertificateMode = ClientCertificateMode.AllowCertificate;
});
});
Výchozí hodnota je NoCertificate, kde Kestrel nevyžaduje nebo nevyžaduje certifikát od klienta.
Další informace najdete v tématu Konfigurace ověřování certifikátů v ASP.NET Core.
Konfigurace výchozích hodnot HTTPS v kódu
ConfigureHttpsDefaults(Action<HttpsConnectionAdapterOptions>) určuje konfiguraci Action
, která se má spustit pro každý koncový bod HTTPS. Volání ConfigureHttpsDefaults
několikrát nahradí předchozí instance Action
poslední zadanou instancí Action
.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
// ...
});
});
Poznámka:
Koncové body vytvořené voláním Listenpřed voláním ConfigureHttpsDefaults nebudou mít použité výchozí hodnoty.
Konfigurace protokolů SSL/TLS v kódu
Protokoly SSL jsou protokoly používané k šifrování a dešifrování provozu mezi dvěma uzly, tradičně klientem a serverem.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
listenOptions.SslProtocols = SslProtocols.Tls13;
});
});
Konfigurace filtru šifrovacích sad TLS v kódu
Na Linuxu lze CipherSuitesPolicy použít k filtrování handshake protokolu TLS pro jednotlivá připojení:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, 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,
// ...
});
};
});
});
Konfigurace indikace názvu serveru
Indikaci názvu serveru (SNI) lze použít k hostování více domén na stejné IP adrese a portu. SNI lze použít k zachování prostředků obsluhou více lokalit z jednoho serveru.
Aby rozhraní SNI fungovalo, 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á zařízený certifikát pro šifrovanou komunikaci se serverem během zabezpečené relace, která následuje za metodou handshake protokolu TLS.
Všechny weby musí běžet ve stejné Kestrel instanci. Kestrel nepodporuje sdílení IP adresy a portu mezi více instancemi bez reverzního proxy serveru.
SNI je možné nakonfigurovat dvěma způsoby:
- Nakonfigurujte mapování mezi názvy hostitelů a možnostmi HTTPS v konfiguraci. Například JSON v
appsettings.json
souboru. - Vytvořte koncový bod v kódu a vyberte certifikát pomocí názvu hostitele se zpětným voláním ServerCertificateSelector .
Konfigurace SNI v appsettings.json
Kestrel podporuje SNI definované v konfiguraci. Koncový bod lze nakonfigurovat s objektem Sni
, který obsahuje mapování mezi názvy hostitelů a možnostmi HTTPS. Název hostitele připojení se shoduje s možnostmi a používá se pro toto připojení.
Následující konfigurace přidá koncový bod pojmenovaný 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": "$CREDENTIAL_PLACEHOLDER$"
}
},
"*": {
// 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": "$CREDENTIAL_PLACEHOLDER$"
}
}
}
}
Upozornění
V předchozím příkladu je heslo certifikátu uloženo ve formátu prostého textu .appsettings.json
Token $CREDENTIAL_PLACEHOLDER$
se používá jako zástupný symbol pro heslo certifikátu. Pokud chcete bezpečně ukládat hesla certifikátů ve vývojových prostředích, přečtěte si téma Ochrana tajných kódů při vývoji. Pokud chcete bezpečně ukládat hesla certifikátů v produkčních prostředích, přečtěte si o poskytovateli konfigurace služby Azure Key Vault. Tajné kódy pro vývoj by se neměly používat pro produkční ani testovací prostředí.
Možnosti HTTPS, které je možné přepsat pomocí SNI:
-
Certificate
nakonfiguruje zdroj certifikátu. -
Protocols
nakonfiguruje povolené protokoly HTTP. -
SslProtocols
nakonfiguruje povolené protokoly SSL. -
ClientCertificateMode
nakonfiguruje požadavky na klientský certifikát.
Název hostitele podporuje porovnávání zástupných znaků:
- Přesná shoda. Například
a.example.org
odpovídáa.example.org
. - Předpona zástupných znaků. Pokud existuje více shod pro zástupné symboly, vybere se nejdelší vzorec. Například
*.example.org
odpovídáb.example.org
ac.example.org
. - Úplný wildcard.
*
odpovídá všemu jinému, včetně klientů, kteří nepoužívají SNI a neposílají název hostitele.
Odpovídající konfigurace SNI se aplikuje na koncový bod pro připojení a přepíše hodnoty na koncovém bodu. Pokud se připojení neshoduje s nakonfigurovaným názvem hostitele SNI, připojení se odmítne.
Konfigurace SNI pomocí kódu
Kestrel podporuje SNI s několika rozhraními API zpětného volání:
ServerCertificateSelector
ServerOptionsSelectionCallback
TlsHandshakeCallbackOptions
SNI s ServerCertificateSelector
Kestrel podporuje SNI prostřednictvím ServerCertificateSelector
callback. Zpětné volání se vyvolá jednou za připojení, aby aplikace mohla zkontrolovat název hostitele a vybrat příslušný certifikát:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.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 is not null && certs.TryGetValue(name, out var cert))
{
return cert;
}
return exampleCert;
};
});
});
});
SNI s ServerOptionsSelectionCallback
Kestrel podporuje další dynamickou konfiguraci protokolu TLS prostřednictvím zpětného ServerOptionsSelectionCallback
volání. Zpětné volání se vyvolá jednou za 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
nepoužívají se s tímto zpětným voláním.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.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 zpětného TlsHandshakeCallbackOptions.OnConnection
volání. Zpětné volání se vyvolá jednou za 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
nepoužívají se s tímto zpětným voláním.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.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
});
}
});
});
});
});
Konfigurace protokolů HTTP
Kestrel podporuje všechny běžně používané verze HTTP. Koncové body je možné nakonfigurovat tak, aby podporovaly různé verze HTTP pomocí výčtu HttpProtocols , který určuje dostupné možnosti verze PROTOKOLU HTTP.
Pro podporu více než jedné verze PROTOKOLU HTTP se vyžaduje protokol TLS. Metoda handshake protokolu TLS Application-Layer Protocol (ALPN) se používá k vyjednávání protokolu připojení mezi klientem a serverem, když koncový bod podporuje více protokolů.
HttpProtocols hodnota |
Povolený protokol připojení |
---|---|
Http1 |
Pouze HTTP/1.1. Lze použít s protokolem TLS nebo bez protokolu TLS. |
Http2 |
Pouze HTTP/2. Lze použít bez protokolu TLS pouze v případě, že klient podporuje předchozí režim znalostí. |
Http3 |
Pouze HTTP/3. Vyžaduje protokol TLS. Klient možná bude muset být nakonfigurovaný tak, aby používal pouze HTTP/3. |
Http1AndHttp2 |
HTTP/1.1 a HTTP/2. HTTP/2 vyžaduje, aby klient vybral HTTP/2 v handshake TLS Application-Layer Protocol Negotiation (ALPN); jinak se připojení ve výchozím nastavení přepne na HTTP/1.1. |
Http1AndHttp2AndHttp3 |
HTTP/1.1, HTTP/2 a HTTP/3. První požadavek klienta obvykle používá http/1.1 nebo HTTP/2 a alt-svc hlavička odpovědi vyzve klienta k upgradu na HTTP/3. PROTOKOL HTTP/2 a HTTP/3 vyžaduje protokol TLS; jinak se ve výchozím nastavení připojení nastaví na HTTP/1.1. |
Výchozí hodnota protokolu pro koncový bod je HttpProtocols.Http1AndHttp2
.
Omezení protokolu TLS pro HTTP/2:
- TLS verze 1.2 nebo novější
- Opětovné vyjednávání zakázáno
- Komprese zakázána
- Minimální dočasné velikosti výměny klíčů:
- Elliptic curve Diffie-Hellman (ECDHE) [RFC4492]: minimálně 224 bitů
- Konečné pole Diffie-Hellman (DHE) [
TLS12
]: minimálně 2048 bitů
- Šifrovací sada není zakázaná.
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
[TLS-ECDHE
] s eliptickou křivkou P-256 [FIPS186
] je ve výchozím nastavení podporována.
Konfigurace protokolů HTTP v appsettings.json
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"
}
}
}
}
V oddílu Kestrel:EndpointDefaults
je možné nakonfigurovat výchozí protokol. Následující appsettings.json
příklad vytvoří http/1.1 jako výchozí připojovací protokol pro všechny koncové body:
{
"Kestrel": {
"EndpointDefaults": {
"Protocols": "Http1"
}
}
}
Protokoly zadané v kódu přepisují hodnoty nastavené konfigurací.
Konfigurace protokolů HTTP v kódu
ListenOptions.Protocols slouží k určení protokolů pomocí výčtu HttpProtocols .
Následující příklad nakonfiguruje koncový bod pro připojení HTTP/1.1, HTTP/2 a HTTP/3 na portu 8000. Připojení jsou zabezpečená protokolem TLS se zadaným certifikátem:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.Listen(IPAddress.Any, 8000, listenOptions =>
{
listenOptions.UseHttps("testCert.pfx", "testPassword");
listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
});
});
Přizpůsobení Kestrel koncových bodů pojmenovaného kanálu
Podpora pojmenovaných kanálů v Kestrelzahrnuje pokročilé možnosti přizpůsobení. Vlastnost CreateNamedPipeServerStream u pojmenovaných kanálů umožňuje přizpůsobení kanálů podle koncového bodu.
To je užitečné například v aplikaci Kestrel, která vyžaduje dva koncové body potrubí s různým zabezpečením přístupu . Možnost CreateNamedPipeServerStream
lze použít k vytváření kanálů s vlastním nastavením zabezpečení v závislosti na názvu kanálu.
using System.IO.Pipes;
using System.Security.AccessControl;
using System.Security.Principal;
var builder = WebApplication.CreateBuilder();
builder.WebHost.ConfigureKestrel(options =>
{
options.ListenNamedPipe("defaultPipe");
options.ListenNamedPipe("securedPipe");
});
builder.WebHost.UseNamedPipes(options =>
{
options.CreateNamedPipeServerStream = (context) =>
{
var pipeName = context.NamedPipeEndPoint.PipeName;
switch (pipeName)
{
case "defaultPipe":
return NamedPipeTransportOptions.CreateDefaultNamedPipeServerStream(context);
case "securedPipe":
var allowSecurity = new PipeSecurity();
allowSecurity.AddAccessRule(new PipeAccessRule("Users", PipeAccessRights.FullControl, AccessControlType.Allow));
return NamedPipeServerStreamAcl.Create(pipeName, PipeDirection.InOut,
NamedPipeServerStream.MaxAllowedServerInstances, PipeTransmissionMode.Byte,
context.PipeOptions, inBufferSize: 0, outBufferSize: 0, allowSecurity);
default:
throw new InvalidOperationException($"Unexpected pipe name: {pipeName}");
}
};
});
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();
Viz také
ASP.NET základní projekty jsou nakonfigurované tak, aby se svážely s náhodným portem HTTP mezi 5000–5300 a náhodným portem HTTPS mezi 7000–7300. Tato výchozí konfigurace je určena vygenerovaném Properties/launchSettings.json
souboru a lze ji přepsat. Pokud nejsou zadány žádné porty, Kestrel vytvoří vazby na http://localhost:5000
.
Zadejte adresy URL pomocí:
-
ASPNETCORE_URLS
proměnná prostředí. -
--urls
argument příkazového řádku. -
urls
konfigurační klíč hostitele. - UseUrls metoda rozšíření.
Hodnota zadaná pomocí těchto přístupů může být jeden nebo více koncových bodů HTTP a 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 naleznete v sekcích Serverové URL a Konfigurace přepsání.
Vytvoří se vývojový certifikát:
- Při instalaci sady .NET SDK.
- Nástroj dev-certs slouží k vytvoření certifikátu.
Vývojový certifikát je k dispozici pouze pro uživatele, který certifikát vygeneruje. Některé prohlížeče vyžadují udělení explicitního oprávnění k důvěryhodnosti místního vývojového certifikátu.
Šablony projektů konfigurují aplikace pro spouštění na HTTPS ve výchozím nastavení a zahrnují podporu přesměrování HTTPS a HSTS.
Zavolejte metody Listen nebo ListenUnixSocket na KestrelServerOptions pro konfiguraci předpon URL a portů pro Kestrel.
UseUrls
--urls
, argument příkazového řádku, urls
konfigurační klíč hostitele a ASPNETCORE_URLS
proměnná prostředí také fungují, ale mají omezení, která jsou uvedena dále v této části (pro konfiguraci koncového bodu HTTPS musí být dostupný výchozí certifikát).
KestrelServerOptions
konfigurace:
NastaveníVýchozíchHodnotProKoncovéBody
ConfigureEndpointDefaults(Action<ListenOptions>) určuje konfiguraci Action
, která se má spustit pro každý zadaný koncový bod. Volání ConfigureEndpointDefaults
několikrát nahradí předchozí Action
posledně zadaným Action
:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureEndpointDefaults(listenOptions =>
{
// ...
});
});
Poznámka:
Koncové body vytvořené voláním Listenpřed voláním ConfigureEndpointDefaults nebudou mít použité výchozí hodnoty.
Configure(IConfiguration)
Umožňuje Kestrel načítat koncové body z IConfiguration. Konfigurace musí být omezená na oddíl konfigurace 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.
Ve výchozím nastavení je konfigurace Kestrel načtena z oddílu Kestrel
a možnost znovunačtení změn je povolena.
{
"Kestrel": {
"Endpoints": {
"Http": {
"Url": "http://localhost:5000"
},
"Https": {
"Url": "https://localhost:5001"
}
}
}
}
Pokud je povolená konfigurace opětovného načítání a je signalována změna, je třeba provést následující kroky:
- Nová konfigurace se porovná se starou konfigurací, žádný koncový bod bez změn konfigurace se nezmění.
- Odebrané nebo upravené koncové body mají 5 sekund k dokončení požadavků na zpracování a vypnutí.
- Spustí se nové nebo upravené koncové body.
Klienti, kteří se připojují k upravenému koncovému bodu, můžou být při restartování koncového bodu odpojeni nebo odmítnuti.
KonfigurujHttpsDefaults
ConfigureHttpsDefaults(Action<HttpsConnectionAdapterOptions>) určuje konfiguraci Action
, která se má spustit pro každý koncový bod HTTPS. Volání ConfigureHttpsDefaults
několikrát nahradí předchozí Action
posledním specifikovaným Action
.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
// ...
});
});
Poznámka:
Koncové body vytvořené voláním Listenpřed voláním ConfigureHttpsDefaults nebudou mít použité výchozí hodnoty.
ListenOptions.UseHttps
Nakonfigurujte Kestrel k používání protokolu 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:
-
filename
je cesta a název souboru certifikátu vzhledem k adresáři, který obsahuje soubory obsahu aplikace. -
password
je heslo potřebné pro přístup k datům certifikátu X.509. -
configureOptions
jeAction
pro konfiguraciHttpsConnectionAdapterOptions
. Vrátí hodnotuListenOptions
. -
storeName
je úložiště certifikátů, ze kterého se má certifikát načíst. -
subject
je název subjektu certifikátu. -
allowInvalid
označuje, zda by se měly považovat za neplatné certifikáty, jako jsou certifikáty podepsané svým držitelem. -
location
je umístění úložiště, ze které se má certifikát načíst. -
serverCertificate
je certifikát X.509.
V produkčním prostředí musí být https explicitně nakonfigurované. Musí být poskytnut alespoň výchozí certifikát.
Pokud se certifikáty čtou z disku, na rozdíl od úložiště certifikátů systému Windows, musí mít adresář obsahující příslušná oprávnění, aby se zabránilo neoprávněnému přístupu.
Podporované konfigurace popsané dále:
- Bez konfigurace
- Nahrazení výchozího certifikátu z konfigurace
- Změna výchozích hodnot v kódu
Bez konfigurace
Kestrel naslouchá na http://localhost:5000
.
Nahrazení výchozího certifikátu z konfigurace
Pro nastavení aplikace HTTPS je k dispozici výchozí konfigurační schéma. Nakonfigurujte několik koncových bodů, včetně adres URL a certifikátů, které se mají použít, a to buď ze souboru na disku, nebo z úložiště certifikátů.
V následujícím appsettings.json
příkladu:
- Nastavte
AllowInvalid
natrue
povolení použití neplatných certifikátů (například certifikátů podepsaných svým držitelem). - Jakýkoli koncový bod HTTPS, který neurčuje certifikát (
HttpsDefaultCert
v následujícím příkladu), se vrátí k certifikátu definovanému v rámciCertificates:Default
nebo vývojovém certifikátu.
{
"Kestrel": {
"Endpoints": {
"Http": {
"Url": "http://localhost:5000"
},
"HttpsInlineCertFile": {
"Url": "https://localhost:5001",
"Certificate": {
"Path": "<path to .pfx file>",
"Password": "$CREDENTIAL_PLACEHOLDER$"
}
},
"HttpsInlineCertAndKeyFile": {
"Url": "https://localhost:5002",
"Certificate": {
"Path": "<path to .pem/.crt file>",
"KeyPath": "<path to .key file>",
"Password": "$CREDENTIAL_PLACEHOLDER$"
}
},
"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": "$CREDENTIAL_PLACEHOLDER$"
}
}
}
}
Varování
V předchozím příkladu jsou hesla certifikátů uložena ve formátu prostého textu .appsettings.json
Token $CREDENTIAL_PLACEHOLDER$
se používá jako zástupný symbol pro heslo každého certifikátu. Pokud chcete bezpečně ukládat hesla certifikátů ve vývojových prostředích, přečtěte si téma Ochrana tajných kódů při vývoji. Pokud chcete bezpečně ukládat hesla certifikátů v produkčních prostředích, přečtěte si o poskytovateli konfigurace služby Azure Key Vault. Tajné kódy pro vývoj by se neměly používat pro produkční ani testovací prostředí.
Poznámky ke schématu:
- Názvy koncových bodů jsou nezávislé na velikosti písmen. Například
HTTPS
aHttps
jsou ekvivalentní. - Parametr
Url
se vyžaduje pro každý koncový bod. Formát tohoto parametru je stejný jako konfigurační parametr nejvyšší úrovněUrls
s tím rozdílem, že je omezený na jednu hodnotu. - Tyto koncové body nahrazují ty, které jsou definované v konfiguraci nejvyšší úrovně
Urls
, než aby k nim něco přidávaly. Koncové body definované v kódu prostřednictvímListen
jsou kumulativní s koncovými body definovanými v konfigurační části. - Oddíl
Certificate
je nepovinný. Pokud není zadaný oddílCertificate
, použijí se výchozí hodnoty definované v oddíluCertificates:Default
. Pokud nejsou k dispozici žádné výchozí hodnoty, použije se vývojový certifikát. Pokud neexistují žádné výchozí hodnoty a není k dispozici vývojový certifikát, server vyvolá výjimku a nespustí se. - Tato
Certificate
část podporuje více zdrojů certifikátů. - Libovolný počet koncových bodů může být definován v konfiguraci , pokud nezpůsobí konflikty portů.
Zdroje certifikátů
Uzly certifikátů je možné nakonfigurovat tak, aby načítá certifikáty z řady zdrojů:
-
Path
aPassword
načíst soubory .pfx . -
Path
,KeyPath
aPassword
pro načtení .pem, .crt a .key souborů. -
Subject
aStore
z úložiště certifikátů načíst.
Certificates:Default
Například certifikát lze zadat takto:
"Default": {
"Subject": "<subject; required>",
"Store": "<cert store; required>",
"Location": "<location; defaults to CurrentUser>",
"AllowInvalid": "<true or false; defaults to false>"
}
Nabíječ konfigurace
Configure(IConfiguration) KestrelConfigurationLoader vrátí metoduEndpoint(String, Action<EndpointConfiguration>), která se dá použít k doplnění nakonfigurovaného nastavení koncového bodu:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
var kestrelSection = context.Configuration.GetSection("Kestrel");
serverOptions.Configure(kestrelSection)
.Endpoint("HTTPS", listenOptions =>
{
// ...
});
});
KestrelServerOptions.ConfigurationLoader
je možné přistupovat přímo k pokračování iterace na existujícím zavaděči, například na tom, který poskytuje WebApplicationBuilder.WebHost.
- Sekce konfigurace pro každý koncový bod je dostupná v možnostech metody
Endpoint
, aby bylo možné přečíst vlastní nastavení. - Více konfigurací může být načteno opětovným voláním Configure(IConfiguration) s jinou částí. Použije se pouze poslední konfigurace, pokud
Load
není explicitně volána u předchozích instancí. Metapackage nevoláLoad
, aby bylo možné nahradit jeho výchozí konfigurační oddíl. -
KestrelConfigurationLoader
zrcadlíListen
řadu rozhraní API zKestrelServerOptions
Endpoint
přetížení, takže je možné nakonfigurovat koncové body kódu a konfigurace na stejném místě. Tato přetížení nepoužívají názvy a využívají pouze výchozí nastavení z konfigurace.
Změna výchozích hodnot v kódu
ConfigureEndpointDefaults
a ConfigureHttpsDefaults
lze použít ke změně výchozích nastavení pro ListenOptions
a HttpsConnectionAdapterOptions
, včetně přepsání výchozího certifikátu zadaného v předchozím scénáři.
ConfigureEndpointDefaults
a ConfigureHttpsDefaults
by měly být zavolány před konfigurací všech koncových bodů.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.ConfigureEndpointDefaults(listenOptions =>
{
// ...
});
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
// ...
});
});
Konfigurace koncových bodů pomocí indikací názvu serveru
Indikaci názvu serveru (SNI) lze použít k hostování více domén na stejné IP adrese a portu. Aby rozhraní SNI fungovalo, 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á zařízený certifikát pro šifrovanou komunikaci se serverem během zabezpečené relace, která následuje za metodou handshake protokolu TLS.
SNI je možné nakonfigurovat dvěma způsoby:
- Vytvořte koncový bod v kódu a vyberte certifikát pomocí názvu hostitele se zpětným voláním ServerCertificateSelector .
- Nakonfigurujte mapování mezi názvy hostitelů a možnostmi HTTPS v konfiguraci. Například JSON v
appsettings.json
souboru.
SNI s ServerCertificateSelector
Kestrel podporuje SNI prostřednictvím zpětného volání ServerCertificateSelector
. Zpětné volání se vyvolá jednou za připojení, aby aplikace mohla zkontrolovat název hostitele a vybrat příslušný certifikát:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.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 is not null && certs.TryGetValue(name, out var cert))
{
return cert;
}
return exampleCert;
};
});
});
});
SNI s ServerOptionsSelectionCallback
Kestrel podporuje další dynamickou konfiguraci protokolu TLS prostřednictvím zpětného ServerOptionsSelectionCallback
volání. Zpětné volání se vyvolá jednou za 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.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.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 zpětného TlsHandshakeCallbackOptions.OnConnection
volání. Zpětné volání se vyvolá jednou za 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.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.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 objektem Sni
, který obsahuje mapování mezi názvy hostitelů a možnostmi HTTPS. Název hostitele připojení je spojen s možnostmi a ty jsou použity 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": "$CREDENTIAL_PLACEHOLDER$"
}
},
"*": {
// 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": "$CREDENTIAL_PLACEHOLDER$"
}
}
}
}
Upozornění
V předchozím příkladu jsou hesla certifikátů uložena ve formátu prostého textu .appsettings.json
Token $CREDENTIAL_PLACEHOLDER$
se používá jako zástupný symbol pro heslo každého certifikátu. Pokud chcete bezpečně ukládat hesla certifikátů ve vývojových prostředích, přečtěte si téma Ochrana tajných kódů při vývoji. Pokud chcete bezpečně ukládat hesla certifikátů v produkčních prostředích, přečtěte si o poskytovateli konfigurace služby Azure Key Vault. Tajné kódy pro vývoj by se neměly používat pro produkční ani testovací prostředí.
Možnosti HTTPS, které je možné přepsat pomocí SNI:
-
Certificate
nakonfiguruje zdroj certifikátu. -
Protocols
nakonfiguruje povolené protokoly HTTP. -
SslProtocols
nakonfiguruje povolené protokoly SSL. -
ClientCertificateMode
nakonfiguruje požadavky na klientský certifikát.
Název hostitele podporuje porovnávání zástupných znaků:
- Přesná shoda. Například
a.example.org
odpovídáa.example.org
. - Zástupný znak jako předpona. Pokud existuje více zástupných znaků, vybere se nejdelší vzor. Například
*.example.org
odpovídáb.example.org
ac.example.org
. - Plný zástupný symbol.
*
odpovídá všemu jinému, včetně klientů, kteří nepoužívají SNI a neposílají název hostitele.
Odpovídající konfigurace SNI se použije na koncový bod pro připojení a nahrazuje hodnoty na koncovém bodu. Pokud se připojení neshoduje s nakonfigurovaným názvem hostitele SNI, připojení se odmítne.
Požadavky na SNI
Všechny weby musí běžet ve 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 používané k šifrování a dešifrování provozu mezi dvěma protistranami, tradičně mezi klientem a serverem.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.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": "$CREDENTIAL_PLACEHOLDER$"
}
}
}
}
}
Varování
V předchozím příkladu je heslo certifikátu uloženo ve formátu prostého textu .appsettings.json
Token $CREDENTIAL_PLACEHOLDER$
se používá jako zástupný symbol pro heslo certifikátu. Pokud chcete bezpečně ukládat hesla certifikátů ve vývojových prostředích, přečtěte si téma Ochrana tajných kódů při vývoji. Pokud chcete bezpečně ukládat hesla certifikátů v produkčních prostředích, přečtěte si o poskytovateli konfigurace služby Azure Key Vault. Tajné kódy pro vývoj by se neměly používat pro produkční ani testovací prostředí.
Výchozí hodnota SslProtocols.None
, způsobí, že Kestrel použije výchozí hodnoty operačního systému k výběru nejlepšího protokolu. Pokud nemáte konkrétní důvod k výběru protokolu, použijte výchozí nastavení.
Klientské certifikáty
ClientCertificateMode
nakonfiguruje požadavky na klientský certifikát.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.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": "$CREDENTIAL_PLACEHOLDER$"
}
}
}
}
}
Varování
V předchozím příkladu je heslo certifikátu uloženo ve formátu prostého textu .appsettings.json
Token $CREDENTIAL_PLACEHOLDER$
se používá jako zástupný symbol pro heslo certifikátu. Pokud chcete bezpečně ukládat hesla certifikátů ve vývojových prostředích, přečtěte si téma Ochrana tajných kódů při vývoji. Pokud chcete bezpečně ukládat hesla certifikátů v produkčních prostředích, přečtěte si o poskytovateli konfigurace služby Azure Key Vault.
Výchozí hodnota je ClientCertificateMode.NoCertificate
, kde Kestrel nebude požadovat ani vyžadovat certifikát od klienta.
Další informace najdete v tématu Konfigurace ověřování certifikátů v ASP.NET Core.
Protokolování připojení
Volání UseConnectionLogging pro generování protokolů na úrovni ladění pro komunikaci na úrovni bajtů v připojení. Protokolování připojení je užitečné při řešení problémů při komunikaci nízké úrovně, například při šifrování TLS a za proxy servery. Pokud je UseConnectionLogging
umístěno před UseHttps
, zašifrovaný provoz se zaznamená. Pokud UseConnectionLogging
je umístěn po UseHttps
, dešifrovaný provoz se zaprotokoluje. Toto je integrovaný Middleware pro připojení.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.Listen(IPAddress.Any, 8000, listenOptions =>
{
listenOptions.UseConnectionLogging();
});
});
Vytvoření vazby k soketu TCP
Metoda Listen vytvoří vazbu na soket TCP a možnost lambda umožňuje konfiguraci certifikátu X.509:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.Listen(IPAddress.Loopback, 5000);
serverOptions.Listen(IPAddress.Loopback, 5001, listenOptions =>
{
listenOptions.UseHttps("testCert.pfx", "testPassword");
});
});
Příklad nakonfiguruje HTTPS pro koncový bod s ListenOptions. Ke konfiguraci dalších Kestrel nastavení pro konkrétní koncové body použijte stejné rozhraní API.
Na Windows lze vytvořit samo-podepsané certifikáty pomocí cmdletu PowerShellNew-SelfSignedCertificate
. Nepodporovaný příklad najdete na UpdateIISExpressSSLForChrome.ps1
.
V systémech macOS, Linux a Windows je možné certifikáty vytvářet pomocí OpenSSL.
Připojit na soket Unix
Naslouchejte na soketu Unix s lepším výkonem ListenUnixSocket pomocí Nginx, jak je znázorněno v tomto příkladu:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.ListenUnixSocket("/tmp/kestrel-test.sock");
});
- V konfiguračním souboru Nginx nastavte
server
>location
>proxy_pass
položku na .http://unix:/tmp/{KESTREL SOCKET}:/;
{KESTREL SOCKET}
je název zadaného soketu ListenUnixSocket (napříkladkestrel-test.sock
v předchozím příkladu). - Ujistěte se, že je soket zapisovatelný pomocí Nginx (například
chmod go+w /tmp/kestrel-test.sock
).
Port 0
Pokud je zadané číslo 0
portu, Kestrel dynamicky vytvoří vazbu k dostupnému portu. Následující příklad ukazuje, jak určit port Kestrel vázaný za běhu:
app.Run(async (context) =>
{
var serverAddressFeature = context.Features.Get<IServerAddressesFeature>();
if (serverAddressFeature is not null)
{
var listenAddresses = string.Join(", ", serverAddressFeature.Addresses);
// ...
}
});
Dynamická vazba portu není v některých situacích dostupná:
ListenLocalhost
- Spojení HTTP/1.1 nebo HTTP/2 založených na TCP a HTTP/3 založeného na QUIC.
Omezení
Nakonfigurujte koncové body pomocí následujících přístupů:
- UseUrls
-
--urls
Argument příkazového řádku -
urls
konfigurační klíč hostitele -
ASPNETCORE_URLS
proměnná prostředí
Tyto metody jsou užitečné pro práci s kódem s jinými servery než Kestrel. Mějte však na paměti následující omezení:
- Https se s těmito přístupy nedá použít, pokud není v konfiguraci koncového bodu HTTPS k dispozici výchozí certifikát (například použití
KestrelServerOptions
konfigurace nebo konfiguračního souboru, jak je znázorněno výše v tomto článku). -
Listen
UseUrls
Když se současně používají oba přístupy,Listen
koncové body přepíšíUseUrls
koncové 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ď Listen
nebo UseUrls
. Další informace najdete v tématu ASP.NET Core Module.
ListenOptions.Protocols
Vlastnost Protocols
vytvoří protokoly HTTP (HttpProtocols
) povolené v koncovém bodu připojení nebo pro server. Přiřaďte hodnotu vlastnosti Protocols
z výčtu HttpProtocols
.
HttpProtocols výčtová hodnota |
Povolený protokol připojení |
---|---|
Http1 |
Pouze HTTP/1.1. Lze použít s protokolem TLS nebo bez protokolu TLS. |
Http2 |
Pouze HTTP/2. Lze použít bez protokolu TLS pouze v případě, že klient podporuje předchozí režim znalostí. |
Http3 |
Pouze HTTP/3. Vyžaduje protokol TLS. Klient možná bude muset být nakonfigurovaný tak, aby používal pouze HTTP/3. |
Http1AndHttp2 |
HTTP/1.1 a HTTP/2. Protokol HTTP/2 vyžaduje, aby klient vybral HTTP/2 v TLS Application-Layer Protocol Negotiation (ALPN) handshake; jinak se připojení automaticky nastaví na HTTP/1.1. |
Http1AndHttp2AndHttp3 |
HTTP/1.1, HTTP/2 a HTTP/3. První požadavek klienta obvykle používá http/1.1 nebo HTTP/2 a alt-svc hlavička odpovědi vyzve klienta k upgradu na HTTP/3. PROTOKOL HTTP/2 a HTTP/3 vyžaduje protokol TLS; jinak se ve výchozím nastavení připojení nastaví na HTTP/1.1. |
Výchozí ListenOptions.Protocols
hodnota každého koncového bodu je HttpProtocols.Http1AndHttp2
.
Omezení protokolu TLS pro HTTP/2:
- TLS verze 1.2 nebo novější
- Opětovné vyjednávání zakázáno
- Komprese je zakázaná
- Minimální dočasné velikosti výměny klíčů:
- Elliptic curve Diffie-Hellman (ECDHE) [RFC4492]: minimálně 224 bitů
- Konečné pole Diffie-Hellman (DHE) [
TLS12
]: minimálně 2048 bitů
- Šifrovací sada není zakázaná.
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
[TLS-ECDHE
] s eliptickou křivkou P-256 [FIPS186
] je ve výchozím nastavení podporována.
Následující příklad umožňuje připojení HTTP/1.1 a HTTP/2 na portu 8000. Připojení jsou zabezpečená protokolem TLS se zadaným certifikátem:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.Listen(IPAddress.Any, 8000, listenOptions =>
{
listenOptions.UseHttps("testCert.pfx", "testPassword");
listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
});
});
Na Linuxu lze CipherSuitesPolicy použít k filtrování handshake protokolů TLS na základě každého spojení.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, 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,
// ...
});
};
});
});
Připojovací middleware
Middleware pro vlastní připojení může v případě potřeby filtrovat handshaky TLS na úrovni jednotlivých připojení pro konkrétní šifry.
Následující příklad vyvolá NotSupportedException pro jakýkoli algoritmus šifrování, který aplikace nepodporuje. Případně definujte ITlsHandshakeFeature.CipherAlgorithm a porovnejte s seznamem přijatelných šifrovacích sad.
U šifrovacího CipherAlgorithmType.Null algoritmu se nepoužívá žádné šifrování.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, 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
Ve výchozím nastavení se konfigurace Kestrel načte z oddílu Kestrel
. Následující appsettings.json
příklad vytvoří http/1.1 jako výchozí připojovací protokol 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 specifikované v kódu mají přednost před hodnotami nastavenými konfigurací.
Předpony adres URL
Při použití argumentu UseUrls
příkazového řádku, konfiguračního klíče urls
hostitele nebo proměnné ASPNETCORE_URLS
prostředí mohou být předpony adres URL v libovolném z následujících formátů.
Platné jsou pouze předpony adresy URL HTTP.
Kestrel nepodporuje HTTPS při konfiguraci vazeb adres URL pomocí UseUrls
.
Adresa IPv4 s číslem portu
http://65.55.39.10:80/
0.0.0.0
je zvláštní případ, který se sváže se všemi adresami IPv4.Adresa IPv6 s číslem portu
http://[0:0:0:0:0:ffff:4137:270a]:80/
[::]
je ekvivalentem IPv6 protokolu IPv40.0.0.0
.Název hostitele s číslem portu
http://contoso.com:80/ http://*:80/
Názvy hostitelů,
*
a+
, nejsou zvláštní. Nic, co není rozpoznáno jako platná IP adresa, se váže na všechny IP adresy IPv4 a IPv6 nebo nalocalhost
. Pokud chcete svázat různé názvy hostitelů s různými aplikacemi ASP.NET Core na stejném portu, použijte HTTP.sys nebo reverzní proxy server. Příklady reverzního proxy serveru zahrnují službu IIS, Nginx nebo Apache.Upozornění
Hostování v konfiguraci reverzního proxy serveru vyžaduje filtrování hostitele.
Název hostitele
localhost
s číslem portu nebo IP adresou pro zpětnou smyčku s číslem portuhttp://localhost:5000/ http://127.0.0.1:5000/ http://[::1]:5000/
Když je zadán
localhost
, Kestrel se pokusí navázat spojení na rozhraní zpětné smyčky IPv4 i IPv6. Pokud požadovaný port používá jiná služba na kterémkoli rozhraní zpětné smyčky, Kestrel se nespustí. Pokud je některé z rozhraní zpětné smyčky z jakéhokoli jiného důvodu nedostupné (nejčastěji kvůli tomu, že se nepodporuje protokol IPv6), Kestrel zaznamená upozornění.
ASP.NET základní projekty jsou nakonfigurované tak, aby se svážely s náhodným portem HTTP mezi 5000–5300 a náhodným portem HTTPS mezi 7000–7300. Tato výchozí konfigurace je určena vygenerovaném Properties/launchSettings.json
souboru a lze ji přepsat. Pokud nejsou zadány žádné porty, Kestrel vytvoří vazby na:
http://localhost:5000
-
https://localhost:5001
(pokud je k dispozici místní vývojový certifikát)
Zadejte adresy URL pomocí:
-
ASPNETCORE_URLS
proměnná prostředí. -
--urls
argument příkazového řádku. -
urls
konfigurační klíč hostitele. - UseUrls rozšiřující metoda.
Hodnota zadaná pomocí těchto přístupů může být jeden nebo více koncových bodů HTTP a 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"
).
cs-CZ: Další informace o těchto přístupech naleznete v částech Serverové URL a Konfigurace přepsání.
Vytvoří se vývojový certifikát:
- Při instalaci sady .NET SDK.
- Nástroj dev-certs slouží k vytvoření certifikátu.
Vývojový certifikát je k dispozici pouze pro uživatele, který certifikát vygeneruje. Některé prohlížeče vyžadují udělení explicitního oprávnění k důvěryhodnosti místního vývojového certifikátu.
Šablony projektů konfigurují aplikace pro spouštění na HTTPS ve výchozím nastavení a zahrnují podporu přesměrování HTTPS a HSTS.
Zavolejte metody Listen nebo ListenUnixSocket na KestrelServerOptions pro konfigurování předpon adres URL a portů pro Kestrel.
UseUrls
--urls
, argument příkazového řádku, urls
konfigurační klíč hostitele a ASPNETCORE_URLS
proměnná prostředí také fungují, ale mají omezení, která jsou uvedena dále v této části (pro konfiguraci koncového bodu HTTPS musí být dostupný výchozí certifikát).
KestrelServerOptions
konfigurace:
Konfigurovat Výchozí Nastavení Koncového Bodu
ConfigureEndpointDefaults(Action<ListenOptions>) určuje konfiguraci Action
, která se má spustit pro každý zadaný koncový bod. Volání ConfigureEndpointDefaults
několikrát nahradí předchozí Action
posledním zadaným Action
.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureEndpointDefaults(listenOptions =>
{
// ...
});
});
Poznámka:
Koncové body vytvořené voláním Listenpřed voláním ConfigureEndpointDefaults nebudou mít použité výchozí hodnoty.
Configure(IConfiguration)
Kestrel Umožňuje načíst koncové body z objektu IConfiguration. Konfigurace musí být vymezena na oddíl konfigurace 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.
Ve výchozím nastavení se konfigurace načte ze sekce Kestrel a je povoleno znovunačtení změn:
{
"Kestrel": {
"Endpoints": {
"Http": {
"Url": "http://localhost:5000"
},
"Https": {
"Url": "https://localhost:5001"
}
}
}
}
Pokud je povolená konfigurace opětovného načítání a je signalována změna, je třeba provést následující kroky:
- Nová konfigurace se porovná se starou konfigurací, žádný koncový bod bez změn konfigurace se nezmění.
- Odebrané nebo upravené koncové body mají 5 sekund k dokončení požadavků na zpracování a vypnutí.
- Spustí se nové nebo upravené koncové body.
Klienti, kteří se připojují k upravenému koncovému bodu, můžou být při restartování koncového bodu odpojeni nebo odmítnuti.
Konfigurace HTTPS Defaults
ConfigureHttpsDefaults(Action<HttpsConnectionAdapterOptions>) určuje konfiguraci Action
, která se má spustit pro každý koncový bod HTTPS. Opakované volání ConfigureHttpsDefaults
nahradí předchozí Action
posledním zadaným Action
.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
// ...
});
});
Poznámka:
Koncové body vytvořené voláním Listenpřed voláním ConfigureHttpsDefaults nebudou mít použité výchozí hodnoty.
ListenOptions.UseHttps
Nakonfigurujte Kestrel pro používání 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:
-
filename
je cesta a název souboru certifikátu vzhledem k adresáři, který obsahuje soubory obsahu aplikace. -
password
je heslo potřebné pro přístup k datům certifikátu X.509. -
configureOptions
jeAction
pro konfiguraciHttpsConnectionAdapterOptions
. Vrátí hodnotuListenOptions
. -
storeName
je úložiště certifikátů, ze kterého se má certifikát načíst. -
subject
je název subjektu certifikátu. -
allowInvalid
označuje, zda by se měly považovat za neplatné certifikáty, jako jsou certifikáty podepsané svým držitelem. -
location
je umístění úložiště, ze které se má certifikát načíst. -
serverCertificate
je certifikát X.509.
V produkčním prostředí musí být https explicitně nakonfigurované. Musí se zadat alespoň výchozí certifikát.
Podporované konfigurace popsané dále:
- Bez konfigurace
- Nahrazení výchozího certifikátu z konfigurace
- Změna výchozích hodnot v kódu
Bez 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 konfiguraci nastavení aplikace HTTPS je k dispozici výchozí schéma pro Kestrel. Nakonfigurujte několik koncových bodů, včetně adres URL a certifikátů, které se mají použít, a to buď ze souboru na disku, nebo z úložiště certifikátů.
V následujícím appsettings.json
příkladu:
- Nastavte
AllowInvalid
natrue
povolení použití neplatných certifikátů (například certifikátů podepsaných svým držitelem). - Jakýkoli koncový bod HTTPS, který neurčuje certifikát (
HttpsDefaultCert
v následujícím příkladu), se vrátí k certifikátu definovanému v rámciCertificates:Default
nebo vývojovém certifikátu.
{
"Kestrel": {
"Endpoints": {
"Http": {
"Url": "http://localhost:5000"
},
"HttpsInlineCertFile": {
"Url": "https://localhost:5001",
"Certificate": {
"Path": "<path to .pfx file>",
"Password": "$CREDENTIAL_PLACEHOLDER$"
}
},
"HttpsInlineCertAndKeyFile": {
"Url": "https://localhost:5002",
"Certificate": {
"Path": "<path to .pem/.crt file>",
"KeyPath": "<path to .key file>",
"Password": "$CREDENTIAL_PLACEHOLDER$"
}
},
"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": "$CREDENTIAL_PLACEHOLDER$"
}
}
}
}
Varování
V předchozím příkladu jsou hesla certifikátů uložena ve formátu prostého textu .appsettings.json
Token $CREDENTIAL_PLACEHOLDER$
se používá jako zástupný symbol pro heslo každého certifikátu. Pokud chcete bezpečně ukládat hesla certifikátů ve vývojových prostředích, přečtěte si téma Ochrana tajných kódů při vývoji. Pokud chcete bezpečně ukládat hesla certifikátů v produkčních prostředích, přečtěte si o poskytovateli konfigurace služby Azure Key Vault. Tajné kódy pro vývoj by se neměly používat pro produkční ani testovací prostředí.
Poznámky ke schématu:
- Názvy koncových bodů nejsou citlivé na velikost písmen. Například
HTTPS
aHttps
jsou ekvivalentní. - Parametr
Url
se vyžaduje pro každý koncový bod. Formát tohoto parametru je stejný jako konfigurační parametr nejvyšší úrovněUrls
s tím rozdílem, že je omezený na jednu hodnotu. - Tyto koncové body nahrazují ty, které jsou definovány v konfiguraci nejvyšší úrovně
Urls
, místo aby k nim přidávaly. Koncové body definované v kódu prostřednictvímListen
jsou kumulativní s koncovými body definovanými v konfigurační části. - Oddíl
Certificate
je nepovinný. Pokud není specifikovánCertificate
oddíl, použijí se výchozí hodnoty definované vCertificates:Default
. Pokud nejsou k dispozici žádné výchozí hodnoty, použije se vývojový certifikát. Pokud neexistují žádné výchozí hodnoty a není k dispozici vývojový certifikát, server vyvolá výjimku a nespustí se. - Tato
Certificate
část podporuje více zdrojů certifikátů. - Libovolný počet koncových bodů může být definován v konfiguraci , pokud nezpůsobí konflikty portů.
Zdroje certifikátů
Uzly certifikátů je možné nakonfigurovat tak, aby načítá certifikáty z řady zdrojů:
-
Path
aPassword
k načtení .pfx souborů. -
Path
,KeyPath
aPassword
pro načtení souborů .pem, .crt a .key. -
Subject
aStore
načíst z úložiště certifikátů.
Certificates:Default
Například certifikát lze zadat takto:
"Default": {
"Subject": "<subject; required>",
"Store": "<cert store; required>",
"Location": "<location; defaults to CurrentUser>",
"AllowInvalid": "<true or false; defaults to false>"
}
Nahrávač konfigurace
Configure(IConfiguration) KestrelConfigurationLoader vrátí metoduEndpoint(String, Action<EndpointConfiguration>), která se dá použít k doplnění nakonfigurovaného nastavení koncového bodu:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
var kestrelSection = context.Configuration.GetSection("Kestrel");
serverOptions.Configure(kestrelSection)
.Endpoint("HTTPS", listenOptions =>
{
// ...
});
});
KestrelServerOptions.ConfigurationLoader
lze přímo přistoupit ke stávajícímu zavaděči pro pokračování iterace, jako je například ten, který poskytuje WebApplicationBuilder.WebHost.
- Konfigurační sekce pro každý koncový bod je dostupná v možnostech v
Endpoint
metodě pro čtení vlastních nastavení. - Více konfigurací může být načteno opětovným voláním Configure(IConfiguration) s jinou sekcí. Použije se pouze poslední konfigurace, pokud
Load
není explicitně volána u předchozích instancí. Metabalík nevoláLoad
, aby mohl být nahrazen jeho výchozí konfigurační oddíl. -
KestrelConfigurationLoader
zrcadlíListen
řadu rozhraní API zKestrelServerOptions
Endpoint
přetížení, takže je možné nakonfigurovat koncové body kódu a konfigurace na stejném místě. Tato přetížení nepoužívají názvy a využívají pouze výchozí nastavení z konfigurace.
Změna výchozích hodnot v kódu
ConfigureEndpointDefaults
a ConfigureHttpsDefaults
lze použít ke změně výchozího nastavení pro ListenOptions
a HttpsConnectionAdapterOptions
, včetně přepsání výchozího certifikátu zadaného v předchozím scénáři.
ConfigureEndpointDefaults
a ConfigureHttpsDefaults
volejte před konfigurací jakýchkoli koncových bodů.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.ConfigureEndpointDefaults(listenOptions =>
{
// ...
});
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
// ...
});
});
Konfigurace koncových bodů pomocí indikací názvu serveru
Indikaci názvu serveru (SNI) lze použít k hostování více domén na stejné IP adrese a portu. Aby rozhraní SNI fungovalo, 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á zařízený certifikát pro šifrovanou komunikaci se serverem během zabezpečené relace, která následuje za metodou handshake protokolu TLS.
SNI je možné nakonfigurovat dvěma způsoby:
- Vytvořte koncový bod v kódu a vyberte certifikát pomocí názvu hostitele se zpětným voláním ServerCertificateSelector .
- Nakonfigurujte mapování mezi názvy hostitelů a možnostmi HTTPS v konfiguraci. Například JSON v
appsettings.json
souboru.
SNI s ServerCertificateSelector
Kestrel podporuje SNI pomocí zpětného volání ServerCertificateSelector
. Zpětné volání se vyvolá jednou za připojení, aby aplikace mohla zkontrolovat název hostitele a vybrat příslušný certifikát:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.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 is not null && certs.TryGetValue(name, out var cert))
{
return cert;
}
return exampleCert;
};
});
});
});
SNI s ServerOptionsSelectionCallback
Kestrel podporuje další dynamickou konfiguraci protokolu TLS prostřednictvím zpětného ServerOptionsSelectionCallback
volání. Zpětné volání se vyvolá jednou za 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.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.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 zpětného TlsHandshakeCallbackOptions.OnConnection
volání. Zpětné volání se vyvolá jednou za 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.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.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 objektem Sni
, který obsahuje mapování mezi názvy hostitelů a možnostmi HTTPS. Název hostitele připojení je porovnán s možnostmi a ty jsou použity pro dané připojení.
Následující konfigurace přidá koncový bod pojmenovaný MySniEndpoint
, který využívá SNI pro výběr možností HTTPS podle 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": "$CREDENTIAL_PLACEHOLDER$"
}
},
"*": {
// 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": "$CREDENTIAL_PLACEHOLDER$"
}
}
}
}
Varování
V předchozím příkladu jsou hesla certifikátů uložena ve formátu prostého textu .appsettings.json
Token $CREDENTIAL_PLACEHOLDER$
se používá jako zástupný symbol pro heslo každého certifikátu. Pokud chcete bezpečně ukládat hesla certifikátů ve vývojových prostředích, přečtěte si téma Ochrana tajných kódů při vývoji. Pokud chcete bezpečně ukládat hesla certifikátů v produkčních prostředích, přečtěte si o poskytovateli konfigurace služby Azure Key Vault. Tajné kódy pro vývoj by se neměly používat pro produkční ani testovací prostředí.
Možnosti HTTPS, které je možné přepsat pomocí SNI:
-
Certificate
nakonfiguruje zdroj certifikátu. -
Protocols
nakonfiguruje povolené protokoly HTTP. -
SslProtocols
nakonfiguruje povolené protokoly SSL. -
ClientCertificateMode
nakonfiguruje požadavky na klientský certifikát.
Název hostitele podporuje porovnávání zástupných znaků:
- Přesná shoda. Například
a.example.org
odpovídáa.example.org
. - Předpona zástupných znaků. Pokud existuje více shod se zástupnými znaky, vybere se nejdelší vzor. Například
*.example.org
odpovídáb.example.org
ac.example.org
. - Univerzální zástupný znak.
*
odpovídá všemu jinému, včetně klientů, kteří nepoužívají SNI a neposílají název hostitele.
Odpovídající konfigurace SNI se použije na koncovém bodu pro připojení a přepíše hodnoty koncového bodu. Pokud se připojení neshoduje s nakonfigurovaným názvem hostitele SNI, připojení se odmítne.
Požadavky na SNI
Všechny weby musí běžet ve 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 pro šifrování a dešifrování provozu mezi dvěma komunikujícími stranami, typicky klientem a serverem.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.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": "$CREDENTIAL_PLACEHOLDER$"
}
}
}
}
}
Varování
V předchozím příkladu je heslo certifikátu uloženo ve formátu prostého textu .appsettings.json
Token $CREDENTIAL_PLACEHOLDER$
se používá jako zástupný symbol pro heslo certifikátu. Pokud chcete bezpečně ukládat hesla certifikátů ve vývojových prostředích, přečtěte si téma Ochrana tajných kódů při vývoji. Pokud chcete bezpečně ukládat hesla certifikátů v produkčních prostředích, přečtěte si o poskytovateli konfigurace služby Azure Key Vault. Tajné kódy pro vývoj by se neměly používat pro produkční ani testovací prostředí.
Výchozí hodnota SslProtocols.None
způsobí, že Kestrel použije výchozí nastavení operačního systému pro výběr nejlepšího protokolu. Pokud nemáte konkrétní důvod k výběru protokolu, použijte výchozí nastavení.
Klientské certifikáty
ClientCertificateMode
nakonfiguruje požadavky na klientský certifikát.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.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": "$CREDENTIAL_PLACEHOLDER$"
}
}
}
}
}
Varování
V předchozím příkladu je heslo certifikátu uloženo ve formátu prostého textu .appsettings.json
Token $CREDENTIAL_PLACEHOLDER$
se používá jako zástupný symbol pro heslo certifikátu. Pokud chcete bezpečně ukládat hesla certifikátů ve vývojových prostředích, přečtěte si téma Ochrana tajných kódů při vývoji. Pokud chcete bezpečně ukládat hesla certifikátů v produkčních prostředích, přečtěte si o poskytovateli konfigurace služby Azure Key Vault.
Výchozí hodnota je ClientCertificateMode.NoCertificate
, což znamená, že Kestrel nebude požadovat ani vyžadovat certifikát od klienta.
Další informace najdete v tématu Konfigurace ověřování certifikátů v ASP.NET Core.
Protokolování připojení
Volání UseConnectionLogging pro generování protokolů na úrovni ladění pro komunikaci na úrovni bajtů v připojení. Protokolování připojení je užitečné při řešení problémů při komunikaci nízké úrovně, například při šifrování TLS a za proxy servery. Pokud je UseConnectionLogging
umístěno před UseHttps
, zašifrovaný provoz se zaprotokoluje. Pokud UseConnectionLogging
je umístěn po UseHttps
, dešifrovaný provoz se zaprotokoluje. Toto je integrovaný Connection Middleware.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.Listen(IPAddress.Any, 8000, listenOptions =>
{
listenOptions.UseConnectionLogging();
});
});
Připojit se k soketu TCP
Metoda Listen vytvoří vazbu na soket TCP a možnost lambda umožňuje konfiguraci certifikátu X.509:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.Listen(IPAddress.Loopback, 5000);
serverOptions.Listen(IPAddress.Loopback, 5001, listenOptions =>
{
listenOptions.UseHttps("testCert.pfx", "testPassword");
});
});
Příklad nakonfiguruje HTTPS pro koncový bod s ListenOptions. Ke konfiguraci dalších Kestrel nastavení pro konkrétní koncové body použijte stejné rozhraní API.
Ve Windows lze samo podepsané certifikáty vytvořit pomocí rutiny PowerShell. Nepodporovaný příklad, viz UpdateIISExpressSSLForChrome.ps1
.
V systémech macOS, Linux a Windows je možné certifikáty vytvářet pomocí OpenSSL.
Připojit se k unixovému socketu
Naslouchejte na socktu Unix s ListenUnixSocket pro lepší výkon s Nginx, jak ukazuje tento příklad:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.ListenUnixSocket("/tmp/kestrel-test.sock");
});
- V konfiguračním souboru Nginx nastavte
server
>location
>proxy_pass
položku na .http://unix:/tmp/{KESTREL SOCKET}:/;
{KESTREL SOCKET}
je název zadaného soketu ListenUnixSocket (napříkladkestrel-test.sock
v předchozím příkladu). - Ujistěte se, že je soket zapisovatelný pomocí Nginx (například
chmod go+w /tmp/kestrel-test.sock
).
Port 0
Pokud je zadané číslo 0
portu, Kestrel dynamicky vytvoří vazbu k dostupnému portu. Následující příklad ukazuje, jak určit port Kestrel vázaný za běhu:
app.Run(async (context) =>
{
var serverAddressFeature = context.Features.Get<IServerAddressesFeature>();
if (serverAddressFeature is not null)
{
var listenAddresses = string.Join(", ", serverAddressFeature.Addresses);
// ...
}
});
Omezení
Nakonfigurujte koncové body pomocí následujících přístupů:
- UseUrls
-
--urls
Argument příkazového řádku -
urls
konfigurační klíč hostitele -
ASPNETCORE_URLS
proměnná prostředí
Tyto metody jsou užitečné pro práci s kódem s jinými servery než Kestrel. Mějte však na paměti následující omezení:
- Https se s těmito přístupy nedá použít, pokud není v konfiguraci koncového bodu HTTPS k dispozici výchozí certifikát (například použití
KestrelServerOptions
konfigurace nebo konfiguračního souboru, jak je znázorněno výše v tomto článku). - Když se používají oba přístupy současně, koncové body
Listen
přepíší koncové bodyUseUrls
.
Konfigurace koncového bodu služby IIS
Při použití služby IIS jsou vazby adresy URL nastaveny pro přepsání vazeb služby IIS buď Listen
nebo UseUrls
. Další informace najdete v tématu ASP.NET Core Module.
ListenOptions.Protocols
Vlastnost Protocols
vytvoří protokoly HTTP (HttpProtocols
) povolené v koncovém bodu připojení nebo pro server. Přiřaďte hodnotu vlastnosti Protocols
z výčtu HttpProtocols
.
HttpProtocols enum value |
Povolený protokol připojení |
---|---|
Http1 |
Pouze HTTP/1.1. Lze použít s protokolem TLS nebo bez protokolu TLS. |
Http2 |
Pouze HTTP/2. Lze použít bez protokolu TLS pouze v případě, že klient podporuje předchozí režim znalostí. |
Http1AndHttp2 |
HTTP/1.1 a HTTP/2. HTTP/2 vyžaduje, aby klient vybral HTTP/2 v TLS Application-Layer Protocol Negotiation (ALPN) handshake; jinak se připojení ve výchozím nastavení přepne na HTTP/1.1. |
Výchozí ListenOptions.Protocols
hodnota každého koncového bodu je HttpProtocols.Http1AndHttp2
.
Omezení protokolu TLS pro HTTP/2:
- TLS verze 1.2 nebo novější
- Opětovné vyjednávání zakázáno
- Komprese je zakázaná
- Minimální dočasné velikosti výměny klíčů:
- Elliptic curve Diffie-Hellman (ECDHE) [RFC4492]: minimálně 224 bitů
- Konečné pole Diffie-Hellman (DHE) [
TLS12
]: minimálně 2048 bitů
- Šifrovací sada není zakázaná.
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
[TLS-ECDHE
] s eliptickou křivkou P-256 [FIPS186
] je ve výchozím nastavení podporována.
Následující příklad umožňuje připojení HTTP/1.1 a HTTP/2 na portu 8000. Připojení jsou zabezpečená protokolem TLS se zadaným certifikátem:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.Listen(IPAddress.Any, 8000, listenOptions =>
{
listenOptions.UseHttps("testCert.pfx", "testPassword");
listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
});
});
Na Linuxu lze CipherSuitesPolicy použít k filtrování handshake protokolu TLS pro každé připojení:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, 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,
// ...
});
};
});
});
Připojovací middleware
Vlastní middleware pro připojení může v případě potřeby filtrovat handshake protokolu TLS pro jednotlivá připojení s ohledem na konkrétní šifry.
Následující příklad vyvolá NotSupportedException pro jakýkoli algoritmus šifry, který aplikace nepodporuje. Případně definujte ITlsHandshakeFeature.CipherAlgorithm a porovnejte jej se seznamem přijatelných šifrovacích sad.
U šifrovacího CipherAlgorithmType.Null algoritmu se nepoužívá žádné šifrování.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, 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
Ve výchozím nastavení se konfigurace Kestrel načte z oddílu Kestrel
. Následující appsettings.json
příklad vytvoří http/1.1 jako výchozí připojovací protokol 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 určené v kódu přepisují hodnoty nastavené konfigurací.
Předpony adres URL
Při použití argumentu UseUrls
příkazového řádku, konfiguračního klíče urls
hostitele nebo proměnné ASPNETCORE_URLS
prostředí můžou být předpony adresy URL v libovolném z následujících formátů.
Platné jsou pouze předpony adresy URL HTTP.
Kestrel nepodporuje HTTPS při konfiguraci vazeb adres URL pomocí UseUrls
.
Adresa IPv4 s číslem portu
http://65.55.39.10:80/
0.0.0.0
je zvláštní případ, který se sváže se všemi adresami IPv4.Adresa IPv6 s číslem portu
http://[0:0:0:0:0:ffff:4137:270a]:80/
[::]
je ekvivalentem IPv6 protokolu IPv40.0.0.0
.Název hostitele s číslem portu
http://contoso.com:80/ http://*:80/
Jména hostitelů
*
a+
nejsou zvláštní. Cokoliv, co není rozpoznáno jako platná IP adresa, nebolocalhost
, se váže na všechny IP adresy IPv4 a IPv6. Pokud chcete svázat různé názvy hostitelů s různými aplikacemi ASP.NET Core na stejném portu, použijte HTTP.sys nebo reverzní proxy server. Příklady reverzního proxy serveru zahrnují službu IIS, Nginx nebo Apache.Upozornění
Hostování v konfiguraci reverzního proxy serveru vyžaduje filtrování hostitele.
Název hostitele
localhost
s číslem portu nebo IP adresa loopback s číslem portuhttp://localhost:5000/ http://127.0.0.1:5000/ http://[::1]:5000/
localhost
je zadáno, Kestrel se pokusí připojit k smyčkovým rozhraním IPv4 i IPv6. Pokud požadovaný port používá jiná služba v některém rozhraní zpětné smyčky, Kestrel se nepodaří spustit. Pokud je některé z rozhraní zpětné smyčky z jakéhokoli jiného důvodu nedostupné (nejčastěji kvůli tomu, že se nepodporuje protokol IPv6), Kestrel zaznamená upozornění.
Ve výchozím nastavení ASP.NET Core vytvoří vazbu na:
http://localhost:5000
-
https://localhost:5001
(pokud je k dispozici místní vývojový certifikát)
Zadejte adresy URL pomocí:
-
ASPNETCORE_URLS
proměnná prostředí. -
--urls
argument příkazového řádku. -
urls
konfigurační klíč hostitele. - UseUrls rozšiřující metoda.
Hodnota zadaná pomocí těchto přístupů může být jeden nebo více koncových bodů HTTP a 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 části URL serveru a přepsání konfigurace.
Vytvoří se vývojový certifikát:
- Při instalaci sady .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ěryhodnosti místního vývojového certifikátu.
Šablony projektů konfigurují aplikace pro spouštění na HTTPS ve výchozím nastavení a zahrnují podporu přesměrování HTTPS a HSTS.
Provolejte metody Listen nebo ListenUnixSocket na KestrelServerOptions a nakonfigurujte tak předpony URL a porty pro Kestrel.
UseUrls
--urls
, argument příkazového řádku, urls
konfigurační klíč hostitele a ASPNETCORE_URLS
proměnná prostředí také fungují, ale mají omezení, která jsou uvedena dále v této části (pro konfiguraci koncového bodu HTTPS musí být dostupný výchozí certifikát).
KestrelServerOptions
konfigurace:
Nakonfigurujte výchozí nastavení koncových bodů
ConfigureEndpointDefaults(Action<ListenOptions>) určuje konfiguraci Action
, která se má spustit pro každý zadaný koncový bod. Opakované volání ConfigureEndpointDefaults
nahradí předchozí Action
posledním zadaným Action
.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureEndpointDefaults(listenOptions =>
{
// Configure endpoint defaults
});
});
Poznámka:
Koncové body vytvořené voláním Listenpřed voláním ConfigureEndpointDefaults nebudou mít použité výchozí hodnoty.
Konfigurovat(IConfiguration)
Umožňuje Kestrel načítat koncové body z IConfiguration. Konfigurace musí být omezena na oddíl konfigurace pro Kestrel.
Přetížení Configure(IConfiguration, bool)
lze použít pro umožnění opětovného načítání koncových bodů, pokud se změní zdroj konfigurace.
IHostBuilder.ConfigureWebHostDefaults
automaticky spouští Configure(context.Configuration.GetSection("Kestrel"), reloadOnChange: true)
pro načtení Kestrel konfigurace a umožnění opětovného načítání.
{
"Kestrel": {
"Endpoints": {
"Http": {
"Url": "http://localhost:5000"
},
"Https": {
"Url": "https://localhost:5001"
}
}
}
}
Pokud je povolená konfigurace opětovného načítání a je signalována změna, je třeba provést následující kroky:
- Nová konfigurace se porovná se starou konfigurací, žádný koncový bod bez změn konfigurace se nezmění.
- Odebrané nebo upravené koncové body mají 5 sekund k dokončení požadavků na zpracování a vypnutí.
- Spustí se nové nebo upravené koncové body.
Klienti, kteří se připojují k upravenému koncovému bodu, můžou být při restartování koncového bodu odpojeni nebo odmítnuti.
KonfiguraceHttpsDefaults
ConfigureHttpsDefaults(Action<HttpsConnectionAdapterOptions>) určuje konfiguraci Action
, která se má spustit pro každý koncový bod HTTPS. Volání ConfigureHttpsDefaults
několikrát nahradí předchozí Action
posledním zadaným Action
.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
// certificate is an X509Certificate2
listenOptions.ServerCertificate = certificate;
});
});
Poznámka:
Koncové body vytvořené voláním Listenpřed voláním ConfigureHttpsDefaults nebudou mít použité výchozí hodnoty.
ListenOptions.UseHttps
Nakonfigurujte Kestrel, aby používalo 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:
-
filename
je cesta a název souboru certifikátu vzhledem k adresáři, který obsahuje soubory obsahu aplikace. -
password
je heslo potřebné pro přístup k datům certifikátu X.509. -
configureOptions
jeAction
pro konfiguraciHttpsConnectionAdapterOptions
. Vrátí hodnotuListenOptions
. -
storeName
je úložiště certifikátů, ze kterého se má certifikát načíst. -
subject
je název subjektu certifikátu. -
allowInvalid
označuje, zda by se měly považovat za neplatné certifikáty, jako jsou certifikáty podepsané svým držitelem. -
location
je umístění úložiště, ze které se má certifikát načíst. -
serverCertificate
je 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:
- Bez konfigurace
- Nahrazení výchozího certifikátu z konfigurace
- Změna výchozích hodnot v kódu
Bez 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
K dispozici je výchozí schéma konfigurace pro nastavení aplikace HTTPS Kestrel. Nakonfigurujte několik koncových bodů, včetně adres URL a certifikátů, které se mají použít, a to buď ze souboru na disku, nebo z úložiště certifikátů.
V následujícím appsettings.json
příkladu:
- Nastavte
AllowInvalid
natrue
povolení použití neplatných certifikátů (například certifikátů podepsaných svým držitelem). - Jakýkoli koncový bod HTTPS, který neurčuje certifikát (
HttpsDefaultCert
v následujícím příkladu), se vrátí k certifikátu definovanému v rámciCertificates:Default
nebo vývojovém certifikátu.
{
"Kestrel": {
"Endpoints": {
"Http": {
"Url": "http://localhost:5000"
},
"HttpsInlineCertFile": {
"Url": "https://localhost:5001",
"Certificate": {
"Path": "<path to .pfx file>",
"Password": "$CREDENTIAL_PLACEHOLDER$"
}
},
"HttpsInlineCertAndKeyFile": {
"Url": "https://localhost:5002",
"Certificate": {
"Path": "<path to .pem/.crt file>",
"KeyPath": "<path to .key file>",
"Password": "$CREDENTIAL_PLACEHOLDER$"
}
},
"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": "$CREDENTIAL_PLACEHOLDER$"
}
}
}
}
Upozornění
V předchozím příkladu jsou hesla certifikátů uložena ve formátu prostého textu .appsettings.json
Token $CREDENTIAL_PLACEHOLDER$
se používá jako zástupný symbol pro heslo každého certifikátu. Pokud chcete bezpečně ukládat hesla certifikátů ve vývojových prostředích, přečtěte si téma Ochrana tajných kódů při vývoji. Pokud chcete bezpečně ukládat hesla certifikátů v produkčních prostředích, přečtěte si o poskytovateli konfigurace služby Azure Key Vault. Tajné kódy pro vývoj by se neměly používat pro produkční ani testovací prostředí.
Poznámky ke schématu:
- Názvy koncových bodů jsou na velikosti písmen nezávislé. Například
HTTPS
aHttps
jsou ekvivalentní. - Parametr
Url
se vyžaduje pro každý koncový bod. Formát tohoto parametru je stejný jako konfigurační parametr nejvyšší úrovněUrls
s tím rozdílem, že je omezený na jednu hodnotu. - Tyto koncové body nahrazují ty, které jsou definované v konfiguraci nejvyšší úrovně
Urls
nikoliv aby je přidaly. Koncové body definované v kódu prostřednictvímListen
jsou kumulativní s koncovými body definovanými v konfigurační části. - Oddíl
Certificate
je nepovinný. Pokud není zadanýCertificate
oddíl, použijí se výchozí hodnoty definované vCertificates:Default
. Pokud nejsou k dispozici žádné výchozí hodnoty, použije se vývojový certifikát. Pokud neexistují žádné výchozí hodnoty a není k dispozici vývojový certifikát, server vyvolá výjimku a nespustí se. - Tato
Certificate
část podporuje více zdrojů certifikátů. - Libovolný počet koncových bodů může být definován v konfiguraci , pokud nezpůsobí konflikty portů.
Zdroje certifikátů
Uzly certifikátů je možné nakonfigurovat tak, aby načítá certifikáty z řady zdrojů:
-
Path
aPassword
načíst soubory .pfx. -
Path
,KeyPath
aPassword
pro načtení .pem/.crt a .key souborů. -
Subject
aStore
načíst z úložiště certifikátů.
Certificates:Default
Například certifikát lze zadat 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}"))
KestrelConfigurationLoader vrátí metodu.Endpoint(string name, listenOptions => { })
, která se dá použít k doplnění nakonfigurovaného nastavení koncového bodu:
webBuilder.UseKestrel((context, serverOptions) =>
{
serverOptions.Configure(context.Configuration.GetSection("Kestrel"))
.Endpoint("HTTPS", listenOptions =>
{
listenOptions.HttpsOptions.SslProtocols = SslProtocols.Tls12;
});
});
KestrelServerOptions.ConfigurationLoader
lze přímo přistupovat k pokračování v iteraci na stávajícím zavaděči, jako je například ten, který poskytuje CreateDefaultBuilder.
- Konfigurační oddíl pro každý koncový bod je k dispozici v možnostech metody
Endpoint
, aby bylo možné přečíst vlastní nastavení. - Více konfigurací může být načteno opětovným voláním
options.Configure(context.Configuration.GetSection("{SECTION}"))
s jinou sekcí. Použije se pouze poslední konfigurace, pokudLoad
není explicitně volána u předchozích instancí. Metabalíček nevoláLoad
, tak aby mohl být nahrazen výchozí konfigurační oddíl. -
KestrelConfigurationLoader
zrcadlíListen
řadu rozhraní API zKestrelServerOptions
Endpoint
přetížení, takže je možné nakonfigurovat koncové body kódu a konfigurace na stejném místě. Tato přetížení nepoužívají názvy a využívají pouze výchozí nastavení z konfigurace.
Změna výchozích hodnot v kódu
ConfigureEndpointDefaults
a ConfigureHttpsDefaults
lze použít ke změně výchozího nastavení pro ListenOptions
a HttpsConnectionAdapterOptions
, včetně přepsání výchozího certifikátu zadaného v předchozím scénáři.
ConfigureEndpointDefaults
a ConfigureHttpsDefaults
měly by se volat před konfigurací všech koncových bodů.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureEndpointDefaults(listenOptions =>
{
// Configure endpoint defaults
});
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
listenOptions.SslProtocols = SslProtocols.Tls12;
});
});
Konfigurace koncových bodů pomocí indikací názvu serveru
Indikaci názvu serveru (SNI) lze použít k hostování více domén na stejné IP adrese a portu. Aby rozhraní SNI fungovalo, 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á zařízený certifikát pro šifrovanou komunikaci se serverem během zabezpečené relace, která následuje za metodou handshake protokolu TLS.
SNI je možné nakonfigurovat dvěma způsoby:
- Vytvořte koncový bod v kódu a vyberte certifikát pomocí názvu hostitele se zpětným voláním ServerCertificateSelector .
- Nakonfigurujte mapování mezi názvy hostitelů a možnostmi HTTPS v konfiguraci. Například JSON v
appsettings.json
souboru.
SNI s ServerCertificateSelector
Kestrel podporuje SNI pomocí ServerCertificateSelector
callbacku. Zpětné volání se vyvolá jednou za 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 při volání metody ConfigureWebHostDefaults
v souboru projektu Program.cs
.
// 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 zpětného ServerOptionsSelectionCallback
volání. Zpětné volání se vyvolá jednou za 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 v konfiguraci
Kestrel podporuje SNI definované v konfiguraci. Koncový bod lze nakonfigurovat s objektem Sni
, který obsahuje mapování mezi názvy hostitelů a možnostmi HTTPS. Název hostitele připojení se shoduje s vybranými možnostmi, které jsou použity 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ě hostitelského jména.
{
"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": "$CREDENTIAL_PLACEHOLDER$"
}
},
"*": {
// 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": "$CREDENTIAL_PLACEHOLDER$"
}
}
}
}
Varování
V předchozím příkladu jsou hesla certifikátů uložena ve formátu prostého textu .appsettings.json
Token $CREDENTIAL_PLACEHOLDER$
se používá jako zástupný symbol pro heslo každého certifikátu. Pokud chcete bezpečně ukládat hesla certifikátů ve vývojových prostředích, přečtěte si téma Ochrana tajných kódů při vývoji. Pokud chcete bezpečně ukládat hesla certifikátů v produkčních prostředích, přečtěte si o poskytovateli konfigurace služby Azure Key Vault. Tajné kódy pro vývoj by se neměly používat pro produkční ani testovací prostředí.
Možnosti HTTPS, které je možné přepsat pomocí SNI:
-
Certificate
nakonfiguruje zdroj certifikátu. -
Protocols
nakonfiguruje povolené protokoly HTTP. -
SslProtocols
nakonfiguruje povolené protokoly SSL. -
ClientCertificateMode
nakonfiguruje požadavky na klientský certifikát.
Název hostitele podporuje porovnávání zástupných znaků:
- Přesná shoda. Například
a.example.org
odpovídáa.example.org
. - Předpona zástupných znaků. Pokud existuje více zástupných shod, vybere se nejdelší vzor. Například
*.example.org
odpovídáb.example.org
ac.example.org
. - Univerzální zástupný znak.
*
odpovídá všemu jinému, včetně klientů, kteří nepoužívají SNI a neposílají název hostitele.
Odpovídající konfigurace SNI se přímo aplikuje na koncový bod připojení, čímž přepíše hodnoty na koncovém bodu. Pokud se připojení neshoduje s nakonfigurovaným názvem hostitele SNI, připojení se odmítne.
Požadavky na SNI
- Běží na cílovém frameworku
netcoreapp2.1
nebo novějším. Ponet461
nebo později je vyvoláno zpětné volání, alename
je vždynull
. Toname
platí takénull
v případě, že klient nezadá parametr názvu hostitele v metodě handshake protokolu TLS. - Všechny weby běží ve 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 používané k šifrování a dešifrování provozu mezi dvěma komunikujícími účastníky, 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": "$CREDENTIAL_PLACEHOLDER$"
}
}
}
}
}
Varování
V předchozím příkladu je heslo certifikátu uloženo ve formátu prostého textu .appsettings.json
Token $CREDENTIAL_PLACEHOLDER$
se používá jako zástupný symbol pro heslo certifikátu. Pokud chcete bezpečně ukládat hesla certifikátů ve vývojových prostředích, přečtěte si téma Ochrana tajných kódů při vývoji. Pokud chcete bezpečně ukládat hesla certifikátů v produkčních prostředích, přečtěte si o poskytovateli konfigurace služby Azure Key Vault. Tajné kódy pro vývoj by se neměly používat pro produkční ani testovací prostředí.
Výchozí hodnota SslProtocols.None
způsobí, že Kestrel použije výchozí nastavení operačního systému k výběru nejlepšího protokolu. Pokud nemáte konkrétní důvod k výběru protokolu, použijte výchozí nastavení.
Klientské certifikáty
ClientCertificateMode
nakonfiguruje 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": "$CREDENTIAL_PLACEHOLDER$"
}
}
}
}
}
Varování
V předchozím příkladu je heslo certifikátu uloženo ve formátu prostého textu .appsettings.json
Token $CREDENTIAL_PLACEHOLDER$
se používá jako zástupný symbol pro heslo certifikátu. Pokud chcete bezpečně ukládat hesla certifikátů ve vývojových prostředích, přečtěte si téma Ochrana tajných kódů při vývoji. Pokud chcete bezpečně ukládat hesla certifikátů v produkčních prostředích, přečtěte si o poskytovateli konfigurace služby Azure Key Vault. Tajné kódy pro vývoj by se neměly používat pro produkční ani testovací prostředí.
Výchozí hodnota je ClientCertificateMode.NoCertificate
, při které Kestrel nebude požadovat ani vyžadovat certifikát od klienta.
Další informace najdete v tématu Konfigurace ověřování certifikátů v ASP.NET Core.
Zaznamenávání připojení
Zavolejte UseConnectionLogging pro vysílání ladicích protokolů pro komunikaci na úrovni jednotlivých bajtů v připojení. Protokolování připojení je užitečné při řešení problémů při komunikaci nízké úrovně, například při šifrování TLS a za proxy servery. Pokud je UseConnectionLogging
umístěno před UseHttps
, zašifrovaný provoz se zaprotokoluje. Pokud UseConnectionLogging
je umístěn po UseHttps
, dešifrovaný provoz se zaprotokoluje. Toto je integrované připojovací middleware.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Listen(IPAddress.Any, 8000, listenOptions =>
{
listenOptions.UseConnectionLogging();
});
});
Připojit se k soketu TCP
Metoda Listen vytvoří vazbu na soket TCP a možnost lambda umožňuje 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 nakonfiguruje HTTPS pro koncový bod s ListenOptions. Ke konfiguraci dalších Kestrel nastavení pro konkrétní koncové body použijte stejné rozhraní API.
V systému Windows lze vytvořit samo podepsané certifikáty pomocí UpdateIISExpressSSLForChrome.ps1
.
V systémech macOS, Linux a Windows je možné certifikáty vytvářet pomocí OpenSSL.
Připojit se k unixovému soketu
Naslouchejte na Unixovém soketu s použitím ListenUnixSocket pro lepší výkon s Nginx, jak je ukázá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_pass
položku na .http://unix:/tmp/{KESTREL SOCKET}:/;
{KESTREL SOCKET}
je název zadaného soketu ListenUnixSocket (napříkladkestrel-test.sock
v předchozím příkladu). - Ujistěte se, že je soket zapisovatelný pomocí Nginx (například
chmod go+w /tmp/kestrel-test.sock
).
Port 0
Pokud je zadané číslo 0
portu, Kestrel dynamicky vytvoří vazbu k dostupnému portu. Následující příklad ukazuje, jak určit port Kestrel vázaný 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 označuje dynamický port, na kterém je možné aplikaci dosáhnout:
Listening on the following addresses: http://127.0.0.1:48508
Omezení
Nakonfigurujte koncové body pomocí následujících přístupů:
- UseUrls
-
--urls
Argument příkazového řádku -
urls
konfigurační klíč hostitele -
ASPNETCORE_URLS
proměnná prostředí
Tyto metody jsou užitečné pro práci s kódem s jinými servery než Kestrel. Mějte však na paměti následující omezení:
- Https se s těmito přístupy nedá použít, pokud není v konfiguraci koncového bodu HTTPS k dispozici výchozí certifikát (například použití
KestrelServerOptions
konfigurace nebo konfiguračního souboru, jak je znázorněno výše v tomto článku). -
Listen
UseUrls
Když se současně používají oba přístupy,Listen
koncové body přepíšíUseUrls
koncové body.
Konfigurace koncového bodu služby IIS
Při použití služby IIS jsou vazby adresy URL pro přepsání v rámci služby IIS nastaveny pomocí buď Listen
, nebo UseUrls
. Další informace najdete v tématu ASP.NET Core Module.
MožnostiPoslouchání.Protokoly
Vlastnost Protocols
vytvoří protokoly HTTP (HttpProtocols
) povolené v koncovém bodu připojení nebo pro server. Přiřaďte hodnotu vlastnosti Protocols
z výčtu HttpProtocols
.
HttpProtocols enum value |
Povolený protokol připojení |
---|---|
Http1 |
Pouze HTTP/1.1. Lze použít s protokolem TLS nebo bez protokolu TLS. |
Http2 |
Pouze HTTP/2. Lze použít bez protokolu TLS pouze v případě, že klient podporuje předchozí režim znalostí. |
Http1AndHttp2 |
HTTP/1.1 a HTTP/2. HTTP/2 vyžaduje, aby klient vybral HTTP/2 při vyjednávání aplikační vrstvy TLS (ALPN) handshake; jinak se připojení ve výchozím nastavení nastaví na HTTP/1.1. |
Výchozí ListenOptions.Protocols
hodnota každého koncového bodu je HttpProtocols.Http1AndHttp2
.
Omezení protokolu TLS pro HTTP/2:
- TLS verze 1.2 nebo novější
- Opětovné vyjednávání zakázáno
- Komprese zakázána
- Minimální dočasné velikosti výměny klíčů:
- Elliptic curve Diffie-Hellman (ECDHE) [RFC4492]: minimálně 224 bitů
- Konečné pole Diffie-Hellman (DHE) [
TLS12
]: minimálně 2048 bitů
- Šifrovací sada není zakázaná.
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
[TLS-ECDHE
] s eliptickou křivkou P-256 [FIPS186
] je ve výchozím nastavení podporována.
Následující příklad umožňuje připojení HTTP/1.1 a HTTP/2 na portu 8000. Připojení jsou zabezpečená protokolem TLS se zadaným certifikátem:
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Listen(IPAddress.Any, 8000, listenOptions =>
{
listenOptions.UseHttps("testCert.pfx", "testPassword");
});
});
Na Linuxu je možné využít CipherSuitesPolicy k filtrování TLS handshake pro každé 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 pro připojení
Vlastní middleware připojení může v případě potřeby filtrovat TLS handshake na úrovni jednotlivých spojení pro konkrétní šifry.
Následující příklad vyvolá výjimku NotSupportedException pro jakýkoli algoritmus šifrování, který aplikace nepodporuje. Případně můžete definovat a porovnat ITlsHandshakeFeature.CipherAlgorithm se seznamem přijatelných šifrovacích sad.
U šifrovacího algoritmu 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í je také možné 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
volá ve výchozím nastavení serverOptions.Configure(context.Configuration.GetSection("Kestrel"))
pro načtení konfigurace Kestrel.
Následující appsettings.json
příklad vytvoří http/1.1 jako výchozí připojovací protokol 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 určené v kódu přepisují hodnoty nastavené konfigurací.
Předpony adres URL
Při použití UseUrls
argumentu --urls
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 libovolném z následujících formátů.
Platné jsou pouze předpony adresy URL HTTP.
Kestrel nepodporuje HTTPS při konfiguraci vazeb adres URL pomocí UseUrls
.
Adresa IPv4 s číslem portu
http://65.55.39.10:80/
0.0.0.0
je zvláštní případ, který se sváže se všemi adresami IPv4.Adresa IPv6 s číslem portu
http://[0:0:0:0:0:ffff:4137:270a]:80/
[::]
je ekvivalentem IPv6 protokolu IPv40.0.0.0
.Název hostitele s číslem portu
http://contoso.com:80/ http://*:80/
Názvy hostů,
*
a+
, nejsou zvláštní. Cokoli, co není rozpoznáno jako platná IP adresa, nebolocalhost
se váže na všechny IP adresy IPv4 a IPv6. Pokud chcete svázat různé názvy hostitelů s různými aplikacemi ASP.NET Core na stejném portu, použijte HTTP.sys nebo reverzní proxy server. Příklady reverzního proxy serveru zahrnují službu IIS, Nginx nebo Apache.Varování
Hostování v konfiguraci reverzního proxy serveru vyžaduje filtrování hostitele.
Název hostitele
localhost
s číslem portu nebo IP adresa zpětné smyčky s číslem portuhttp://localhost:5000/ http://127.0.0.1:5000/ http://[::1]:5000/
Po zadání
localhost
se Kestrel pokusí připojit k rozhraním zpětné smyčky IPv4 a IPv6. Pokud požadovaný port používá jiná služba na některém ze zpětných smyčkových rozhraní, Kestrel se nepodaří spustit. Pokud je některé z rozhraní zpětné smyčky z jakéhokoli jiného důvodu nedostupné (nejčastěji kvůli tomu, že se nepodporuje protokol IPv6), Kestrel zaznamená upozornění.