Konfigurowanie punktów końcowych dla serwera internetowego ASP.NET Core Kestrel
Uwaga
Nie jest to najnowsza wersja tego artykułu. Aby zapoznać się z bieżącą wersją, zobacz wersję tego artykułu platformy .NET 9.
Ważne
Te informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany, zanim zostanie wydany komercyjnie. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Aby zapoznać się z bieżącą wersją, zobacz wersję tego artykułu platformy .NET 9.
Uwaga
Nie jest to najnowsza wersja tego artykułu. Aby zapoznać się z bieżącą wersją, zobacz wersję tego artykułu platformy .NET 9.
Ważne
Te informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany, zanim zostanie wydany komercyjnie. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Aby zapoznać się z bieżącą wersją, zobacz wersję tego artykułu platformy .NET 9.
Kestrel punkty końcowe zapewniają infrastrukturę do nasłuchiwania żądań przychodzących i kierowania ich do odpowiedniego oprogramowania pośredniczącego. Kombinacja adresu i protokołu definiuje punkt końcowy.
- Adres określa interfejs sieciowy, na który serwer nasłuchuje dla żądań przychodzących, takich jak port TCP.
- Protokół określa komunikację między klientem a serwerem, takim jak HTTP/1.1, HTTP/2 lub HTTP/3.
- Punkt końcowy można zabezpieczyć przy użyciu schematu
https
adresu URL lubUseHttps
metody.
Punkty końcowe można skonfigurować przy użyciu adresów URL, JSON w appsettings.json
kodzie i . W tym artykule omówiono sposób konfigurowania punktu końcowego przy użyciu każdej opcji:
Domyślny punkt końcowy
Nowe projekty ASP.NET Core są skonfigurowane do powiązania z losowym portem HTTP z zakresu od 5000 do 5300 i losowego portu HTTPS z zakresu od 7000 do 7300. Wybrane porty są przechowywane w wygenerowanym Properties/launchSettings.json
pliku i mogą być modyfikowane przez dewelopera. Plik launchSetting.json
jest używany tylko w środowisku lokalnym.
Jeśli nie ma konfiguracji punktu końcowego, powiąże się Kestrel z http://localhost:5000
.
Konfigurowanie punktów końcowych
Kestrel punkty końcowe nasłuchują połączeń przychodzących. Po utworzeniu punktu końcowego należy go skonfigurować przy użyciu adresu, na który będzie nasłuchiwać. Zazwyczaj jest to adres TCP i numer portu.
Istnieje kilka opcji konfigurowania punktów końcowych:
- Konfigurowanie punktów końcowych przy użyciu adresów URL
- Określanie tylko portów
- Konfigurowanie punktów końcowych w appsettings.json
- Konfigurowanie punktów końcowych w kodzie
Konfigurowanie punktów końcowych przy użyciu adresów URL
W poniższych sekcjach opisano sposób konfigurowania punktów końcowych przy użyciu polecenia :
ASPNETCORE_URLS
zmienna środowiskowa.--urls
argument wiersza polecenia.urls
klucz konfiguracji hosta.- UseUrls metoda rozszerzenia.
- WebApplication.Urls własność.
Formaty adresów URL
Adresy URL wskazują adresy IP lub hosty z portami i protokołami, na których serwer powinien nasłuchiwać. Port można pominąć, jeśli jest to domyślny dla protokołu (zazwyczaj 80 i 443). Adresy URL mogą mieć dowolny z następujących formatów.
Adres IPv4 z numerem portu
http://65.55.39.10:80/
0.0.0.0
Jest to specjalny przypadek, który wiąże się ze wszystkimi adresami IPv4.Adres IPv6 z numerem portu
http://[0:0:0:0:0:ffff:4137:270a]:80/
[::]
to odpowiednik protokołu IPv6 protokołu IPv40.0.0.0
.Host z symbolami wieloznacznymi z numerem portu
http://contoso.com:80/ http://*:80/
Wszystkie elementy nie rozpoznane jako prawidłowy adres IP lub
localhost
są traktowane jako symbol wieloznaczny, który wiąże się ze wszystkimi adresami IPv4 i IPv6. Niektóre osoby lubią używać*
lub+
być bardziej wyraźne. Aby powiązać różne nazwy hostów z różnymi aplikacjami ASP.NET Core na tym samym porcie, użyj HTTP.sys lub odwrotnego serwera proxy.Przykłady odwrotnego serwera proxy obejmują usługi IIS, YARP, Nginx i Apache.
Nazwa
localhost
hosta z numerem portu lub adresem IP sprzężenia zwrotnego z numerem portuhttp://localhost:5000/ http://127.0.0.1:5000/ http://[::1]:5000/
Gdy
localhost
zostanie określony, Kestrel próbuje powiązać zarówno interfejsy IPv4, jak i IPv6 sprzężenia zwrotnego. Jeśli żądany port jest używany przez inną usługę w interfejsie sprzężenia zwrotnego, Kestrel nie można uruchomić. Jeśli którykolwiek z interfejsów sprzężenia zwrotnego jest niedostępny z jakiegokolwiek innego powodu (najczęściej dlatego, że protokół IPv6 nie jest obsługiwany), Kestrel rejestruje ostrzeżenie.
Wiele prefiksów adresów URL można określić za pomocą ogranicznika średnika (;
):
http://*:5000;http://localhost:5001;https://hostname:5002
Aby uzyskać więcej informacji, zobacz Zastępowanie konfiguracji.
Prefiksy adresów URL protokołu HTTPS
Prefiksy adresów URL protokołu HTTPS mogą służyć do definiowania punktów końcowych tylko wtedy, gdy w konfiguracji punktu końcowego HTTPS podano domyślny certyfikat. Na przykład użyj KestrelServerOptions konfiguracji lub pliku konfiguracji, jak pokazano w dalszej części tego artykułu.
Aby uzyskać więcej informacji, zobacz Konfigurowanie protokołu HTTPS.
Określanie tylko portów
Aplikacje i kontenery często otrzymują tylko port do nasłuchiwania, na przykład port 80, bez dodatkowych ograniczeń, takich jak host lub ścieżka. HTTP_PORTS i HTTPS_PORTS to klucze konfiguracji, które określają porty nasłuchiwania dla Kestrel serwerów i HTTP.sys. Te klucze można określić jako zmienne środowiskowe zdefiniowane za pomocą DOTNET_
prefiksów lub ASPNETCORE_
lub określone bezpośrednio za pomocą innych danych wejściowych konfiguracji, takich jak appsettings.json
. Każda z nich jest rozdzieloną średnikami listą wartości portów, jak pokazano w poniższym przykładzie:
ASPNETCORE_HTTP_PORTS=80;8080
ASPNETCORE_HTTPS_PORTS=443;8081
Powyższy przykład jest skrócony dla następującej konfiguracji, która określa schemat (HTTP lub HTTPS) i dowolny host lub adres IP.
ASPNETCORE_URLS=http://*:80/;http://*:8080/;https://*:443/;https://*:8081/
Klucze konfiguracji HTTP_PORTS i HTTPS_PORTS mają niższy priorytet i są zastępowane przez adresy URL lub wartości podane bezpośrednio w kodzie. Certyfikaty nadal muszą być konfigurowane oddzielnie za pośrednictwem mechaniki specyficznej dla serwera dla protokołu HTTPS.
Konfigurowanie punktów końcowych w appsettings.json
Kestrel może ładować punkty końcowe z IConfiguration wystąpienia. Domyślnie Kestrel konfiguracja jest ładowana z Kestrel
sekcji, a punkty końcowe są konfigurowane w programie Kestrel:Endpoints
:
{
"Kestrel": {
"Endpoints": {
"MyHttpEndpoint": {
"Url": "http://localhost:8080"
}
}
}
}
Powyższy przykład:
- Używa
appsettings.json
jako źródła konfiguracji. Można jednak użyć dowolnegoIConfiguration
źródła. - Dodaje punkt końcowy o nazwie
MyHttpEndpoint
na porcie 8080.
Aby uzyskać więcej informacji na temat konfigurowania punktów końcowych przy użyciu formatu JSON, zobacz sekcje w dalszej części tego artykułu, w których omówiono konfigurowanie protokołów HTTPS i konfigurowanie protokołów HTTP w appsettings.json.
Ponowne ładowanie punktów końcowych z konfiguracji
Ponowne ładowanie konfiguracji punktu końcowego, gdy źródło konfiguracji zostanie domyślnie włączone. Można go wyłączyć przy użyciu polecenia KestrelServerOptions.Configure(IConfiguration, Boolean).
Jeśli zostanie zasygnalizowana zmiana, zostaną wykonane następujące czynności:
- Nowa konfiguracja jest porównywana ze starym, a żaden punkt końcowy bez zmian konfiguracji nie jest modyfikowany.
- Usunięte lub zmodyfikowane punkty końcowe mają 5 sekund na ukończenie przetwarzania żądań i zamknięcie.
- Uruchomiono nowe lub zmodyfikowane punkty końcowe.
Klienci łączący się z zmodyfikowanym punktem końcowym mogą zostać rozłączone lub odrzucone podczas ponownego uruchamiania punktu końcowego.
ConfigurationLoader
KestrelServerOptions.Configure zwraca wartość KestrelConfigurationLoader. Metoda modułu Endpoint(String, Action<EndpointConfiguration>) ładującego, która może służyć do uzupełnienia ustawień skonfigurowanego punktu końcowego:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
var kestrelSection = context.Configuration.GetSection("Kestrel");
serverOptions.Configure(kestrelSection)
.Endpoint("HTTPS", listenOptions =>
{
// ...
});
});
KestrelServerOptions.ConfigurationLoader
można uzyskać bezpośredni dostęp, aby kontynuować iterowanie istniejącego modułu ładującego, na przykład podane przez WebApplicationBuilder.WebHostusługę .
- Sekcja konfiguracji dla każdego punktu końcowego jest dostępna w opcjach w metodzie Endpoint , dzięki czemu ustawienia niestandardowe mogą być odczytywane.
- KestrelServerOptions.Configure(IConfiguration) może być wywoływana wiele razy, ale używana jest tylko ostatnia konfiguracja, chyba że
Load
jawnie wywoływana jest poprzednia konfiguracja. Domyślny host nie wywołuje metodyLoad
, aby można było zamienić jego domyślną sekcję konfiguracji. KestrelConfigurationLoader
Dubluje rodzinęListen
interfejsów API zKestrelServerOptions
jakoEndpoint
przeciążeń, dzięki czemu punkty końcowe kodu i konfiguracji można skonfigurować w tym samym miejscu. Te przeciążenia nie używają nazw i używają tylko ustawień domyślnych z konfiguracji.
Konfigurowanie punktów końcowych w kodzie
KestrelServerOptions Udostępnia metody konfigurowania punktów końcowych w kodzie:
Gdy oba Listen
interfejsy API i UseUrls są używane jednocześnie, Listen
punkty końcowe zastępują UseUrls
punkty końcowe.
Wiązanie z gniazdem TCP
Metody Listen, ListenLocalhosti ListenAnyIP wiążą się z gniazdem 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");
});
});
Powyższy przykład:
- Konfiguruje punkty końcowe nasłuchujące na porcie 5000 i 5001.
- Konfiguruje protokół HTTPS dla punktu końcowego przy użyciu UseHttps metody rozszerzenia w pliku ListenOptions. Aby uzyskać więcej informacji, zobacz Konfigurowanie protokołu HTTPS w kodzie.
W systemie Windows można utworzyć certyfikaty z podpisem własnym przy użyciu New-SelfSignedCertificate
polecenia cmdlet programu PowerShell. Aby zapoznać się z nieobsługiwanym przykładem, zobacz UpdateIISExpressSSLForChrome.ps1
.
W systemach macOS, Linux i Windows można tworzyć certyfikaty przy użyciu protokołu OpenSSL.
Wiązanie z gniazdem systemu Unix
Nasłuchiwanie w gniazdach systemu Unix z ListenUnixSocket ulepszoną wydajnością za pomocą serwera Nginx, jak pokazano w tym przykładzie:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.ListenUnixSocket("/tmp/kestrel-test.sock");
});
- W pliku konfiguracji Nginx ustaw
server
>proxy_pass
>location
wpis na .http://unix:/tmp/{KESTREL SOCKET}:/;
{KESTREL SOCKET}
to nazwa gniazda podanego ListenUnixSocket (na przykładkestrel-test.sock
w poprzednim przykładzie). - Upewnij się, że gniazdo jest zapisywalne przez serwer Nginx (na przykład
chmod go+w /tmp/kestrel-test.sock
).
Konfigurowanie domyślnych ustawień punktu końcowego
ConfigureEndpointDefaults(Action<ListenOptions>)
określa konfigurację uruchamianą dla każdego określonego punktu końcowego. Wywołanie ConfigureEndpointDefaults
wiele razy zastępuje poprzednią konfigurację.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureEndpointDefaults(listenOptions =>
{
// ...
});
});
Uwaga
Punkty końcowe utworzone przez wywołanie przed wywołaniem ConfigureEndpointDefaults Listen nie będą miały zastosowanych wartości domyślnych.
Powiązanie portu dynamicznego
Po określeniu Kestrel numeru 0
portu dynamicznie wiąże się z dostępnym portem. W poniższym przykładzie pokazano, jak określić, który port Kestrel jest powiązany w czasie wykonywania:
app.Run(async (context) =>
{
var serverAddressFeature = context.Features.Get<IServerAddressesFeature>();
if (serverAddressFeature is not null)
{
var listenAddresses = string.Join(", ", serverAddressFeature.Addresses);
// ...
}
});
Dynamiczne powiązanie portu nie jest dostępne w niektórych sytuacjach:
- KestrelServerOptions.ListenLocalhost
- Powiązanie protokołu HTTP/1.1 lub HTTP/2 opartego na protokole TCP oraz protokołu HTTP/3 opartego na protokole QUIC.
Konfigurowanie protokołu HTTPS
Kestrel obsługuje zabezpieczanie punktów końcowych przy użyciu protokołu HTTPS. Dane wysyłane za pośrednictwem protokołu HTTPS są szyfrowane przy użyciu protokołu Transport Layer Security (TLS) w celu zwiększenia bezpieczeństwa przesyłanych danych między klientem a serwerem.
Protokół HTTPS wymaga certyfikatu TLS. Certyfikat TLS jest przechowywany na serwerze i Kestrel jest skonfigurowany do korzystania z niego. Aplikacja może używać certyfikatu deweloperskiego ASP.NET Core HTTPS w lokalnym środowisku programistycznym. Certyfikat dewelopera nie jest zainstalowany w środowiskach innych niż rozwój. W środowisku produkcyjnym certyfikat TLS musi być jawnie skonfigurowany. Należy podać co najmniej certyfikat domyślny.
Sposób konfigurowania protokołu HTTPS i certyfikatu TLS zależy od sposobu konfigurowania punktów końcowych:
- Jeśli prefiksy adresów URL lub określ porty są używane tylko do definiowania punktów końcowych, protokół HTTPS może być używany tylko wtedy, gdy w konfiguracji punktu końcowego HTTPS zostanie podany domyślny certyfikat. Certyfikat domyślny można skonfigurować przy użyciu jednej z następujących opcji:
- Konfigurowanie protokołu HTTPS w usłudze appsettings.json
- Konfigurowanie protokołu HTTPS w kodzie
Konfigurowanie protokołu HTTPS w usłudze appsettings.json
Domyślny schemat konfiguracji ustawień aplikacji HTTPS jest dostępny dla programu Kestrel. Skonfiguruj wiele punktów końcowych, w tym adresy URL i certyfikaty do użycia, z pliku na dysku lub z magazynu certyfikatów.
Każdy punkt końcowy HTTPS, który nie określa certyfikatu (HttpsDefaultCert
w poniższym przykładzie) wraca do certyfikatu zdefiniowanego w ramach Certificates:Default
programu lub certyfikatu programistycznego.
Poniższy przykład dotyczy elementu appsettings.json
, ale można użyć dowolnego źródła konfiguracji:
{
"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$"
}
}
}
}
Ostrzeżenie
W poprzednim przykładzie hasło certyfikatu jest przechowywane w postaci zwykłego tekstu w pliku appsettings.json
. Token $CREDENTIAL_PLACEHOLDER$
jest używany jako symbol zastępczy hasła certyfikatu. Aby bezpiecznie przechowywać hasła certyfikatów w środowiskach deweloperskich, zobacz Ochrona wpisów tajnych podczas programowania. Aby bezpiecznie przechowywać hasła certyfikatów w środowiskach produkcyjnych, zobacz Dostawca konfiguracji usługi Azure Key Vault. Wpisy tajne programowania nie powinny być używane do produkcji ani testowania.
Uwagi dotyczące schematu
- Nazwy punktów końcowych są niewrażliwe na wielkość liter. Na przykład elementy
HTTPS
iHttps
są równoważne. - Parametr
Url
jest wymagany dla każdego punktu końcowego. Format tego parametru jest taki sam jak parametr konfiguracji najwyższego poziomuUrls
, z wyjątkiem tego, że jest ograniczony do pojedynczej wartości. Zobacz formaty adresów URL we wcześniejszej wersji tego artykułu. - Te punkty końcowe zastępują te zdefiniowane w konfiguracji najwyższego poziomu
Urls
, a nie dodawane do nich. Punkty końcowe zdefiniowane w kodzie za pośrednictwemListen
są skumulowane z punktami końcowymi zdefiniowanymi w sekcji konfiguracji. - Sekcja jest opcjonalna
Certificate
.Certificate
Jeśli sekcja nie jest określona, używane są wartości domyślne zdefiniowane wCertificates:Default
. Jeśli nie są dostępne żadne wartości domyślne, używany jest certyfikat dewelopera. Jeśli nie ma żadnych wartości domyślnych i certyfikat programowania nie jest obecny, serwer zgłasza wyjątek i nie można go uruchomić. - Sekcja
Certificate
obsługuje wiele źródeł certyfikatów. - Dowolna liczba punktów końcowych może być zdefiniowana w elemecie
Configuration
, o ile nie powodują konfliktów portów.
Źródła certyfikatów
Węzły certyfikatów można skonfigurować do ładowania certyfikatów z wielu źródeł:
Path
iPassword
do ładowania plików pfx .Path
iKeyPath
do ładowania plików pem.crt/ i .key.Password
Subject
iStore
do załadowania z magazynu certyfikatów.
Na przykład Certificates:Default
certyfikat można określić jako:
"Default": {
"Subject": "<subject; required>",
"Store": "<cert store; required>",
"Location": "<location; defaults to CurrentUser>",
"AllowInvalid": "<true or false; defaults to false>"
}
Konfigurowanie certyfikatów klienta w programie appsettings.json
ClientCertificateMode służy do konfigurowania zachowania certyfikatu klienta.
{
"Kestrel": {
"Endpoints": {
"MyHttpsEndpoint": {
"Url": "https://localhost:5001",
"ClientCertificateMode": "AllowCertificate",
"Certificate": {
"Path": "<path to .pfx file>",
"Password": "$CREDENTIAL_PLACEHOLDER$"
}
}
}
}
}
Ostrzeżenie
W poprzednim przykładzie hasło certyfikatu jest przechowywane w postaci zwykłego tekstu w pliku appsettings.json
. Token $CREDENTIAL_PLACEHOLDER$
jest używany jako symbol zastępczy hasła certyfikatu. Aby bezpiecznie przechowywać hasła certyfikatów w środowiskach deweloperskich, zobacz Ochrona wpisów tajnych podczas programowania. Aby bezpiecznie przechowywać hasła certyfikatów w środowiskach produkcyjnych, zobacz Dostawca konfiguracji usługi Azure Key Vault. Wpisy tajne programowania nie powinny być używane do produkcji ani testowania.
Wartość domyślna to ClientCertificateMode.NoCertificate
, gdzie Kestrel nie żąda ani nie wymaga certyfikatu od klienta.
Aby uzyskać więcej informacji, zobacz Konfigurowanie uwierzytelniania certyfikatów w programie ASP.NET Core.
Konfigurowanie protokołów SSL/TLS w usłudze appsettings.json
Protokoły SSL to protokoły używane do szyfrowania i odszyfrowywania ruchu między dwoma elementami równorzędnymi, tradycyjnie klientem i serwerem.
{
"Kestrel": {
"Endpoints": {
"MyHttpsEndpoint": {
"Url": "https://localhost:5001",
"SslProtocols": ["Tls12", "Tls13"],
"Certificate": {
"Path": "<path to .pfx file>",
"Password": "$CREDENTIAL_PLACEHOLDER$"
}
}
}
}
}
Ostrzeżenie
W poprzednim przykładzie hasło certyfikatu jest przechowywane w postaci zwykłego tekstu w pliku appsettings.json
. Token $CREDENTIAL_PLACEHOLDER$
jest używany jako symbol zastępczy hasła certyfikatu. Aby bezpiecznie przechowywać hasła certyfikatów w środowiskach deweloperskich, zobacz Ochrona wpisów tajnych podczas programowania. Aby bezpiecznie przechowywać hasła certyfikatów w środowiskach produkcyjnych, zobacz Dostawca konfiguracji usługi Azure Key Vault. Wpisy tajne programowania nie powinny być używane do produkcji ani testowania.
Wartość domyślna , SslProtocols.None
powoduje Kestrel użycie domyślnych ustawień systemu operacyjnego w celu wybrania najlepszego protokołu. Jeśli nie masz określonego powodu do wybrania protokołu, użyj wartości domyślnej.
Konfigurowanie protokołu HTTPS w kodzie
W przypadku korzystania z interfejsu Listen
API UseHttps metoda rozszerzenia w systemie ListenOptions jest dostępna do skonfigurowania protokołu 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
to ścieżka i nazwa pliku certyfikatu względem katalogu zawierającego pliki zawartości aplikacji.password
to hasło wymagane do uzyskania dostępu do danych certyfikatu X.509.configureOptions
to elementAction
do skonfigurowania elementuHttpsConnectionAdapterOptions
. Zwraca wartośćListenOptions
.storeName
to magazyn certyfikatów, z którego ma być ładowany certyfikat.subject
to nazwa podmiotu certyfikatu.allowInvalid
wskazuje, czy należy wziąć pod uwagę nieprawidłowe certyfikaty, takie jak certyfikaty z podpisem własnym.location
to lokalizacja magazynu do załadowania certyfikatu.serverCertificate
jest certyfikatem X.509.
Aby uzyskać pełną listę UseHttps
przeciążeń, zobacz UseHttps.
Konfigurowanie certyfikatów klienta w kodzie
ClientCertificateMode Konfiguruje wymagania dotyczące certyfikatu klienta.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
listenOptions.ClientCertificateMode = ClientCertificateMode.AllowCertificate;
});
});
Wartość domyślna to NoCertificate, gdzie Kestrel nie żąda ani nie wymaga certyfikatu od klienta.
Aby uzyskać więcej informacji, zobacz Konfigurowanie uwierzytelniania certyfikatów w programie ASP.NET Core.
Konfigurowanie wartości domyślnych protokołu HTTPS w kodzie
ConfigureHttpsDefaults(Action<HttpsConnectionAdapterOptions>) określa konfigurację Action
do uruchomienia dla każdego punktu końcowego HTTPS. Wywołanie ConfigureHttpsDefaults
wiele razy zastępuje poprzednie Action
wystąpienia ostatnim Action
określonym.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
// ...
});
});
Uwaga
Punkty końcowe utworzone przez wywołanie przed wywołaniem ConfigureHttpsDefaults Listen nie będą miały zastosowanych wartości domyślnych.
Konfigurowanie protokołów SSL/TLS w kodzie
Protokoły SSL to protokoły używane do szyfrowania i odszyfrowywania ruchu między dwoma elementami równorzędnymi, tradycyjnie klientem i serwerem.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
listenOptions.SslProtocols = SslProtocols.Tls13;
});
});
Konfigurowanie filtru zestawów szyfrowania TLS w kodzie
W systemie Linux CipherSuitesPolicy można używać do filtrowania uzgadniania protokołu TLS na podstawie połączenia:
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,
// ...
});
};
});
});
Konfigurowanie wskazania nazwy serwera
Wskazanie nazwy serwera (SNI) może służyć do hostowania wielu domen na tym samym adresie IP i porcie. SNI może służyć do oszczędzania zasobów przez obsługę wielu lokacji z jednego serwera.
Aby funkcja SNI działała, klient wysyła nazwę hosta dla bezpiecznej sesji do serwera podczas uzgadniania protokołu TLS, aby serwer mógł dostarczyć prawidłowy certyfikat. Klient używa dostarczonego certyfikatu do zaszyfrowanej komunikacji z serwerem podczas bezpiecznej sesji, która następuje po uzgadnianiu protokołu TLS.
Wszystkie witryny internetowe muszą działać w tym samym Kestrel wystąpieniu. Kestrel nie obsługuje udostępniania adresu IP i portu między wieloma wystąpieniami bez zwrotnego serwera proxy.
SNI można skonfigurować na dwa sposoby:
- Skonfiguruj mapowanie między nazwami hostów i opcjami HTTPS w konfiguracji. Na przykład plik JSON w
appsettings.json
pliku. - Utwórz punkt końcowy w kodzie i wybierz certyfikat przy użyciu nazwy hosta z wywołaniem zwrotnym ServerCertificateSelector .
Konfigurowanie sieci SNI w appsettings.json
Kestrel program obsługuje protokół SNI zdefiniowany w konfiguracji. Punkt końcowy można skonfigurować za pomocą obiektu zawierającego Sni
mapowanie między nazwami hostów i opcjami HTTPS. Nazwa hosta połączenia jest zgodna z opcjami i są one używane dla tego połączenia.
Poniższa konfiguracja dodaje punkt końcowy o nazwie MySniEndpoint
, który używa sieci SNI do wybierania opcji HTTPS na podstawie nazwy hosta:
{
"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$"
}
}
}
}
Ostrzeżenie
W poprzednim przykładzie hasło certyfikatu jest przechowywane w postaci zwykłego tekstu w pliku appsettings.json
. Token $CREDENTIAL_PLACEHOLDER$
jest używany jako symbol zastępczy hasła certyfikatu. Aby bezpiecznie przechowywać hasła certyfikatów w środowiskach deweloperskich, zobacz Ochrona wpisów tajnych podczas programowania. Aby bezpiecznie przechowywać hasła certyfikatów w środowiskach produkcyjnych, zobacz Dostawca konfiguracji usługi Azure Key Vault. Wpisy tajne programowania nie powinny być używane do produkcji ani testowania.
Opcje protokołu HTTPS, które można zastąpić za pomocą sieci SNI:
Certificate
Konfiguruje źródło certyfikatu.Protocols
Konfiguruje dozwolone protokoły HTTP.SslProtocols
Konfiguruje dozwolone protokoły SSL.ClientCertificateMode
Konfiguruje wymagania dotyczące certyfikatu klienta.
Nazwa hosta obsługuje dopasowywanie symboli wieloznacznych:
- Dokładne dopasowanie. Na przykład
a.example.org
pasuje doa.example.org
elementu . - Prefiks symbolu wieloznakowego. Jeśli istnieje wiele dopasowań symboli wieloznacznych, zostanie wybrany najdłuższy wzorzec. Na przykład
*.example.org
dopasowaniab.example.org
ic.example.org
. - Pełne symbole wieloznaczne.
*
dopasowuje wszystkie inne elementy, w tym klientów, którzy nie korzystają z sieci SNI i nie wysyłają nazwy hosta.
Dopasowana konfiguracja SNI jest stosowana do punktu końcowego dla połączenia, przesłaniając wartości w punkcie końcowym. Jeśli połączenie nie jest zgodne ze skonfigurowaną nazwą hosta SNI, połączenie zostanie odrzucone.
Konfigurowanie sieci SNI przy użyciu kodu
Kestrel obsługuje interfejs SNI z kilkoma interfejsami API wywołania zwrotnego:
ServerCertificateSelector
ServerOptionsSelectionCallback
TlsHandshakeCallbackOptions
SNI z ServerCertificateSelector
Kestrel obsługuje funkcję SNI za pośrednictwem wywołania zwrotnego ServerCertificateSelector
. Wywołanie zwrotne jest wywoływane raz na połączenie, aby umożliwić aplikacji sprawdzenie nazwy hosta i wybranie odpowiedniego certyfikatu:
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 z ServerOptionsSelectionCallback
Kestrel obsługuje dodatkową dynamiczną konfigurację protokołu TLS za pośrednictwem wywołania zwrotnego ServerOptionsSelectionCallback
. Wywołanie zwrotne jest wywoływane raz na połączenie, aby umożliwić aplikacji sprawdzenie nazwy hosta i wybranie odpowiedniego certyfikatu i konfiguracji protokołu TLS. Domyślne certyfikaty i ConfigureHttpsDefaults
nie są używane z tym wywołaniem zwrotnym.
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 z TlsHandshakeCallbackOptions
Kestrel obsługuje dodatkową dynamiczną konfigurację protokołu TLS za pośrednictwem wywołania zwrotnego TlsHandshakeCallbackOptions.OnConnection
. Wywołanie zwrotne jest wywoływane raz na połączenie, aby umożliwić aplikacji sprawdzenie nazwy hosta i wybranie odpowiedniego certyfikatu, konfiguracji protokołu TLS i innych opcji serwera. Domyślne certyfikaty i ConfigureHttpsDefaults
nie są używane z tym wywołaniem zwrotnym.
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
});
}
});
});
});
});
Konfigurowanie protokołów HTTP
Kestrel obsługuje wszystkie powszechnie używane wersje PROTOKOŁU HTTP. Punkty końcowe można skonfigurować tak, aby obsługiwały różne wersje PROTOKOŁU HTTP przy użyciu wyliczenia HttpProtocols , które określa dostępne opcje wersji PROTOKOŁU HTTP.
Protokół TLS jest wymagany do obsługi więcej niż jednej wersji protokołu HTTP. Uzgadnianie negocjacji protokołu TLS w warstwie aplikacji (ALPN) służy do negocjowania protokołu połączenia między klientem a serwerem, gdy punkt końcowy obsługuje wiele protokołów.
HttpProtocols wartość |
Dozwolony protokół połączenia |
---|---|
Http1 |
Tylko http/1.1. Może być używany z protokołem TLS lub bez tego protokołu. |
Http2 |
Tylko HTTP/2. Może być używany bez protokołu TLS tylko wtedy, gdy klient obsługuje tryb wcześniejszej wiedzy. |
Http3 |
Tylko http/3. Wymaga protokołu TLS. Może być konieczne skonfigurowanie klienta do używania tylko protokołu HTTP/3. |
Http1AndHttp2 |
HTTP/1.1 i HTTP/2. Protokół HTTP/2 wymaga, aby klient wybrał protokół HTTP/2 w uzgadnianiu protokołu TLS Application-Layer Protocol (ALPN ). W przeciwnym razie połączenie jest domyślnie nawiązane z protokołem HTTP/1.1. |
Http1AndHttp2AndHttp3 |
HTTP/1.1, HTTP/2 i HTTP/3. Pierwsze żądanie klienta zwykle używa protokołu HTTP/1.1 lub HTTP/2, a alt-svc nagłówek odpowiedzi monituje klienta o uaktualnienie do protokołu HTTP/3. Protokół HTTP/2 i HTTP/3 wymaga protokołu TLS; w przeciwnym razie połączenie jest domyślnie ustawione na HTTP/1.1. |
Domyślną wartością protokołu dla punktu końcowego jest HttpProtocols.Http1AndHttp2
.
Ograniczenia protokołu TLS dla protokołu HTTP/2:
- Protokół TLS w wersji 1.2 lub nowszej
- Ponowne negocjowanie jest wyłączone
- Kompresja wyłączona
- Minimalne rozmiary wymiany kluczy efemerycznych:
- Krzywa eliptyczna Diffie-Hellman (ECDHE) [RFC4492]: minimum 224 bitów
- Pole skończone Diffie-Hellman (DHE) [
TLS12
]: minimum 2048 bitów
- Zestaw szyfrowania nie jest zabroniony.
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
[TLS-ECDHE
] z krzywą eliptyczną P-256 [FIPS186
] jest domyślnie obsługiwana.
Konfigurowanie protokołów HTTP w appsettings.json
appsettings.json
Poniższy przykład ustanawia protokół połączenia HTTP/1.1 dla określonego punktu końcowego:
{
"Kestrel": {
"Endpoints": {
"HttpsDefaultCert": {
"Url": "https://localhost:5001",
"Protocols": "Http1"
}
}
}
}
W sekcji można skonfigurować Kestrel:EndpointDefaults
protokół domyślny. appsettings.json
Poniższy przykład ustanawia protokół HTTP/1.1 jako domyślny protokół połączenia dla wszystkich punktów końcowych:
{
"Kestrel": {
"EndpointDefaults": {
"Protocols": "Http1"
}
}
}
Protokoły określone w kodzie zastępują wartości ustawione przez konfigurację.
Konfigurowanie protokołów HTTP w kodzie
ListenOptions.Protocols służy do określania protokołów z wyliczeniem HttpProtocols .
Poniższy przykład umożliwia skonfigurowanie punktu końcowego dla połączeń HTTP/1.1, HTTP/2 i HTTP/3 na porcie 8000. Połączenia są zabezpieczone przez protokół TLS przy użyciu dostarczonego certyfikatu:
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;
});
});
Zobacz też
projekty ASP.NET Core są skonfigurowane tak, aby wiązały się z losowym portem HTTP z zakresu od 5000 do 5300 i losowego portu HTTPS z zakresu od 7000 do 7300. Ta domyślna konfiguracja jest określona w wygenerowanych Properties/launchSettings.json
plikach i może zostać zastąpiona. Jeśli nie określono żadnych portów, Kestrel wiąże się z http://localhost:5000
.
Określ adresy URL przy użyciu:
ASPNETCORE_URLS
zmienna środowiskowa.--urls
argument wiersza polecenia.urls
klucz konfiguracji hosta.- UseUrls metoda rozszerzenia.
Wartość podana przy użyciu tych metod może być co najmniej jednym punktem końcowym HTTP i HTTPS (https, jeśli jest dostępny domyślny certyfikat). Skonfiguruj wartość jako listę rozdzieloną średnikami (na przykład "Urls": "http://localhost:8000;http://localhost:8001"
).
Aby uzyskać więcej informacji na temat tych podejść, zobacz Adresy URL serwera i Konfiguracja zastępowania.
Tworzony jest certyfikat dewelopera:
- Po zainstalowaniu zestawu .NET SDK .
- Narzędzie dev-certs służy do tworzenia certyfikatu.
Certyfikat dewelopera jest dostępny tylko dla użytkownika, który generuje certyfikat. Niektóre przeglądarki wymagają udzielenia jawnego uprawnienia do zaufania lokalnemu certyfikatowi programistycznemu.
Szablony projektów domyślnie konfigurują aplikacje do uruchamiania na protokole HTTPS i obsługują przekierowywanie HTTPS oraz obsługę hsTS.
Wywołaj metodę Listen lub ListenUnixSocket metodę w KestrelServerOptions celu skonfigurowania prefiksów i portów adresu URL dla programu Kestrel.
UseUrls
--urls
, argument wiersza polecenia, urls
klucz konfiguracji hosta i ASPNETCORE_URLS
zmienna środowiskowa również działają, ale mają ograniczenia zanotowany w dalszej części tej sekcji (domyślny certyfikat musi być dostępny dla konfiguracji punktu końcowego HTTPS).
KestrelServerOptions
konfiguracja:
ConfigureEndpointDefaults
ConfigureEndpointDefaults(Action<ListenOptions>) określa konfigurację Action
do uruchomienia dla każdego określonego punktu końcowego. Wywołanie ConfigureEndpointDefaults
wiele razy zastępuje poprzednią Action
wartość z ostatnią Action
określoną wartością:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureEndpointDefaults(listenOptions =>
{
// ...
});
});
Uwaga
Punkty końcowe utworzone przez wywołanie przed wywołaniem ConfigureEndpointDefaults Listen nie będą miały zastosowanych wartości domyślnych.
Configure(IConfiguration)
Kestrel Umożliwia ładowanie punktów końcowych z elementu IConfiguration. Konfiguracja musi być ograniczona do sekcji konfiguracji dla Kestrelelementu . Przeciążenie Configure(IConfiguration, bool)
może służyć do włączania ponownego ładowania punktów końcowych, gdy źródło konfiguracji ulegnie zmianie.
Domyślnie Kestrel konfiguracja jest ładowana z Kestrel
sekcji i ponowne ładowanie zmian jest włączone:
{
"Kestrel": {
"Endpoints": {
"Http": {
"Url": "http://localhost:5000"
},
"Https": {
"Url": "https://localhost:5001"
}
}
}
}
Jeśli konfiguracja ponownego ładowania jest włączona i zostanie zasygnalizowana zmiana, należy wykonać następujące czynności:
- Nowa konfiguracja jest porównywana ze starym, a żaden punkt końcowy bez zmian konfiguracji nie jest modyfikowany.
- Usunięte lub zmodyfikowane punkty końcowe mają 5 sekund na ukończenie przetwarzania żądań i zamknięcie.
- Uruchomiono nowe lub zmodyfikowane punkty końcowe.
Klienci łączący się z zmodyfikowanym punktem końcowym mogą zostać rozłączone lub odrzucone podczas ponownego uruchamiania punktu końcowego.
ConfigureHttpsDefaults
ConfigureHttpsDefaults(Action<HttpsConnectionAdapterOptions>) określa konfigurację Action
do uruchomienia dla każdego punktu końcowego HTTPS. Wywołanie ConfigureHttpsDefaults
wiele razy zastępuje poprzednią Action
wartość z ostatnią Action
określoną wartością.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
// ...
});
});
Uwaga
Punkty końcowe utworzone przez wywołanie przed wywołaniem ConfigureHttpsDefaults Listen nie będą miały zastosowanych wartości domyślnych.
ListenOptions.UseHttps
Skonfiguruj Kestrel do korzystania z protokołu HTTPS.
ListenOptions.UseHttps
Rozszerzenia:
UseHttps
: Skonfiguruj Kestrel do używania protokołu HTTPS z certyfikatem domyślnym. Zgłasza wyjątek, jeśli nie skonfigurowano certyfikatu domyślnego.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
to ścieżka i nazwa pliku certyfikatu względem katalogu zawierającego pliki zawartości aplikacji.password
to hasło wymagane do uzyskania dostępu do danych certyfikatu X.509.configureOptions
to elementAction
do skonfigurowania elementuHttpsConnectionAdapterOptions
. Zwraca wartośćListenOptions
.storeName
to magazyn certyfikatów, z którego ma być ładowany certyfikat.subject
to nazwa podmiotu certyfikatu.allowInvalid
wskazuje, czy należy wziąć pod uwagę nieprawidłowe certyfikaty, takie jak certyfikaty z podpisem własnym.location
to lokalizacja magazynu do załadowania certyfikatu.serverCertificate
jest certyfikatem X.509.
W środowisku produkcyjnym protokół HTTPS musi być jawnie skonfigurowany. Należy podać co najmniej certyfikat domyślny.
Jeśli certyfikaty są odczytywane z dysku, w przeciwieństwie do magazynu certyfikatów systemu Windows, katalog zawierający musi mieć odpowiednie uprawnienia, aby zapobiec nieautoryzowanemu dostępowi.
Obsługiwane konfiguracje opisane w dalszej części:
- Brak konfiguracji
- Zastępowanie domyślnego certyfikatu z konfiguracji
- Zmienianie wartości domyślnych w kodzie
Brak konfiguracji
Kestrelnasłuchuje na .http://localhost:5000
Zastępowanie domyślnego certyfikatu z konfiguracji
Domyślny schemat konfiguracji ustawień aplikacji HTTPS jest dostępny dla programu Kestrel. Skonfiguruj wiele punktów końcowych, w tym adresy URL i certyfikaty do użycia, z pliku na dysku lub z magazynu certyfikatów.
W poniższym appsettings.json
przykładzie:
- Ustaw
AllowInvalid
wartość , abytrue
zezwolić na używanie nieprawidłowych certyfikatów (na przykład certyfikatów z podpisem własnym). - Każdy punkt końcowy HTTPS, który nie określa certyfikatu (
HttpsDefaultCert
w poniższym przykładzie) powraca do certyfikatu zdefiniowanego w ramachCertificates:Default
programu lub certyfikatu programistycznego.
{
"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$"
}
}
}
}
Ostrzeżenie
W poprzednim przykładzie hasła certyfikatu są przechowywane w postaci zwykłego tekstu w pliku appsettings.json
. Token $CREDENTIAL_PLACEHOLDER$
jest używany jako symbol zastępczy dla hasła każdego certyfikatu. Aby bezpiecznie przechowywać hasła certyfikatów w środowiskach deweloperskich, zobacz Ochrona wpisów tajnych podczas programowania. Aby bezpiecznie przechowywać hasła certyfikatów w środowiskach produkcyjnych, zobacz Dostawca konfiguracji usługi Azure Key Vault. Wpisy tajne programowania nie powinny być używane do produkcji ani testowania.
Uwagi dotyczące schematu:
- Nazwy punktów końcowych są niewrażliwe na wielkość liter. Na przykład elementy
HTTPS
iHttps
są równoważne. - Parametr
Url
jest wymagany dla każdego punktu końcowego. Format tego parametru jest taki sam jak parametr konfiguracji najwyższego poziomuUrls
, z wyjątkiem tego, że jest ograniczony do pojedynczej wartości. - Te punkty końcowe zastępują te zdefiniowane w konfiguracji najwyższego poziomu
Urls
, a nie dodawane do nich. Punkty końcowe zdefiniowane w kodzie za pośrednictwemListen
są skumulowane z punktami końcowymi zdefiniowanymi w sekcji konfiguracji. - Sekcja jest opcjonalna
Certificate
.Certificate
Jeśli sekcja nie jest określona, używane są wartości domyślne zdefiniowane wCertificates:Default
. Jeśli nie są dostępne żadne wartości domyślne, używany jest certyfikat dewelopera. Jeśli nie ma żadnych wartości domyślnych i certyfikat programowania nie jest obecny, serwer zgłasza wyjątek i nie można go uruchomić. - Sekcja
Certificate
obsługuje wiele źródeł certyfikatów. - W konfiguracji można zdefiniować dowolną liczbę punktów końcowych, o ile nie powodują konfliktów portów.
Źródła certyfikatów
Węzły certyfikatów można skonfigurować do ładowania certyfikatów z wielu źródeł:
Path
iPassword
do ładowania plików pfx .Path
iKeyPath
do ładowania plików pem.crt/ i .key.Password
Subject
iStore
do załadowania z magazynu certyfikatów.
Na przykład Certificates:Default
certyfikat można określić jako:
"Default": {
"Subject": "<subject; required>",
"Store": "<cert store; required>",
"Location": "<location; defaults to CurrentUser>",
"AllowInvalid": "<true or false; defaults to false>"
}
ConfigurationLoader
Configure(IConfiguration) Metoda zwraca element KestrelConfigurationLoader Endpoint(String, Action<EndpointConfiguration>) z metodą, która może służyć do uzupełnienia ustawień skonfigurowanego punktu końcowego:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
var kestrelSection = context.Configuration.GetSection("Kestrel");
serverOptions.Configure(kestrelSection)
.Endpoint("HTTPS", listenOptions =>
{
// ...
});
});
KestrelServerOptions.ConfigurationLoader
można uzyskać bezpośredni dostęp, aby kontynuować iterowanie istniejącego modułu ładującego, na przykład podane przez WebApplicationBuilder.WebHostusługę .
- Sekcja konfiguracji dla każdego punktu końcowego jest dostępna w opcjach w metodzie
Endpoint
, dzięki czemu ustawienia niestandardowe mogą być odczytywane. - Wiele konfiguracji może zostać załadowanych przez wywołanie Configure(IConfiguration) ponownie innej sekcji. Używana jest tylko ostatnia konfiguracja, chyba że
Load
jest jawnie wywoływana w poprzednich wystąpieniach. Metapakiet nie wywołujeLoad
metody , aby można było zamienić domyślną sekcję konfiguracji. KestrelConfigurationLoader
Dubluje rodzinęListen
interfejsów API zKestrelServerOptions
jakoEndpoint
przeciążeń, więc punkty końcowe kodu i konfiguracji można skonfigurować w tym samym miejscu. Te przeciążenia nie używają nazw i używają tylko ustawień domyślnych z konfiguracji.
Zmienianie wartości domyślnych w kodzie
ConfigureEndpointDefaults
i ConfigureHttpsDefaults
może służyć do zmiany ustawień domyślnych dla ListenOptions
i HttpsConnectionAdapterOptions
, w tym zastąpienia domyślnego certyfikatu określonego w poprzednim scenariuszu. ConfigureEndpointDefaults
i ConfigureHttpsDefaults
powinny być wywoływane przed skonfigurowaniem wszystkich punktów końcowych.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.ConfigureEndpointDefaults(listenOptions =>
{
// ...
});
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
// ...
});
});
Konfigurowanie punktów końcowych przy użyciu wskazania nazwy serwera
Wskazanie nazwy serwera (SNI) może służyć do hostowania wielu domen na tym samym adresie IP i porcie. Aby funkcja SNI działała, klient wysyła nazwę hosta dla bezpiecznej sesji do serwera podczas uzgadniania protokołu TLS, aby serwer mógł dostarczyć prawidłowy certyfikat. Klient używa dostarczonego certyfikatu do zaszyfrowanej komunikacji z serwerem podczas bezpiecznej sesji, która następuje po uzgadnianiu protokołu TLS.
SNI można skonfigurować na dwa sposoby:
- Utwórz punkt końcowy w kodzie i wybierz certyfikat przy użyciu nazwy hosta z wywołaniem zwrotnym ServerCertificateSelector .
- Skonfiguruj mapowanie między nazwami hostów i opcjami HTTPS w konfiguracji. Na przykład plik JSON w
appsettings.json
pliku.
SNI z ServerCertificateSelector
Kestrel obsługuje funkcję SNI za pośrednictwem wywołania zwrotnego ServerCertificateSelector
. Wywołanie zwrotne jest wywoływane raz na połączenie, aby umożliwić aplikacji sprawdzenie nazwy hosta i wybranie odpowiedniego certyfikatu:
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 z ServerOptionsSelectionCallback
Kestrel obsługuje dodatkową dynamiczną konfigurację protokołu TLS za pośrednictwem wywołania zwrotnego ServerOptionsSelectionCallback
. Wywołanie zwrotne jest wywoływane raz na połączenie, aby umożliwić aplikacji sprawdzenie nazwy hosta i wybranie odpowiedniego certyfikatu i konfiguracji protokołu TLS. Domyślne certyfikaty i ConfigureHttpsDefaults
nie są używane z tym wywołaniem zwrotnym.
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 z TlsHandshakeCallbackOptions
Kestrel obsługuje dodatkową dynamiczną konfigurację protokołu TLS za pośrednictwem wywołania zwrotnego TlsHandshakeCallbackOptions.OnConnection
. Wywołanie zwrotne jest wywoływane raz na połączenie, aby umożliwić aplikacji sprawdzenie nazwy hosta i wybranie odpowiedniego certyfikatu, konfiguracji protokołu TLS i innych opcji serwera. Domyślne certyfikaty i ConfigureHttpsDefaults
nie są używane z tym wywołaniem zwrotnym.
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 w konfiguracji
Kestrel program obsługuje protokół SNI zdefiniowany w konfiguracji. Punkt końcowy można skonfigurować za pomocą obiektu zawierającego Sni
mapowanie między nazwami hostów i opcjami HTTPS. Nazwa hosta połączenia jest zgodna z opcjami i są one używane dla tego połączenia.
Poniższa konfiguracja dodaje punkt końcowy o nazwie MySniEndpoint
, który używa sieci SNI do wybierania opcji HTTPS na podstawie nazwy hosta:
{
"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$"
}
}
}
}
Ostrzeżenie
W poprzednim przykładzie hasła certyfikatu są przechowywane w postaci zwykłego tekstu w pliku appsettings.json
. Token $CREDENTIAL_PLACEHOLDER$
jest używany jako symbol zastępczy dla hasła każdego certyfikatu. Aby bezpiecznie przechowywać hasła certyfikatów w środowiskach deweloperskich, zobacz Ochrona wpisów tajnych podczas programowania. Aby bezpiecznie przechowywać hasła certyfikatów w środowiskach produkcyjnych, zobacz Dostawca konfiguracji usługi Azure Key Vault. Wpisy tajne programowania nie powinny być używane do produkcji ani testowania.
Opcje protokołu HTTPS, które można zastąpić za pomocą sieci SNI:
Certificate
Konfiguruje źródło certyfikatu.Protocols
Konfiguruje dozwolone protokoły HTTP.SslProtocols
Konfiguruje dozwolone protokoły SSL.ClientCertificateMode
Konfiguruje wymagania dotyczące certyfikatu klienta.
Nazwa hosta obsługuje dopasowywanie symboli wieloznacznych:
- Dokładne dopasowanie. Na przykład
a.example.org
pasuje doa.example.org
elementu . - Prefiks symbolu wieloznakowego. Jeśli istnieje wiele dopasowań symboli wieloznacznych, zostanie wybrany najdłuższy wzorzec. Na przykład
*.example.org
dopasowaniab.example.org
ic.example.org
. - Pełne symbole wieloznaczne.
*
dopasowuje wszystkie inne elementy, w tym klientów, którzy nie korzystają z sieci SNI i nie wysyłają nazwy hosta.
Dopasowana konfiguracja SNI jest stosowana do punktu końcowego dla połączenia, przesłaniając wartości w punkcie końcowym. Jeśli połączenie nie jest zgodne ze skonfigurowaną nazwą hosta SNI, połączenie zostanie odrzucone.
Wymagania dotyczące interfejsu SNI
Wszystkie witryny internetowe muszą działać w tym samym Kestrel wystąpieniu. Kestrel nie obsługuje udostępniania adresu IP i portu między wieloma wystąpieniami bez zwrotnego serwera proxy.
Protokoły SSL/TLS
Protokoły SSL to protokoły używane do szyfrowania i odszyfrowywania ruchu między dwoma elementami równorzędnymi, tradycyjnie klientem i serwerem.
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$"
}
}
}
}
}
Ostrzeżenie
W poprzednim przykładzie hasło certyfikatu jest przechowywane w postaci zwykłego tekstu w pliku appsettings.json
. Token $CREDENTIAL_PLACEHOLDER$
jest używany jako symbol zastępczy hasła certyfikatu. Aby bezpiecznie przechowywać hasła certyfikatów w środowiskach deweloperskich, zobacz Ochrona wpisów tajnych podczas programowania. Aby bezpiecznie przechowywać hasła certyfikatów w środowiskach produkcyjnych, zobacz Dostawca konfiguracji usługi Azure Key Vault. Wpisy tajne programowania nie powinny być używane do produkcji ani testowania.
Wartość domyślna , SslProtocols.None
powoduje Kestrel użycie domyślnych ustawień systemu operacyjnego w celu wybrania najlepszego protokołu. Jeśli nie masz określonego powodu do wybrania protokołu, użyj wartości domyślnej.
Certyfikaty klienta
ClientCertificateMode
Konfiguruje wymagania dotyczące certyfikatu klienta.
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$"
}
}
}
}
}
Ostrzeżenie
W poprzednim przykładzie hasło certyfikatu jest przechowywane w postaci zwykłego tekstu w pliku appsettings.json
. Token $CREDENTIAL_PLACEHOLDER$
jest używany jako symbol zastępczy hasła certyfikatu. Aby bezpiecznie przechowywać hasła certyfikatów w środowiskach deweloperskich, zobacz Ochrona wpisów tajnych podczas programowania. Aby bezpiecznie przechowywać hasła certyfikatów w środowiskach produkcyjnych, zobacz Dostawca konfiguracji usługi Azure Key Vault.
Wartość domyślna to ClientCertificateMode.NoCertificate
, gdzie Kestrel nie będzie żądać lub wymagać certyfikatu od klienta.
Aby uzyskać więcej informacji, zobacz Konfigurowanie uwierzytelniania certyfikatów w programie ASP.NET Core.
Rejestrowanie połączeń
Wywołaj metodę UseConnectionLogging , aby emitować dzienniki poziomu debugowania dla komunikacji na poziomie bajtów w połączeniu. Rejestrowanie połączeń jest pomocne w rozwiązywaniu problemów z komunikacją niskiego poziomu, na przykład podczas szyfrowania TLS i za serwerami proxy. Jeśli UseConnectionLogging
zostanie umieszczony przed UseHttps
, zaszyfrowany ruch jest rejestrowany. Jeśli UseConnectionLogging
zostanie umieszczony po UseHttps
, odszyfrowany ruch jest rejestrowany. Jest to wbudowane oprogramowanie pośredniczące połączeń.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.Listen(IPAddress.Any, 8000, listenOptions =>
{
listenOptions.UseConnectionLogging();
});
});
Wiązanie z gniazdem TCP
Metoda Listen wiąże się z gniazdem TCP, a opcja lambda zezwala na konfigurację certyfikatu 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");
});
});
W przykładzie skonfigurowaliśmy protokół HTTPS dla punktu końcowego za pomocą polecenia ListenOptions. Użyj tego samego interfejsu API, aby skonfigurować inne Kestrel ustawienia dla określonych punktów końcowych.
W systemie Windows można utworzyć certyfikaty z podpisem własnym przy użyciu New-SelfSignedCertificate
polecenia cmdlet programu PowerShell. Aby zapoznać się z nieobsługiwanym przykładem, zobacz UpdateIISExpressSSLForChrome.ps1
.
W systemach macOS, Linux i Windows można tworzyć certyfikaty przy użyciu protokołu OpenSSL.
Wiązanie z gniazdem systemu Unix
Nasłuchiwanie w gniazdach systemu Unix z ListenUnixSocket ulepszoną wydajnością za pomocą serwera Nginx, jak pokazano w tym przykładzie:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.ListenUnixSocket("/tmp/kestrel-test.sock");
});
- W pliku konfiguracji Nginx ustaw
server
>proxy_pass
>location
wpis na .http://unix:/tmp/{KESTREL SOCKET}:/;
{KESTREL SOCKET}
to nazwa gniazda podanego ListenUnixSocket (na przykładkestrel-test.sock
w poprzednim przykładzie). - Upewnij się, że gniazdo jest zapisywalne przez serwer Nginx (na przykład
chmod go+w /tmp/kestrel-test.sock
).
Port 0
Po określeniu Kestrel numeru 0
portu dynamicznie wiąże się z dostępnym portem. W poniższym przykładzie pokazano, jak określić, który port Kestrel jest powiązany w czasie wykonywania:
app.Run(async (context) =>
{
var serverAddressFeature = context.Features.Get<IServerAddressesFeature>();
if (serverAddressFeature is not null)
{
var listenAddresses = string.Join(", ", serverAddressFeature.Addresses);
// ...
}
});
Dynamiczne powiązanie portu nie jest dostępne w niektórych sytuacjach:
ListenLocalhost
- Powiązanie protokołu HTTP/1.1 lub HTTP/2 opartego na protokole TCP oraz protokołu HTTP/3 opartego na protokole QUIC.
Ograniczenia
Skonfiguruj punkty końcowe przy użyciu następujących metod:
- UseUrls
--urls
argument wiersza poleceniaurls
klucz konfiguracji hostaASPNETCORE_URLS
zmienna środowiskowa
Te metody są przydatne do tworzenia kodu pracy z serwerami innymi niż Kestrel. Należy jednak pamiętać o następujących ograniczeniach:
- Nie można używać protokołu HTTPS z tymi metodami, chyba że w konfiguracji punktu końcowego HTTPS jest udostępniany domyślny certyfikat (na przykład przy użyciu
KestrelServerOptions
konfiguracji lub pliku konfiguracji, jak pokazano wcześniej w tym artykule). - Gdy oba
Listen
metody iUseUrls
są używane jednocześnie,Listen
punkty końcowe zastępująUseUrls
punkty końcowe.
Konfiguracja punktu końcowego usług IIS
W przypadku korzystania z usług IIS powiązania adresów URL dla powiązań przesłaniania usług IIS są ustawiane przez Listen
element lub UseUrls
. Aby uzyskać więcej informacji, zobacz moduł ASP.NET Core.
ListenOptions.Protocols
Właściwość Protocols
ustanawia protokoły HTTP (HttpProtocols
) włączone w punkcie końcowym połączenia lub dla serwera. Przypisz wartość do Protocols
właściwości z wyliczenia HttpProtocols
.
HttpProtocols wartość wyliczenia |
Dozwolony protokół połączenia |
---|---|
Http1 |
Tylko http/1.1. Może być używany z protokołem TLS lub bez tego protokołu. |
Http2 |
Tylko HTTP/2. Może być używany bez protokołu TLS tylko wtedy, gdy klient obsługuje tryb wcześniejszej wiedzy. |
Http3 |
Tylko http/3. Wymaga protokołu TLS. Może być konieczne skonfigurowanie klienta do używania tylko protokołu HTTP/3. |
Http1AndHttp2 |
HTTP/1.1 i HTTP/2. Protokół HTTP/2 wymaga, aby klient wybrał protokół HTTP/2 w uzgadnianiu protokołu TLS Application-Layer Protocol (ALPN ). W przeciwnym razie połączenie jest domyślnie nawiązane z protokołem HTTP/1.1. |
Http1AndHttp2AndHttp3 |
HTTP/1.1, HTTP/2 i HTTP/3. Pierwsze żądanie klienta zwykle używa protokołu HTTP/1.1 lub HTTP/2, a alt-svc nagłówek odpowiedzi monituje klienta o uaktualnienie do protokołu HTTP/3. Protokół HTTP/2 i HTTP/3 wymaga protokołu TLS; w przeciwnym razie połączenie jest domyślnie ustawione na HTTP/1.1. |
Wartość domyślna ListenOptions.Protocols
dla dowolnego punktu końcowego to HttpProtocols.Http1AndHttp2
.
Ograniczenia protokołu TLS dla protokołu HTTP/2:
- Protokół TLS w wersji 1.2 lub nowszej
- Ponowne negocjowanie jest wyłączone
- Kompresja wyłączona
- Minimalne rozmiary wymiany kluczy efemerycznych:
- Krzywa eliptyczna Diffie-Hellman (ECDHE) [RFC4492]: minimum 224 bitów
- Pole skończone Diffie-Hellman (DHE) [
TLS12
]: minimum 2048 bitów
- Zestaw szyfrowania nie jest zabroniony.
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
[TLS-ECDHE
] z krzywą eliptyczną P-256 [FIPS186
] jest domyślnie obsługiwana.
Poniższy przykład zezwala na połączenia HTTP/1.1 i HTTP/2 na porcie 8000. Połączenia są zabezpieczone przez protokół TLS przy użyciu dostarczonego certyfikatu:
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;
});
});
W systemie Linux CipherSuitesPolicy można używać do filtrowania uzgadniania protokołu TLS na podstawie połączenia:
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,
// ...
});
};
});
});
Oprogramowanie pośredniczące połączenia
Niestandardowe oprogramowanie pośredniczące połączenia może filtrować uzgadniania PROTOKOŁU TLS na podstawie połączenia dla określonych szyfrów w razie potrzeby.
Poniższy przykład zgłasza NotSupportedException algorytm szyfrowania, którego aplikacja nie obsługuje. Alternatywnie zdefiniuj i porównaj ITlsHandshakeFeature.CipherAlgorithm je z listą dopuszczalnych zestawów szyfrowania.
Szyfrowanie nie jest używane z algorytmem CipherAlgorithmType.Null szyfrowania.
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();
});
});
});
Ustawianie protokołu HTTP z konfiguracji
Domyślnie Kestrel konfiguracja jest ładowana z Kestrel
sekcji . appsettings.json
Poniższy przykład ustanawia protokół HTTP/1.1 jako domyślny protokół połączenia dla wszystkich punktów końcowych:
{
"Kestrel": {
"EndpointDefaults": {
"Protocols": "Http1"
}
}
}
appsettings.json
Poniższy przykład ustanawia protokół połączenia HTTP/1.1 dla określonego punktu końcowego:
{
"Kestrel": {
"Endpoints": {
"HttpsDefaultCert": {
"Url": "https://localhost:5001",
"Protocols": "Http1"
}
}
}
}
Protokoły określone w kodzie zastępują wartości ustawione przez konfigurację.
Prefiksy adresów URL
W przypadku używania UseUrls
--urls
argumentu wiersza polecenia, urls
klucza konfiguracji hosta lub ASPNETCORE_URLS
zmiennej środowiskowej prefiksy adresów URL mogą mieć dowolny z następujących formatów.
Prawidłowe są tylko prefiksy adresu URL HTTP. Kestrel program nie obsługuje protokołu HTTPS podczas konfigurowania powiązań adresów URL przy użyciu polecenia UseUrls
.
Adres IPv4 z numerem portu
http://65.55.39.10:80/
0.0.0.0
Jest to specjalny przypadek, który wiąże się ze wszystkimi adresami IPv4.Adres IPv6 z numerem portu
http://[0:0:0:0:0:ffff:4137:270a]:80/
[::]
to odpowiednik protokołu IPv6 protokołu IPv40.0.0.0
.Nazwa hosta z numerem portu
http://contoso.com:80/ http://*:80/
Nazwy hostów,
*
i ,+
nie są specjalne. Wszystkie nie rozpoznane jako prawidłowy adres IP lublocalhost
powiązane ze wszystkimi adresami IP IPv4 i IPv6. Aby powiązać różne nazwy hostów z różnymi aplikacjami ASP.NET Core na tym samym porcie, użyj HTTP.sys lub odwrotnego serwera proxy. Przykłady odwrotnego serwera proxy obejmują usługi IIS, Nginx lub Apache.Ostrzeżenie
Hostowanie w konfiguracji zwrotnego serwera proxy wymaga filtrowania hostów.
Nazwa hosta
localhost
z numerem portu lub adresem IP sprzężenia zwrotnego z numerem portuhttp://localhost:5000/ http://127.0.0.1:5000/ http://[::1]:5000/
Gdy
localhost
zostanie określony, Kestrel próbuje powiązać zarówno interfejsy IPv4, jak i IPv6 sprzężenia zwrotnego. Jeśli żądany port jest używany przez inną usługę w interfejsie sprzężenia zwrotnego, Kestrel nie można uruchomić. Jeśli którykolwiek z interfejsów sprzężenia zwrotnego jest niedostępny z jakiegokolwiek innego powodu (najczęściej dlatego, że protokół IPv6 nie jest obsługiwany), Kestrel rejestruje ostrzeżenie.
projekty ASP.NET Core są skonfigurowane tak, aby wiązały się z losowym portem HTTP z zakresu od 5000 do 5300 i losowego portu HTTPS z zakresu od 7000 do 7300. Ta domyślna konfiguracja jest określona w wygenerowanych Properties/launchSettings.json
plikach i może zostać zastąpiona. Jeśli nie określono żadnych portów, Kestrel wiąże się z:
http://localhost:5000
https://localhost:5001
(gdy lokalny certyfikat dewelopera jest obecny)
Określ adresy URL przy użyciu:
ASPNETCORE_URLS
zmienna środowiskowa.--urls
argument wiersza polecenia.urls
klucz konfiguracji hosta.- UseUrls metoda rozszerzenia.
Wartość podana przy użyciu tych metod może być co najmniej jednym punktem końcowym HTTP i HTTPS (https, jeśli jest dostępny domyślny certyfikat). Skonfiguruj wartość jako listę rozdzieloną średnikami (na przykład "Urls": "http://localhost:8000;http://localhost:8001"
).
Aby uzyskać więcej informacji na temat tych podejść, zobacz Adresy URL serwera i Konfiguracja zastępowania.
Tworzony jest certyfikat dewelopera:
- Po zainstalowaniu zestawu .NET SDK .
- Narzędzie dev-certs służy do tworzenia certyfikatu.
Certyfikat dewelopera jest dostępny tylko dla użytkownika, który generuje certyfikat. Niektóre przeglądarki wymagają udzielenia jawnego uprawnienia do zaufania lokalnemu certyfikatowi programistycznemu.
Szablony projektów domyślnie konfigurują aplikacje do uruchamiania na protokole HTTPS i obsługują przekierowywanie HTTPS oraz obsługę hsTS.
Wywołaj metodę Listen lub ListenUnixSocket metodę w KestrelServerOptions celu skonfigurowania prefiksów i portów adresu URL dla programu Kestrel.
UseUrls
--urls
, argument wiersza polecenia, urls
klucz konfiguracji hosta i ASPNETCORE_URLS
zmienna środowiskowa również działają, ale mają ograniczenia zanotowany w dalszej części tej sekcji (domyślny certyfikat musi być dostępny dla konfiguracji punktu końcowego HTTPS).
KestrelServerOptions
konfiguracja:
ConfigureEndpointDefaults
ConfigureEndpointDefaults(Action<ListenOptions>) określa konfigurację Action
do uruchomienia dla każdego określonego punktu końcowego. Wywołanie ConfigureEndpointDefaults
wiele razy zastępuje poprzednią Action
wartość z ostatnią Action
określoną wartością:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureEndpointDefaults(listenOptions =>
{
// ...
});
});
Uwaga
Punkty końcowe utworzone przez wywołanie przed wywołaniem ConfigureEndpointDefaults Listen nie będą miały zastosowanych wartości domyślnych.
Configure(IConfiguration)
Kestrel Umożliwia ładowanie punktów końcowych z elementu IConfiguration. Konfiguracja musi być ograniczona do sekcji konfiguracji dla Kestrelelementu . Przeciążenie Configure(IConfiguration, bool)
może służyć do włączania ponownego ładowania punktów końcowych, gdy źródło konfiguracji ulegnie zmianie.
Domyślnie Kestrel konfiguracja jest ładowana z Kestrel
sekcji i ponowne ładowanie zmian jest włączone:
{
"Kestrel": {
"Endpoints": {
"Http": {
"Url": "http://localhost:5000"
},
"Https": {
"Url": "https://localhost:5001"
}
}
}
}
Jeśli konfiguracja ponownego ładowania jest włączona i zostanie zasygnalizowana zmiana, należy wykonać następujące czynności:
- Nowa konfiguracja jest porównywana ze starym, a żaden punkt końcowy bez zmian konfiguracji nie jest modyfikowany.
- Usunięte lub zmodyfikowane punkty końcowe mają 5 sekund na ukończenie przetwarzania żądań i zamknięcie.
- Uruchomiono nowe lub zmodyfikowane punkty końcowe.
Klienci łączący się z zmodyfikowanym punktem końcowym mogą zostać rozłączone lub odrzucone podczas ponownego uruchamiania punktu końcowego.
ConfigureHttpsDefaults
ConfigureHttpsDefaults(Action<HttpsConnectionAdapterOptions>) określa konfigurację Action
do uruchomienia dla każdego punktu końcowego HTTPS. Wywołanie ConfigureHttpsDefaults
wiele razy zastępuje poprzednią Action
wartość z ostatnią Action
określoną wartością.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
// ...
});
});
Uwaga
Punkty końcowe utworzone przez wywołanie przed wywołaniem ConfigureHttpsDefaults Listen nie będą miały zastosowanych wartości domyślnych.
ListenOptions.UseHttps
Skonfiguruj Kestrel do korzystania z protokołu HTTPS.
ListenOptions.UseHttps
Rozszerzenia:
UseHttps
: Skonfiguruj Kestrel do używania protokołu HTTPS z certyfikatem domyślnym. Zgłasza wyjątek, jeśli nie skonfigurowano certyfikatu domyślnego.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
to ścieżka i nazwa pliku certyfikatu względem katalogu zawierającego pliki zawartości aplikacji.password
to hasło wymagane do uzyskania dostępu do danych certyfikatu X.509.configureOptions
to elementAction
do skonfigurowania elementuHttpsConnectionAdapterOptions
. Zwraca wartośćListenOptions
.storeName
to magazyn certyfikatów, z którego ma być ładowany certyfikat.subject
to nazwa podmiotu certyfikatu.allowInvalid
wskazuje, czy należy wziąć pod uwagę nieprawidłowe certyfikaty, takie jak certyfikaty z podpisem własnym.location
to lokalizacja magazynu do załadowania certyfikatu.serverCertificate
jest certyfikatem X.509.
W środowisku produkcyjnym protokół HTTPS musi być jawnie skonfigurowany. Należy podać co najmniej certyfikat domyślny.
Obsługiwane konfiguracje opisane w dalszej części:
- Brak konfiguracji
- Zastępowanie domyślnego certyfikatu z konfiguracji
- Zmienianie wartości domyślnych w kodzie
Brak konfiguracji
Kestrel nasłuchuje i http://localhost:5000
https://localhost:5001
(jeśli jest dostępny domyślny certyfikat).
Zastępowanie domyślnego certyfikatu z konfiguracji
Domyślny schemat konfiguracji ustawień aplikacji HTTPS jest dostępny dla programu Kestrel. Skonfiguruj wiele punktów końcowych, w tym adresy URL i certyfikaty do użycia, z pliku na dysku lub z magazynu certyfikatów.
W poniższym appsettings.json
przykładzie:
- Ustaw
AllowInvalid
wartość , abytrue
zezwolić na używanie nieprawidłowych certyfikatów (na przykład certyfikatów z podpisem własnym). - Każdy punkt końcowy HTTPS, który nie określa certyfikatu (
HttpsDefaultCert
w poniższym przykładzie) powraca do certyfikatu zdefiniowanego w ramachCertificates:Default
programu lub certyfikatu programistycznego.
{
"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$"
}
}
}
}
Ostrzeżenie
W poprzednim przykładzie hasła certyfikatu są przechowywane w postaci zwykłego tekstu w pliku appsettings.json
. Token $CREDENTIAL_PLACEHOLDER$
jest używany jako symbol zastępczy dla hasła każdego certyfikatu. Aby bezpiecznie przechowywać hasła certyfikatów w środowiskach deweloperskich, zobacz Ochrona wpisów tajnych podczas programowania. Aby bezpiecznie przechowywać hasła certyfikatów w środowiskach produkcyjnych, zobacz Dostawca konfiguracji usługi Azure Key Vault. Wpisy tajne programowania nie powinny być używane do produkcji ani testowania.
Uwagi dotyczące schematu:
- Nazwy punktów końcowych są niewrażliwe na wielkość liter. Na przykład elementy
HTTPS
iHttps
są równoważne. - Parametr
Url
jest wymagany dla każdego punktu końcowego. Format tego parametru jest taki sam jak parametr konfiguracji najwyższego poziomuUrls
, z wyjątkiem tego, że jest ograniczony do pojedynczej wartości. - Te punkty końcowe zastępują te zdefiniowane w konfiguracji najwyższego poziomu
Urls
, a nie dodawane do nich. Punkty końcowe zdefiniowane w kodzie za pośrednictwemListen
są skumulowane z punktami końcowymi zdefiniowanymi w sekcji konfiguracji. - Sekcja jest opcjonalna
Certificate
.Certificate
Jeśli sekcja nie jest określona, używane są wartości domyślne zdefiniowane wCertificates:Default
. Jeśli nie są dostępne żadne wartości domyślne, używany jest certyfikat dewelopera. Jeśli nie ma żadnych wartości domyślnych i certyfikat programowania nie jest obecny, serwer zgłasza wyjątek i nie można go uruchomić. - Sekcja
Certificate
obsługuje wiele źródeł certyfikatów. - W konfiguracji można zdefiniować dowolną liczbę punktów końcowych, o ile nie powodują konfliktów portów.
Źródła certyfikatów
Węzły certyfikatów można skonfigurować do ładowania certyfikatów z wielu źródeł:
Path
iPassword
do ładowania plików pfx .Path
iKeyPath
do ładowania plików pem.crt/ i .key.Password
Subject
iStore
do załadowania z magazynu certyfikatów.
Na przykład Certificates:Default
certyfikat można określić jako:
"Default": {
"Subject": "<subject; required>",
"Store": "<cert store; required>",
"Location": "<location; defaults to CurrentUser>",
"AllowInvalid": "<true or false; defaults to false>"
}
ConfigurationLoader
Configure(IConfiguration) Metoda zwraca element KestrelConfigurationLoader Endpoint(String, Action<EndpointConfiguration>) z metodą, która może służyć do uzupełnienia ustawień skonfigurowanego punktu końcowego:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
var kestrelSection = context.Configuration.GetSection("Kestrel");
serverOptions.Configure(kestrelSection)
.Endpoint("HTTPS", listenOptions =>
{
// ...
});
});
KestrelServerOptions.ConfigurationLoader
można uzyskać bezpośredni dostęp, aby kontynuować iterowanie istniejącego modułu ładującego, na przykład podane przez WebApplicationBuilder.WebHostusługę .
- Sekcja konfiguracji dla każdego punktu końcowego jest dostępna w opcjach w metodzie
Endpoint
, dzięki czemu ustawienia niestandardowe mogą być odczytywane. - Wiele konfiguracji może zostać załadowanych przez wywołanie Configure(IConfiguration) ponownie innej sekcji. Używana jest tylko ostatnia konfiguracja, chyba że
Load
jest jawnie wywoływana w poprzednich wystąpieniach. Metapakiet nie wywołujeLoad
metody , aby można było zamienić domyślną sekcję konfiguracji. KestrelConfigurationLoader
Dubluje rodzinęListen
interfejsów API zKestrelServerOptions
jakoEndpoint
przeciążeń, więc punkty końcowe kodu i konfiguracji można skonfigurować w tym samym miejscu. Te przeciążenia nie używają nazw i używają tylko ustawień domyślnych z konfiguracji.
Zmienianie wartości domyślnych w kodzie
ConfigureEndpointDefaults
i ConfigureHttpsDefaults
może służyć do zmiany ustawień domyślnych dla ListenOptions
i HttpsConnectionAdapterOptions
, w tym zastąpienia domyślnego certyfikatu określonego w poprzednim scenariuszu. ConfigureEndpointDefaults
i ConfigureHttpsDefaults
powinny być wywoływane przed skonfigurowaniem wszystkich punktów końcowych.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.ConfigureEndpointDefaults(listenOptions =>
{
// ...
});
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
// ...
});
});
Konfigurowanie punktów końcowych przy użyciu wskazania nazwy serwera
Wskazanie nazwy serwera (SNI) może służyć do hostowania wielu domen na tym samym adresie IP i porcie. Aby funkcja SNI działała, klient wysyła nazwę hosta dla bezpiecznej sesji do serwera podczas uzgadniania protokołu TLS, aby serwer mógł dostarczyć prawidłowy certyfikat. Klient używa dostarczonego certyfikatu do zaszyfrowanej komunikacji z serwerem podczas bezpiecznej sesji, która następuje po uzgadnianiu protokołu TLS.
SNI można skonfigurować na dwa sposoby:
- Utwórz punkt końcowy w kodzie i wybierz certyfikat przy użyciu nazwy hosta z wywołaniem zwrotnym ServerCertificateSelector .
- Skonfiguruj mapowanie między nazwami hostów i opcjami HTTPS w konfiguracji. Na przykład plik JSON w
appsettings.json
pliku.
SNI z ServerCertificateSelector
Kestrel obsługuje funkcję SNI za pośrednictwem wywołania zwrotnego ServerCertificateSelector
. Wywołanie zwrotne jest wywoływane raz na połączenie, aby umożliwić aplikacji sprawdzenie nazwy hosta i wybranie odpowiedniego certyfikatu:
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 z ServerOptionsSelectionCallback
Kestrel obsługuje dodatkową dynamiczną konfigurację protokołu TLS za pośrednictwem wywołania zwrotnego ServerOptionsSelectionCallback
. Wywołanie zwrotne jest wywoływane raz na połączenie, aby umożliwić aplikacji sprawdzenie nazwy hosta i wybranie odpowiedniego certyfikatu i konfiguracji protokołu TLS. Domyślne certyfikaty i ConfigureHttpsDefaults
nie są używane z tym wywołaniem zwrotnym.
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 z TlsHandshakeCallbackOptions
Kestrel obsługuje dodatkową dynamiczną konfigurację protokołu TLS za pośrednictwem wywołania zwrotnego TlsHandshakeCallbackOptions.OnConnection
. Wywołanie zwrotne jest wywoływane raz na połączenie, aby umożliwić aplikacji sprawdzenie nazwy hosta i wybranie odpowiedniego certyfikatu, konfiguracji protokołu TLS i innych opcji serwera. Domyślne certyfikaty i ConfigureHttpsDefaults
nie są używane z tym wywołaniem zwrotnym.
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 w konfiguracji
Kestrel program obsługuje protokół SNI zdefiniowany w konfiguracji. Punkt końcowy można skonfigurować za pomocą obiektu zawierającego Sni
mapowanie między nazwami hostów i opcjami HTTPS. Nazwa hosta połączenia jest zgodna z opcjami i są one używane dla tego połączenia.
Poniższa konfiguracja dodaje punkt końcowy o nazwie MySniEndpoint
, który używa sieci SNI do wybierania opcji HTTPS na podstawie nazwy hosta:
{
"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$"
}
}
}
}
Ostrzeżenie
W poprzednim przykładzie hasła certyfikatu są przechowywane w postaci zwykłego tekstu w pliku appsettings.json
. Token $CREDENTIAL_PLACEHOLDER$
jest używany jako symbol zastępczy dla hasła każdego certyfikatu. Aby bezpiecznie przechowywać hasła certyfikatów w środowiskach deweloperskich, zobacz Ochrona wpisów tajnych podczas programowania. Aby bezpiecznie przechowywać hasła certyfikatów w środowiskach produkcyjnych, zobacz Dostawca konfiguracji usługi Azure Key Vault. Wpisy tajne programowania nie powinny być używane do produkcji ani testowania.
Opcje protokołu HTTPS, które można zastąpić za pomocą sieci SNI:
Certificate
Konfiguruje źródło certyfikatu.Protocols
Konfiguruje dozwolone protokoły HTTP.SslProtocols
Konfiguruje dozwolone protokoły SSL.ClientCertificateMode
Konfiguruje wymagania dotyczące certyfikatu klienta.
Nazwa hosta obsługuje dopasowywanie symboli wieloznacznych:
- Dokładne dopasowanie. Na przykład
a.example.org
pasuje doa.example.org
elementu . - Prefiks symbolu wieloznakowego. Jeśli istnieje wiele dopasowań symboli wieloznacznych, zostanie wybrany najdłuższy wzorzec. Na przykład
*.example.org
dopasowaniab.example.org
ic.example.org
. - Pełne symbole wieloznaczne.
*
dopasowuje wszystkie inne elementy, w tym klientów, którzy nie korzystają z sieci SNI i nie wysyłają nazwy hosta.
Dopasowana konfiguracja SNI jest stosowana do punktu końcowego dla połączenia, przesłaniając wartości w punkcie końcowym. Jeśli połączenie nie jest zgodne ze skonfigurowaną nazwą hosta SNI, połączenie zostanie odrzucone.
Wymagania dotyczące interfejsu SNI
Wszystkie witryny internetowe muszą działać w tym samym Kestrel wystąpieniu. Kestrel nie obsługuje udostępniania adresu IP i portu między wieloma wystąpieniami bez zwrotnego serwera proxy.
Protokoły SSL/TLS
Protokoły SSL to protokoły używane do szyfrowania i odszyfrowywania ruchu między dwoma elementami równorzędnymi, tradycyjnie klientem i serwerem.
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$"
}
}
}
}
}
Ostrzeżenie
W poprzednim przykładzie hasło certyfikatu jest przechowywane w postaci zwykłego tekstu w pliku appsettings.json
. Token $CREDENTIAL_PLACEHOLDER$
jest używany jako symbol zastępczy hasła certyfikatu. Aby bezpiecznie przechowywać hasła certyfikatów w środowiskach deweloperskich, zobacz Ochrona wpisów tajnych podczas programowania. Aby bezpiecznie przechowywać hasła certyfikatów w środowiskach produkcyjnych, zobacz Dostawca konfiguracji usługi Azure Key Vault. Wpisy tajne programowania nie powinny być używane do produkcji ani testowania.
Wartość domyślna , SslProtocols.None
powoduje Kestrel użycie domyślnych ustawień systemu operacyjnego w celu wybrania najlepszego protokołu. Jeśli nie masz określonego powodu do wybrania protokołu, użyj wartości domyślnej.
Certyfikaty klienta
ClientCertificateMode
Konfiguruje wymagania dotyczące certyfikatu klienta.
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$"
}
}
}
}
}
Ostrzeżenie
W poprzednim przykładzie hasło certyfikatu jest przechowywane w postaci zwykłego tekstu w pliku appsettings.json
. Token $CREDENTIAL_PLACEHOLDER$
jest używany jako symbol zastępczy hasła certyfikatu. Aby bezpiecznie przechowywać hasła certyfikatów w środowiskach deweloperskich, zobacz Ochrona wpisów tajnych podczas programowania. Aby bezpiecznie przechowywać hasła certyfikatów w środowiskach produkcyjnych, zobacz Dostawca konfiguracji usługi Azure Key Vault.
Wartość domyślna to ClientCertificateMode.NoCertificate
, gdzie Kestrel nie będzie żądać lub wymagać certyfikatu od klienta.
Aby uzyskać więcej informacji, zobacz Konfigurowanie uwierzytelniania certyfikatów w programie ASP.NET Core.
Rejestrowanie połączeń
Wywołaj metodę UseConnectionLogging , aby emitować dzienniki poziomu debugowania dla komunikacji na poziomie bajtów w połączeniu. Rejestrowanie połączeń jest pomocne w rozwiązywaniu problemów z komunikacją niskiego poziomu, na przykład podczas szyfrowania TLS i za serwerami proxy. Jeśli UseConnectionLogging
zostanie umieszczony przed UseHttps
, zaszyfrowany ruch jest rejestrowany. Jeśli UseConnectionLogging
zostanie umieszczony po UseHttps
, odszyfrowany ruch jest rejestrowany. Jest to wbudowane oprogramowanie pośredniczące połączeń.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.Listen(IPAddress.Any, 8000, listenOptions =>
{
listenOptions.UseConnectionLogging();
});
});
Wiązanie z gniazdem TCP
Metoda Listen wiąże się z gniazdem TCP, a opcja lambda zezwala na konfigurację certyfikatu 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");
});
});
W przykładzie skonfigurowaliśmy protokół HTTPS dla punktu końcowego za pomocą polecenia ListenOptions. Użyj tego samego interfejsu API, aby skonfigurować inne Kestrel ustawienia dla określonych punktów końcowych.
W systemie Windows można utworzyć certyfikaty z podpisem własnym przy użyciu New-SelfSignedCertificate
polecenia cmdlet programu PowerShell. Aby zapoznać się z nieobsługiwanym przykładem, zobacz UpdateIISExpressSSLForChrome.ps1
.
W systemach macOS, Linux i Windows można tworzyć certyfikaty przy użyciu protokołu OpenSSL.
Wiązanie z gniazdem systemu Unix
Nasłuchiwanie w gniazdach systemu Unix z ListenUnixSocket ulepszoną wydajnością za pomocą serwera Nginx, jak pokazano w tym przykładzie:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.ListenUnixSocket("/tmp/kestrel-test.sock");
});
- W pliku konfiguracji Nginx ustaw
server
>proxy_pass
>location
wpis na .http://unix:/tmp/{KESTREL SOCKET}:/;
{KESTREL SOCKET}
to nazwa gniazda podanego ListenUnixSocket (na przykładkestrel-test.sock
w poprzednim przykładzie). - Upewnij się, że gniazdo jest zapisywalne przez serwer Nginx (na przykład
chmod go+w /tmp/kestrel-test.sock
).
Port 0
Po określeniu Kestrel numeru 0
portu dynamicznie wiąże się z dostępnym portem. W poniższym przykładzie pokazano, jak określić, który port Kestrel jest powiązany w czasie wykonywania:
app.Run(async (context) =>
{
var serverAddressFeature = context.Features.Get<IServerAddressesFeature>();
if (serverAddressFeature is not null)
{
var listenAddresses = string.Join(", ", serverAddressFeature.Addresses);
// ...
}
});
Ograniczenia
Skonfiguruj punkty końcowe przy użyciu następujących metod:
- UseUrls
--urls
argument wiersza poleceniaurls
klucz konfiguracji hostaASPNETCORE_URLS
zmienna środowiskowa
Te metody są przydatne do tworzenia kodu pracy z serwerami innymi niż Kestrel. Należy jednak pamiętać o następujących ograniczeniach:
- Nie można używać protokołu HTTPS z tymi metodami, chyba że w konfiguracji punktu końcowego HTTPS jest udostępniany domyślny certyfikat (na przykład przy użyciu
KestrelServerOptions
konfiguracji lub pliku konfiguracji, jak pokazano wcześniej w tym artykule). - Gdy oba
Listen
metody iUseUrls
są używane jednocześnie,Listen
punkty końcowe zastępująUseUrls
punkty końcowe.
Konfiguracja punktu końcowego usług IIS
W przypadku korzystania z usług IIS powiązania adresów URL dla powiązań przesłaniania usług IIS są ustawiane przez Listen
element lub UseUrls
. Aby uzyskać więcej informacji, zobacz moduł ASP.NET Core.
ListenOptions.Protocols
Właściwość Protocols
ustanawia protokoły HTTP (HttpProtocols
) włączone w punkcie końcowym połączenia lub dla serwera. Przypisz wartość do Protocols
właściwości z wyliczenia HttpProtocols
.
HttpProtocols wartość wyliczenia |
Dozwolony protokół połączenia |
---|---|
Http1 |
Tylko http/1.1. Może być używany z protokołem TLS lub bez tego protokołu. |
Http2 |
Tylko HTTP/2. Może być używany bez protokołu TLS tylko wtedy, gdy klient obsługuje tryb wcześniejszej wiedzy. |
Http1AndHttp2 |
HTTP/1.1 i HTTP/2. Protokół HTTP/2 wymaga, aby klient wybrał protokół HTTP/2 w uzgadnianiu protokołu TLS Application-Layer Protocol (ALPN ). W przeciwnym razie połączenie jest domyślnie nawiązane z protokołem HTTP/1.1. |
Wartość domyślna ListenOptions.Protocols
dla dowolnego punktu końcowego to HttpProtocols.Http1AndHttp2
.
Ograniczenia protokołu TLS dla protokołu HTTP/2:
- Protokół TLS w wersji 1.2 lub nowszej
- Ponowne negocjowanie jest wyłączone
- Kompresja wyłączona
- Minimalne rozmiary wymiany kluczy efemerycznych:
- Krzywa eliptyczna Diffie-Hellman (ECDHE) [RFC4492]: minimum 224 bitów
- Pole skończone Diffie-Hellman (DHE) [
TLS12
]: minimum 2048 bitów
- Zestaw szyfrowania nie jest zabroniony.
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
[TLS-ECDHE
] z krzywą eliptyczną P-256 [FIPS186
] jest domyślnie obsługiwana.
Poniższy przykład zezwala na połączenia HTTP/1.1 i HTTP/2 na porcie 8000. Połączenia są zabezpieczone przez protokół TLS przy użyciu dostarczonego certyfikatu:
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;
});
});
W systemie Linux CipherSuitesPolicy można używać do filtrowania uzgadniania protokołu TLS na podstawie połączenia:
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,
// ...
});
};
});
});
Oprogramowanie pośredniczące połączenia
Niestandardowe oprogramowanie pośredniczące połączenia może filtrować uzgadniania PROTOKOŁU TLS na podstawie połączenia dla określonych szyfrów w razie potrzeby.
Poniższy przykład zgłasza NotSupportedException algorytm szyfrowania, którego aplikacja nie obsługuje. Alternatywnie zdefiniuj i porównaj ITlsHandshakeFeature.CipherAlgorithm je z listą dopuszczalnych zestawów szyfrowania.
Szyfrowanie nie jest używane z algorytmem CipherAlgorithmType.Null szyfrowania.
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();
});
});
});
Ustawianie protokołu HTTP z konfiguracji
Domyślnie Kestrel konfiguracja jest ładowana z Kestrel
sekcji . appsettings.json
Poniższy przykład ustanawia protokół HTTP/1.1 jako domyślny protokół połączenia dla wszystkich punktów końcowych:
{
"Kestrel": {
"EndpointDefaults": {
"Protocols": "Http1"
}
}
}
appsettings.json
Poniższy przykład ustanawia protokół połączenia HTTP/1.1 dla określonego punktu końcowego:
{
"Kestrel": {
"Endpoints": {
"HttpsDefaultCert": {
"Url": "https://localhost:5001",
"Protocols": "Http1"
}
}
}
}
Protokoły określone w kodzie zastępują wartości ustawione przez konfigurację.
Prefiksy adresów URL
W przypadku używania UseUrls
--urls
argumentu wiersza polecenia, urls
klucza konfiguracji hosta lub ASPNETCORE_URLS
zmiennej środowiskowej prefiksy adresów URL mogą mieć dowolny z następujących formatów.
Prawidłowe są tylko prefiksy adresu URL HTTP. Kestrel program nie obsługuje protokołu HTTPS podczas konfigurowania powiązań adresów URL przy użyciu polecenia UseUrls
.
Adres IPv4 z numerem portu
http://65.55.39.10:80/
0.0.0.0
Jest to specjalny przypadek, który wiąże się ze wszystkimi adresami IPv4.Adres IPv6 z numerem portu
http://[0:0:0:0:0:ffff:4137:270a]:80/
[::]
to odpowiednik protokołu IPv6 protokołu IPv40.0.0.0
.Nazwa hosta z numerem portu
http://contoso.com:80/ http://*:80/
Nazwy hostów,
*
i ,+
nie są specjalne. Wszystkie nie rozpoznane jako prawidłowy adres IP lublocalhost
powiązane ze wszystkimi adresami IP IPv4 i IPv6. Aby powiązać różne nazwy hostów z różnymi aplikacjami ASP.NET Core na tym samym porcie, użyj HTTP.sys lub odwrotnego serwera proxy. Przykłady odwrotnego serwera proxy obejmują usługi IIS, Nginx lub Apache.Ostrzeżenie
Hostowanie w konfiguracji zwrotnego serwera proxy wymaga filtrowania hostów.
Nazwa hosta
localhost
z numerem portu lub adresem IP sprzężenia zwrotnego z numerem portuhttp://localhost:5000/ http://127.0.0.1:5000/ http://[::1]:5000/
Gdy
localhost
zostanie określony, Kestrel próbuje powiązać zarówno interfejsy IPv4, jak i IPv6 sprzężenia zwrotnego. Jeśli żądany port jest używany przez inną usługę w interfejsie sprzężenia zwrotnego, Kestrel nie można uruchomić. Jeśli którykolwiek z interfejsów sprzężenia zwrotnego jest niedostępny z jakiegokolwiek innego powodu (najczęściej dlatego, że protokół IPv6 nie jest obsługiwany), Kestrel rejestruje ostrzeżenie.
Domyślnie ASP.NET Core wiąże się z:
http://localhost:5000
https://localhost:5001
(gdy lokalny certyfikat dewelopera jest obecny)
Określ adresy URL przy użyciu:
ASPNETCORE_URLS
zmienna środowiskowa.--urls
argument wiersza polecenia.urls
klucz konfiguracji hosta.- UseUrls metoda rozszerzenia.
Wartość podana przy użyciu tych metod może być co najmniej jednym punktem końcowym HTTP i HTTPS (https, jeśli jest dostępny domyślny certyfikat). Skonfiguruj wartość jako listę rozdzieloną średnikami (na przykład "Urls": "http://localhost:8000;http://localhost:8001"
).
Aby uzyskać więcej informacji na temat tych podejść, zobacz Adresy URL serwera i Konfiguracja zastępowania.
Tworzony jest certyfikat dewelopera:
- Po zainstalowaniu zestawu .NET SDK .
- Narzędzie dev-certs służy do tworzenia certyfikatu.
Niektóre przeglądarki wymagają udzielenia jawnego uprawnienia do zaufania lokalnemu certyfikatowi programistycznemu.
Szablony projektów domyślnie konfigurują aplikacje do uruchamiania na protokole HTTPS i obsługują przekierowywanie HTTPS oraz obsługę hsTS.
Wywołaj metodę Listen lub ListenUnixSocket metodę w KestrelServerOptions celu skonfigurowania prefiksów i portów adresu URL dla programu Kestrel.
UseUrls
--urls
, argument wiersza polecenia, urls
klucz konfiguracji hosta i ASPNETCORE_URLS
zmienna środowiskowa również działają, ale mają ograniczenia zanotowany w dalszej części tej sekcji (domyślny certyfikat musi być dostępny dla konfiguracji punktu końcowego HTTPS).
KestrelServerOptions
konfiguracja:
ConfigureEndpointDefaults
ConfigureEndpointDefaults(Action<ListenOptions>) określa konfigurację Action
do uruchomienia dla każdego określonego punktu końcowego. Wywołanie ConfigureEndpointDefaults
wiele razy zastępuje poprzednią Action
wartość z ostatnią Action
określoną wartością.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureEndpointDefaults(listenOptions =>
{
// Configure endpoint defaults
});
});
Uwaga
Punkty końcowe utworzone przez wywołanie przed wywołaniem ConfigureEndpointDefaults Listen nie będą miały zastosowanych wartości domyślnych.
Configure(IConfiguration)
Kestrel Umożliwia ładowanie punktów końcowych z elementu IConfiguration. Konfiguracja musi być ograniczona do sekcji konfiguracji dla Kestrelelementu .
Przeciążenie Configure(IConfiguration, bool)
może służyć do włączania ponownego ładowania punktów końcowych, gdy źródło konfiguracji ulegnie zmianie.
IHostBuilder.ConfigureWebHostDefaults
wywołania Configure(context.Configuration.GetSection("Kestrel"), reloadOnChange: true)
domyślnie ładują konfigurację Kestrel i włączają ponowne ładowanie.
{
"Kestrel": {
"Endpoints": {
"Http": {
"Url": "http://localhost:5000"
},
"Https": {
"Url": "https://localhost:5001"
}
}
}
}
Jeśli konfiguracja ponownego ładowania jest włączona i zostanie zasygnalizowana zmiana, należy wykonać następujące czynności:
- Nowa konfiguracja jest porównywana ze starym, a żaden punkt końcowy bez zmian konfiguracji nie jest modyfikowany.
- Usunięte lub zmodyfikowane punkty końcowe mają 5 sekund na ukończenie przetwarzania żądań i zamknięcie.
- Uruchomiono nowe lub zmodyfikowane punkty końcowe.
Klienci łączący się z zmodyfikowanym punktem końcowym mogą zostać rozłączone lub odrzucone podczas ponownego uruchamiania punktu końcowego.
ConfigureHttpsDefaults
ConfigureHttpsDefaults(Action<HttpsConnectionAdapterOptions>) określa konfigurację Action
do uruchomienia dla każdego punktu końcowego HTTPS. Wywołanie ConfigureHttpsDefaults
wiele razy zastępuje poprzednią Action
wartość z ostatnią Action
określoną wartością.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
// certificate is an X509Certificate2
listenOptions.ServerCertificate = certificate;
});
});
Uwaga
Punkty końcowe utworzone przez wywołanie przed wywołaniem ConfigureHttpsDefaults Listen nie będą miały zastosowanych wartości domyślnych.
ListenOptions.UseHttps
Skonfiguruj Kestrel do korzystania z protokołu HTTPS.
ListenOptions.UseHttps
Rozszerzenia:
UseHttps
: Skonfiguruj Kestrel do używania protokołu HTTPS z certyfikatem domyślnym. Zgłasza wyjątek, jeśli nie skonfigurowano certyfikatu domyślnego.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
to ścieżka i nazwa pliku certyfikatu względem katalogu zawierającego pliki zawartości aplikacji.password
to hasło wymagane do uzyskania dostępu do danych certyfikatu X.509.configureOptions
to elementAction
do skonfigurowania elementuHttpsConnectionAdapterOptions
. Zwraca wartośćListenOptions
.storeName
to magazyn certyfikatów, z którego ma być ładowany certyfikat.subject
to nazwa podmiotu certyfikatu.allowInvalid
wskazuje, czy należy wziąć pod uwagę nieprawidłowe certyfikaty, takie jak certyfikaty z podpisem własnym.location
to lokalizacja magazynu do załadowania certyfikatu.serverCertificate
jest certyfikatem X.509.
W środowisku produkcyjnym protokół HTTPS musi być jawnie skonfigurowany. Należy podać co najmniej certyfikat domyślny.
Obsługiwane konfiguracje opisane w dalszej części:
- Brak konfiguracji
- Zastępowanie domyślnego certyfikatu z konfiguracji
- Zmienianie wartości domyślnych w kodzie
Brak konfiguracji
Kestrel nasłuchuje i http://localhost:5000
https://localhost:5001
(jeśli jest dostępny domyślny certyfikat).
Zastępowanie domyślnego certyfikatu z konfiguracji
Domyślny schemat konfiguracji ustawień aplikacji HTTPS jest dostępny dla programu Kestrel. Skonfiguruj wiele punktów końcowych, w tym adresy URL i certyfikaty do użycia, z pliku na dysku lub z magazynu certyfikatów.
W poniższym appsettings.json
przykładzie:
- Ustaw
AllowInvalid
wartość , abytrue
zezwolić na używanie nieprawidłowych certyfikatów (na przykład certyfikatów z podpisem własnym). - Każdy punkt końcowy HTTPS, który nie określa certyfikatu (
HttpsDefaultCert
w poniższym przykładzie) powraca do certyfikatu zdefiniowanego w ramachCertificates:Default
programu lub certyfikatu programistycznego.
{
"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$"
}
}
}
}
Ostrzeżenie
W poprzednim przykładzie hasła certyfikatu są przechowywane w postaci zwykłego tekstu w pliku appsettings.json
. Token $CREDENTIAL_PLACEHOLDER$
jest używany jako symbol zastępczy dla hasła każdego certyfikatu. Aby bezpiecznie przechowywać hasła certyfikatów w środowiskach deweloperskich, zobacz Ochrona wpisów tajnych podczas programowania. Aby bezpiecznie przechowywać hasła certyfikatów w środowiskach produkcyjnych, zobacz Dostawca konfiguracji usługi Azure Key Vault. Wpisy tajne programowania nie powinny być używane do produkcji ani testowania.
Uwagi dotyczące schematu:
- Nazwy punktów końcowych są niewrażliwe na wielkość liter. Na przykład elementy
HTTPS
iHttps
są równoważne. - Parametr
Url
jest wymagany dla każdego punktu końcowego. Format tego parametru jest taki sam jak parametr konfiguracji najwyższego poziomuUrls
, z wyjątkiem tego, że jest ograniczony do pojedynczej wartości. - Te punkty końcowe zastępują te zdefiniowane w konfiguracji najwyższego poziomu
Urls
, a nie dodawane do nich. Punkty końcowe zdefiniowane w kodzie za pośrednictwemListen
są skumulowane z punktami końcowymi zdefiniowanymi w sekcji konfiguracji. - Sekcja jest opcjonalna
Certificate
.Certificate
Jeśli sekcja nie jest określona, używane są wartości domyślne zdefiniowane wCertificates:Default
. Jeśli nie są dostępne żadne wartości domyślne, używany jest certyfikat dewelopera. Jeśli nie ma żadnych wartości domyślnych i certyfikat programowania nie jest obecny, serwer zgłasza wyjątek i nie można go uruchomić. - Sekcja
Certificate
obsługuje wiele źródeł certyfikatów. - W konfiguracji można zdefiniować dowolną liczbę punktów końcowych, o ile nie powodują konfliktów portów.
Źródła certyfikatów
Węzły certyfikatów można skonfigurować do ładowania certyfikatów z wielu źródeł:
Path
iPassword
do ładowania plików pfx .Path
iKeyPath
do ładowania plików pem.crt/ i .key.Password
Subject
iStore
do załadowania z magazynu certyfikatów.
Na przykład Certificates:Default
certyfikat można określić jako:
"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}"))
Metoda zwraca element KestrelConfigurationLoader .Endpoint(string name, listenOptions => { })
z metodą, która może służyć do uzupełnienia ustawień skonfigurowanego punktu końcowego:
webBuilder.UseKestrel((context, serverOptions) =>
{
serverOptions.Configure(context.Configuration.GetSection("Kestrel"))
.Endpoint("HTTPS", listenOptions =>
{
listenOptions.HttpsOptions.SslProtocols = SslProtocols.Tls12;
});
});
KestrelServerOptions.ConfigurationLoader
można uzyskać bezpośredni dostęp, aby kontynuować iterowanie istniejącego modułu ładującego, na przykład podane przez CreateDefaultBuilderusługę .
- Sekcja konfiguracji dla każdego punktu końcowego jest dostępna w opcjach w metodzie
Endpoint
, dzięki czemu ustawienia niestandardowe mogą być odczytywane. - Wiele konfiguracji może zostać załadowanych przez wywołanie
options.Configure(context.Configuration.GetSection("{SECTION}"))
ponownie innej sekcji. Używana jest tylko ostatnia konfiguracja, chyba żeLoad
jest jawnie wywoływana w poprzednich wystąpieniach. Metapakiet nie wywołujeLoad
metody , aby można było zamienić domyślną sekcję konfiguracji. KestrelConfigurationLoader
Dubluje rodzinęListen
interfejsów API zKestrelServerOptions
jakoEndpoint
przeciążeń, więc punkty końcowe kodu i konfiguracji można skonfigurować w tym samym miejscu. Te przeciążenia nie używają nazw i używają tylko ustawień domyślnych z konfiguracji.
Zmienianie wartości domyślnych w kodzie
ConfigureEndpointDefaults
i ConfigureHttpsDefaults
może służyć do zmiany ustawień domyślnych dla ListenOptions
i HttpsConnectionAdapterOptions
, w tym zastąpienia domyślnego certyfikatu określonego w poprzednim scenariuszu. ConfigureEndpointDefaults
i ConfigureHttpsDefaults
powinny być wywoływane przed skonfigurowaniem wszystkich punktów końcowych.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureEndpointDefaults(listenOptions =>
{
// Configure endpoint defaults
});
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
listenOptions.SslProtocols = SslProtocols.Tls12;
});
});
Konfigurowanie punktów końcowych przy użyciu wskazania nazwy serwera
Wskazanie nazwy serwera (SNI) może służyć do hostowania wielu domen na tym samym adresie IP i porcie. Aby funkcja SNI działała, klient wysyła nazwę hosta dla bezpiecznej sesji do serwera podczas uzgadniania protokołu TLS, aby serwer mógł dostarczyć prawidłowy certyfikat. Klient używa dostarczonego certyfikatu do zaszyfrowanej komunikacji z serwerem podczas bezpiecznej sesji, która następuje po uzgadnianiu protokołu TLS.
SNI można skonfigurować na dwa sposoby:
- Utwórz punkt końcowy w kodzie i wybierz certyfikat przy użyciu nazwy hosta z wywołaniem zwrotnym ServerCertificateSelector .
- Skonfiguruj mapowanie między nazwami hostów i opcjami HTTPS w konfiguracji. Na przykład plik JSON w
appsettings.json
pliku.
SNI z ServerCertificateSelector
Kestrel obsługuje funkcję SNI za pośrednictwem wywołania zwrotnego ServerCertificateSelector
. Wywołanie zwrotne jest wywoływane raz na połączenie, aby umożliwić aplikacji sprawdzenie nazwy hosta i wybranie odpowiedniego certyfikatu. W wywołaniu metody pliku projektu Program.cs
można użyć ConfigureWebHostDefaults
następującego kodu wywołania zwrotnego:
// 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 z ServerOptionsSelectionCallback
Kestrel obsługuje dodatkową dynamiczną konfigurację protokołu TLS za pośrednictwem wywołania zwrotnego ServerOptionsSelectionCallback
. Wywołanie zwrotne jest wywoływane raz na połączenie, aby umożliwić aplikacji sprawdzenie nazwy hosta i wybranie odpowiedniego certyfikatu i konfiguracji protokołu TLS. Domyślne certyfikaty i ConfigureHttpsDefaults
nie są używane z tym wywołaniem zwrotnym.
// 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 w konfiguracji
Kestrel program obsługuje protokół SNI zdefiniowany w konfiguracji. Punkt końcowy można skonfigurować za pomocą obiektu zawierającego Sni
mapowanie między nazwami hostów i opcjami HTTPS. Nazwa hosta połączenia jest zgodna z opcjami i są one używane dla tego połączenia.
Poniższa konfiguracja dodaje punkt końcowy o nazwie MySniEndpoint
, który używa sieci SNI do wybierania opcji HTTPS na podstawie nazwy hosta:
{
"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$"
}
}
}
}
Ostrzeżenie
W poprzednim przykładzie hasła certyfikatu są przechowywane w postaci zwykłego tekstu w pliku appsettings.json
. Token $CREDENTIAL_PLACEHOLDER$
jest używany jako symbol zastępczy dla hasła każdego certyfikatu. Aby bezpiecznie przechowywać hasła certyfikatów w środowiskach deweloperskich, zobacz Ochrona wpisów tajnych podczas programowania. Aby bezpiecznie przechowywać hasła certyfikatów w środowiskach produkcyjnych, zobacz Dostawca konfiguracji usługi Azure Key Vault. Wpisy tajne programowania nie powinny być używane do produkcji ani testowania.
Opcje protokołu HTTPS, które można zastąpić za pomocą sieci SNI:
Certificate
Konfiguruje źródło certyfikatu.Protocols
Konfiguruje dozwolone protokoły HTTP.SslProtocols
Konfiguruje dozwolone protokoły SSL.ClientCertificateMode
Konfiguruje wymagania dotyczące certyfikatu klienta.
Nazwa hosta obsługuje dopasowywanie symboli wieloznacznych:
- Dokładne dopasowanie. Na przykład
a.example.org
pasuje doa.example.org
elementu . - Prefiks symbolu wieloznakowego. Jeśli istnieje wiele dopasowań symboli wieloznacznych, zostanie wybrany najdłuższy wzorzec. Na przykład
*.example.org
dopasowaniab.example.org
ic.example.org
. - Pełne symbole wieloznaczne.
*
dopasowuje wszystkie inne elementy, w tym klientów, którzy nie korzystają z sieci SNI i nie wysyłają nazwy hosta.
Dopasowana konfiguracja SNI jest stosowana do punktu końcowego dla połączenia, przesłaniając wartości w punkcie końcowym. Jeśli połączenie nie jest zgodne ze skonfigurowaną nazwą hosta SNI, połączenie zostanie odrzucone.
Wymagania dotyczące interfejsu SNI
- Uruchamianie na platformie
netcoreapp2.1
docelowej lub nowszej. Wnet461
systemie lub nowszym wywołanie zwrotne jest wywoływane, alename
zawszenull
ma wartość . Parametrname
jest równieżnull
wtedy, gdy klient nie podaje parametru nazwy hosta w uzgadnianiu protokołu TLS. - Wszystkie witryny internetowe działają w tym samym Kestrel wystąpieniu. Kestrel nie obsługuje udostępniania adresu IP i portu między wieloma wystąpieniami bez zwrotnego serwera proxy.
Protokoły SSL/TLS
Protokoły SSL to protokoły używane do szyfrowania i odszyfrowywania ruchu między dwoma elementami równorzędnymi, tradycyjnie klientem i serwerem.
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$"
}
}
}
}
}
Ostrzeżenie
W poprzednim przykładzie hasło certyfikatu jest przechowywane w postaci zwykłego tekstu w pliku appsettings.json
. Token $CREDENTIAL_PLACEHOLDER$
jest używany jako symbol zastępczy hasła certyfikatu. Aby bezpiecznie przechowywać hasła certyfikatów w środowiskach deweloperskich, zobacz Ochrona wpisów tajnych podczas programowania. Aby bezpiecznie przechowywać hasła certyfikatów w środowiskach produkcyjnych, zobacz Dostawca konfiguracji usługi Azure Key Vault. Wpisy tajne programowania nie powinny być używane do produkcji ani testowania.
Wartość domyślna , SslProtocols.None
powoduje Kestrel użycie domyślnych ustawień systemu operacyjnego w celu wybrania najlepszego protokołu. Jeśli nie masz określonego powodu do wybrania protokołu, użyj wartości domyślnej.
Certyfikaty klienta
ClientCertificateMode
Konfiguruje wymagania dotyczące certyfikatu klienta.
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$"
}
}
}
}
}
Ostrzeżenie
W poprzednim przykładzie hasło certyfikatu jest przechowywane w postaci zwykłego tekstu w pliku appsettings.json
. Token $CREDENTIAL_PLACEHOLDER$
jest używany jako symbol zastępczy hasła certyfikatu. Aby bezpiecznie przechowywać hasła certyfikatów w środowiskach deweloperskich, zobacz Ochrona wpisów tajnych podczas programowania. Aby bezpiecznie przechowywać hasła certyfikatów w środowiskach produkcyjnych, zobacz Dostawca konfiguracji usługi Azure Key Vault. Wpisy tajne programowania nie powinny być używane do produkcji ani testowania.
Wartość domyślna to ClientCertificateMode.NoCertificate
, gdzie Kestrel nie będzie żądać lub wymagać certyfikatu od klienta.
Aby uzyskać więcej informacji, zobacz Konfigurowanie uwierzytelniania certyfikatów w programie ASP.NET Core.
Rejestrowanie połączeń
Wywołaj metodę UseConnectionLogging , aby emitować dzienniki poziomu debugowania dla komunikacji na poziomie bajtów w połączeniu. Rejestrowanie połączeń jest pomocne w rozwiązywaniu problemów z komunikacją niskiego poziomu, na przykład podczas szyfrowania TLS i za serwerami proxy. Jeśli UseConnectionLogging
zostanie umieszczony przed UseHttps
, zaszyfrowany ruch jest rejestrowany. Jeśli UseConnectionLogging
zostanie umieszczony po UseHttps
, odszyfrowany ruch jest rejestrowany. Jest to wbudowane oprogramowanie pośredniczące połączeń.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Listen(IPAddress.Any, 8000, listenOptions =>
{
listenOptions.UseConnectionLogging();
});
});
Wiązanie z gniazdem TCP
Metoda Listen wiąże się z gniazdem TCP, a opcja lambda zezwala na konfigurację certyfikatu 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>();
});
W przykładzie skonfigurowaliśmy protokół HTTPS dla punktu końcowego za pomocą polecenia ListenOptions. Użyj tego samego interfejsu API, aby skonfigurować inne Kestrel ustawienia dla określonych punktów końcowych.
W systemie Windows można utworzyć certyfikaty z podpisem własnym przy użyciu New-SelfSignedCertificate
polecenia cmdlet programu PowerShell. Aby zapoznać się z nieobsługiwanym przykładem, zobacz UpdateIISExpressSSLForChrome.ps1
.
W systemach macOS, Linux i Windows można tworzyć certyfikaty przy użyciu protokołu OpenSSL.
Wiązanie z gniazdem systemu Unix
Nasłuchiwanie w gniazdach systemu Unix z ListenUnixSocket ulepszoną wydajnością za pomocą serwera Nginx, jak pokazano w tym przykładzie:
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.ListenUnixSocket("/tmp/kestrel-test.sock");
serverOptions.ListenUnixSocket("/tmp/kestrel-test.sock",
listenOptions =>
{
listenOptions.UseHttps("testCert.pfx",
"testpassword");
});
})
- W pliku konfiguracji Nginx ustaw
server
>proxy_pass
>location
wpis na .http://unix:/tmp/{KESTREL SOCKET}:/;
{KESTREL SOCKET}
to nazwa gniazda podanego ListenUnixSocket (na przykładkestrel-test.sock
w poprzednim przykładzie). - Upewnij się, że gniazdo jest zapisywalne przez serwer Nginx (na przykład
chmod go+w /tmp/kestrel-test.sock
).
Port 0
Po określeniu Kestrel numeru 0
portu dynamicznie wiąże się z dostępnym portem. W poniższym przykładzie pokazano, jak określić, który port Kestrel jest powiązany w czasie wykonywania:
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>");
});
}
Po uruchomieniu aplikacji dane wyjściowe okna konsoli wskazują port dynamiczny, do którego można uzyskać dostęp do aplikacji:
Listening on the following addresses: http://127.0.0.1:48508
Ograniczenia
Skonfiguruj punkty końcowe przy użyciu następujących metod:
- UseUrls
--urls
argument wiersza poleceniaurls
klucz konfiguracji hostaASPNETCORE_URLS
zmienna środowiskowa
Te metody są przydatne do tworzenia kodu pracy z serwerami innymi niż Kestrel. Należy jednak pamiętać o następujących ograniczeniach:
- Nie można używać protokołu HTTPS z tymi metodami, chyba że w konfiguracji punktu końcowego HTTPS jest udostępniany domyślny certyfikat (na przykład przy użyciu
KestrelServerOptions
konfiguracji lub pliku konfiguracji, jak pokazano wcześniej w tym artykule). - Gdy oba
Listen
metody iUseUrls
są używane jednocześnie,Listen
punkty końcowe zastępująUseUrls
punkty końcowe.
Konfiguracja punktu końcowego usług IIS
W przypadku korzystania z usług IIS powiązania adresów URL dla powiązań przesłaniania usług IIS są ustawiane przez Listen
element lub UseUrls
. Aby uzyskać więcej informacji, zobacz moduł ASP.NET Core.
ListenOptions.Protocols
Właściwość Protocols
ustanawia protokoły HTTP (HttpProtocols
) włączone w punkcie końcowym połączenia lub dla serwera. Przypisz wartość do Protocols
właściwości z wyliczenia HttpProtocols
.
HttpProtocols wartość wyliczenia |
Dozwolony protokół połączenia |
---|---|
Http1 |
Tylko http/1.1. Może być używany z protokołem TLS lub bez tego protokołu. |
Http2 |
Tylko HTTP/2. Może być używany bez protokołu TLS tylko wtedy, gdy klient obsługuje tryb wcześniejszej wiedzy. |
Http1AndHttp2 |
HTTP/1.1 i HTTP/2. Protokół HTTP/2 wymaga, aby klient wybrał protokół HTTP/2 w uzgadnianiu protokołu TLS Application-Layer Protocol (ALPN ). W przeciwnym razie połączenie jest domyślnie nawiązane z protokołem HTTP/1.1. |
Wartość domyślna ListenOptions.Protocols
dla dowolnego punktu końcowego to HttpProtocols.Http1AndHttp2
.
Ograniczenia protokołu TLS dla protokołu HTTP/2:
- Protokół TLS w wersji 1.2 lub nowszej
- Ponowne negocjowanie jest wyłączone
- Kompresja wyłączona
- Minimalne rozmiary wymiany kluczy efemerycznych:
- Krzywa eliptyczna Diffie-Hellman (ECDHE) [RFC4492]: minimum 224 bitów
- Pole skończone Diffie-Hellman (DHE) [
TLS12
]: minimum 2048 bitów
- Zestaw szyfrowania nie jest zabroniony.
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
[TLS-ECDHE
] z krzywą eliptyczną P-256 [FIPS186
] jest domyślnie obsługiwana.
Poniższy przykład zezwala na połączenia HTTP/1.1 i HTTP/2 na porcie 8000. Połączenia są zabezpieczone przez protokół TLS przy użyciu dostarczonego certyfikatu:
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Listen(IPAddress.Any, 8000, listenOptions =>
{
listenOptions.UseHttps("testCert.pfx", "testPassword");
});
});
W systemie Linux CipherSuitesPolicy można używać do filtrowania uzgadniania protokołu TLS na podstawie połączenia:
// 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,
// ...
});
};
});
});
Oprogramowanie pośredniczące połączenia
Niestandardowe oprogramowanie pośredniczące połączenia może filtrować uzgadniania PROTOKOŁU TLS na podstawie połączenia dla określonych szyfrów w razie potrzeby.
Poniższy przykład zgłasza NotSupportedException algorytm szyfrowania, którego aplikacja nie obsługuje. Alternatywnie zdefiniuj i porównaj ITlsHandshakeFeature.CipherAlgorithm z listą dopuszczalnych zestawów szyfrowania.
Szyfrowanie nie jest używane z algorytmem szyfrowania CipherAlgorithmType.Null .
// 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();
});
}
}
}
Filtrowanie połączeń można również skonfigurować za pomocą 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();
});
});
});
Ustawianie protokołu HTTP z konfiguracji
CreateDefaultBuilder
domyślnie do serverOptions.Configure(context.Configuration.GetSection("Kestrel"))
ładowania Kestrel konfiguracji.
appsettings.json
Poniższy przykład ustanawia protokół HTTP/1.1 jako domyślny protokół połączenia dla wszystkich punktów końcowych:
{
"Kestrel": {
"EndpointDefaults": {
"Protocols": "Http1"
}
}
}
appsettings.json
Poniższy przykład ustanawia protokół połączenia HTTP/1.1 dla określonego punktu końcowego:
{
"Kestrel": {
"Endpoints": {
"HttpsDefaultCert": {
"Url": "https://localhost:5001",
"Protocols": "Http1"
}
}
}
}
Protokoły określone w kodzie zastępują wartości ustawione przez konfigurację.
Prefiksy adresów URL
W przypadku używania UseUrls
--urls
argumentu wiersza polecenia, urls
klucza konfiguracji hosta lub ASPNETCORE_URLS
zmiennej środowiskowej prefiksy adresów URL mogą mieć dowolny z następujących formatów.
Prawidłowe są tylko prefiksy adresu URL HTTP. Kestrel program nie obsługuje protokołu HTTPS podczas konfigurowania powiązań adresów URL przy użyciu polecenia UseUrls
.
Adres IPv4 z numerem portu
http://65.55.39.10:80/
0.0.0.0
Jest to specjalny przypadek, który wiąże się ze wszystkimi adresami IPv4.Adres IPv6 z numerem portu
http://[0:0:0:0:0:ffff:4137:270a]:80/
[::]
to odpowiednik protokołu IPv6 protokołu IPv40.0.0.0
.Nazwa hosta z numerem portu
http://contoso.com:80/ http://*:80/
Nazwy hostów,
*
i ,+
nie są specjalne. Wszystkie nie rozpoznane jako prawidłowy adres IP lublocalhost
powiązane ze wszystkimi adresami IP IPv4 i IPv6. Aby powiązać różne nazwy hostów z różnymi aplikacjami ASP.NET Core na tym samym porcie, użyj HTTP.sys lub odwrotnego serwera proxy. Przykłady odwrotnego serwera proxy obejmują usługi IIS, Nginx lub Apache.Ostrzeżenie
Hostowanie w konfiguracji zwrotnego serwera proxy wymaga filtrowania hostów.
Nazwa hosta
localhost
z numerem portu lub adresem IP sprzężenia zwrotnego z numerem portuhttp://localhost:5000/ http://127.0.0.1:5000/ http://[::1]:5000/
Gdy
localhost
zostanie określony, Kestrel próbuje powiązać zarówno interfejsy IPv4, jak i IPv6 sprzężenia zwrotnego. Jeśli żądany port jest używany przez inną usługę w interfejsie sprzężenia zwrotnego, Kestrel nie można uruchomić. Jeśli którykolwiek z interfejsów sprzężenia zwrotnego jest niedostępny z jakiegokolwiek innego powodu (najczęściej dlatego, że protokół IPv6 nie jest obsługiwany), Kestrel rejestruje ostrzeżenie.