Configurar endpoints para o servidor web ASP.NET Core Kestrel
Observação
Esta não é a versão mais recente deste artigo. Para a versão atual, consulte a versão .NET 9 deste artigo.
Advertência
Esta versão do ASP.NET Core não é mais suportada. Para obter mais informações, consulte a Política de suporte do .NET e .NET Core. Para a versão atual, consulte a versão .NET 9 deste artigo.
Importante
Estas informações referem-se a um produto de pré-lançamento que pode ser substancialmente modificado antes de ser lançado comercialmente. A Microsoft não oferece garantias, expressas ou implícitas, em relação às informações fornecidas aqui.
Para a versão atual, consulte a versão .NET 9 deste artigo.
Kestrel endereços fornecem a infraestrutura para ouvir as solicitações de entrada e encaminhá-las para o middleware apropriado. A combinação de um endereço e um protocolo define um ponto de extremidade.
- O endereço especifica a interface de rede na qual o servidor escuta as solicitações de entrada, como uma porta TCP.
- O protocolo especifica a comunicação entre o cliente e o servidor, como HTTP/1.1, HTTP/2 ou HTTP/3.
- Um endpoint pode ser protegido usando o esquema de URL
https
ou o métodoUseHttps
.
Os endpoints podem ser configurados usando URLs, JSON em appsettings.json
e código. Este artigo descreve como usar cada opção para configurar um ponto de extremidade:
Ponto de extremidade padrão
Novos projetos ASP.NET Core são configurados para se vincular a uma porta HTTP aleatória entre 5000-5300 e uma porta HTTPS aleatória entre 7000-7300. As portas selecionadas são armazenadas no arquivo de Properties/launchSettings.json
gerado e podem ser modificadas pelo desenvolvedor. O ficheiro launchSetting.json
só é utilizado no desenvolvimento local.
Se não houver nenhuma configuração de ponto de extremidade, Kestrel liga-se a http://localhost:5000
.
Configurar pontos de extremidade
Kestrel pontos de extremidade monitoram conexões de entrada. Quando um endpoint é criado, ele deve ser configurado com o endereço que ouvirá. Normalmente, este é um endereço TCP e número de porta.
Existem várias opções para configurar terminais:
- Configurar endereços de terminal com URLs
- Especificar portas apenas
- Configurar pontos de extremidade no appsettings.json
- Configurar endpoints no código
Configurar pontos de extremidade com URLs
As seções a seguir explicam como configurar endpoints usando:
-
ASPNETCORE_URLS
variável de ambiente. -
--urls
argumento de linha de comando. -
urls
chave de configuração do host. - UseUrls método de extensão.
- WebApplication.Urls propriedade.
Formatos de URL
Os URLs indicam os endereços IP ou host com portas e protocolos que o servidor deve escutar. A porta pode ser omitida se for o padrão para o protocolo (normalmente 80 e 443). Os URLs podem estar em qualquer um dos seguintes formatos.
Endereço IPv4 com número de porta
http://65.55.39.10:80/
0.0.0.0
é um caso especial que se liga a todos os endereços IPv4.Endereço IPv6 com número de porta
http://[0:0:0:0:0:ffff:4137:270a]:80/
[::]
é o equivalente IPv6 do IPv40.0.0.0
.Wildcard host com número de porta
http://contoso.com:80/ http://*:80/
Qualquer item não reconhecido como um endereço IP válido ou
localhost
é tratado como um wildcard que se liga a todos os endereços IPv4 e IPv6. Algumas pessoas gostam de usar*
ou+
para ser mais explícito. Para vincular nomes de host diferentes a aplicativos ASP.NET Core diferentes na mesma porta, use HTTP.sys ou um servidor proxy reverso.Exemplos de servidor proxy reverso incluem IIS, YARP, Nginx e Apache.
Nome do host
localhost
com número de porta ou IP de loopback com número de portahttp://localhost:5000/ http://127.0.0.1:5000/ http://[::1]:5000/
Quando
localhost
é especificado, Kestrel tenta ligar-se às interfaces de loopback do IPv4 e do IPv6. Se a porta solicitada estiver em uso por outro serviço em qualquer interface de loopback, Kestrel falha ao iniciar. Se qualquer interface de loopback estiver indisponível por qualquer outro motivo (mais comumente porque o IPv6 não é suportado), Kestrel registrará um aviso.
Vários prefixos de URL podem ser especificados usando um delimitador de ponto-e-vírgula (;
):
http://*:5000;http://localhost:5001;https://hostname:5002
Para obter mais informações, consulte Configuração de substituição.
Prefixos de URL HTTPS
Os prefixos de URL HTTPS podem ser usados para definir pontos de extremidade somente se um certificado padrão for fornecido na configuração do ponto de extremidade HTTPS. Por exemplo, use a configuração KestrelServerOptions ou um arquivo de configuração, conforme mostrado mais à frente neste artigo.
Para mais informações, consulte como configurar o HTTPS em .
Especificar apenas portas
Aplicativos e contêineres geralmente recebem apenas uma porta para escutar, como a porta 80, sem restrições adicionais, como host ou caminho. HTTP_PORTS e HTTPS_PORTS são chaves de configuração que especificam as portas de escuta para os servidores Kestrel e HTTP.sys. Essas chaves podem ser especificadas como variáveis de ambiente definidas com os prefixos DOTNET_
ou ASPNETCORE_
, ou especificadas diretamente por meio de qualquer outra entrada de configuração, como appsettings.json
. Cada um é uma lista delimitada por ponto-e-vírgula de valores de porta, conforme mostrado no exemplo a seguir:
ASPNETCORE_HTTP_PORTS=80;8080
ASPNETCORE_HTTPS_PORTS=443;8081
O exemplo anterior é uma abreviação para a configuração a seguir, que especifica o esquema (HTTP ou HTTPS) e qualquer host ou IP.
ASPNETCORE_URLS=http://*:80/;http://*:8080/;https://*:443/;https://*:8081/
As chaves de configuração HTTP_PORTS e HTTPS_PORTS são de prioridade mais baixa e são substituídas por URLs ou valores fornecidos diretamente no código. Os certificados ainda precisam ser configurados separadamente por meio de mecânicas específicas do servidor para HTTPS.
Configurar pontos de extremidade em appsettings.json
Kestrel pode carregar endpoints a partir de uma instância IConfiguration. Por padrão, a configuração Kestrel é carregada a partir da secção Kestrel
e os endpoints são configurados em Kestrel:Endpoints
.
{
"Kestrel": {
"Endpoints": {
"MyHttpEndpoint": {
"Url": "http://localhost:8080"
}
}
}
}
O exemplo anterior:
- Usa
appsettings.json
como a fonte de configuração. No entanto, qualquer fonteIConfiguration
pode ser usada. - Adiciona um endpoint chamado
MyHttpEndpoint
na porta 8080.
Para obter mais informações sobre a configuração de endpoints com JSON, consulte as secções seguintes deste artigo que abordam a configuração de HTTPS e a configuração de protocolos HTTP no appsettings.json.
Atualizar endpoints a partir da configuração
A recarga da configuração do ponto de extremidade quando a fonte de configuração é alterada está ativada por padrão. Ele pode ser desativado usando KestrelServerOptions.Configure(IConfiguration, Boolean).
Se for sinalizada uma alteração, são tomadas as seguintes medidas:
- A nova configuração é comparada à antiga, e qualquer ponto de extremidade sem alterações na configuração não é modificado.
- Os pontos de extremidade removidos ou modificados recebem 5 segundos para concluir as solicitações de processamento e desligar.
- Novos ou modificados pontos finais são iniciados.
Os clientes que se conectam a um ponto de extremidade modificado podem ser desconectados ou recusados enquanto o ponto de extremidade é reiniciado.
Carregador de Configuração
KestrelServerOptions.Configure retorna um KestrelConfigurationLoader. O método Endpoint(String, Action<EndpointConfiguration>) do carregador pode ser usado para complementar as definições de um endpoint configurado.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
var kestrelSection = context.Configuration.GetSection("Kestrel");
serverOptions.Configure(kestrelSection)
.Endpoint("HTTPS", listenOptions =>
{
// ...
});
});
KestrelServerOptions.ConfigurationLoader
pode ser acessado diretamente para continuar iterando no carregador existente, como o fornecido pelo WebApplicationBuilder.WebHost.
- A seção de configuração para cada ponto de extremidade está disponível nas opções no método Endpoint para que as configurações personalizadas possam ser lidas.
-
KestrelServerOptions.Configure(IConfiguration) pode ser chamado várias vezes, mas apenas a última configuração é usada, a menos que
Load
seja explicitamente chamada em instâncias anteriores. O host padrão não chamaLoad
para que sua seção de configuração padrão possa ser substituída. -
KestrelConfigurationLoader
espelha a famíliaListen
de APIs doKestrelServerOptions
à medida queEndpoint
sobrecarrega, para que o código e os pontos de extremidade de configuração possam ser configurados no mesmo local. Essas sobrecargas não usam nomes e utilizam apenas as definições padrão da configuração.
Configurar pontos de extremidade no código
KestrelServerOptions fornece métodos para configurar pontos de extremidade no código:
Quando ambas as APIs UseUrls , Listen
e são usadas simultaneamente, os endpoints Listen
têm prioridade sobre os endpoints UseUrls
.
Ligar a um soquete TCP
Os métodos Listen, ListenLocalhoste ListenAnyIP ligam-se a um soquete 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");
});
});
O exemplo anterior:
- Configura pontos de extremidade que escutam nas portas 5000 e 5001.
- Configura HTTPS para um endpoint com o método de extensão UseHttps em ListenOptions. Para obter mais informações, consulte Configurar HTTPS no código.
No Windows, certificados autoassinados podem ser criados usando o cmdlet New-SelfSignedCertificate
PowerShell. Para obter um exemplo sem suporte, consulte UpdateIISExpressSSLForChrome.ps1
.
No macOS, Linux e Windows, os certificados podem ser criados usando OpenSSL.
Vincular a um soquete Unix
Utilize um socket Unix com ListenUnixSocket para melhorar o desempenho com o Nginx, como demonstrado neste exemplo:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.ListenUnixSocket("/tmp/kestrel-test.sock");
});
- No arquivo de configuração do Nginx, defina a entrada
server
>location
>proxy_pass
comohttp://unix:/tmp/{KESTREL SOCKET}:/;
.{KESTREL SOCKET}
é o nome do soquete fornecido ao ListenUnixSocket (por exemplo,kestrel-test.sock
no exemplo anterior). - Certifique-se de que o soquete é gravável por Nginx (por exemplo,
chmod go+w /tmp/kestrel-test.sock
).
Configurar padrões de ponto final
ConfigureEndpointDefaults(Action<ListenOptions>)
especifica a configuração que é executada para cada ponto de extremidade especificado. Chamar ConfigureEndpointDefaults
várias vezes substitui a configuração anterior.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureEndpointDefaults(listenOptions =>
{
// ...
});
});
Observação
Os pontos de extremidade criados ao chamar Listenantes de chamar ConfigureEndpointDefaults não terão os padrões aplicados.
Ligação dinâmica de portas
Quando o número da porta 0
é especificado, Kestrel se liga dinamicamente a uma porta disponível. O exemplo a seguir mostra como determinar a qual porta Kestrel foi atribuída durante a execução:
app.Run(async (context) =>
{
var serverAddressFeature = context.Features.Get<IServerAddressesFeature>();
if (serverAddressFeature is not null)
{
var listenAddresses = string.Join(", ", serverAddressFeature.Addresses);
// ...
}
});
A vinculação dinâmica de uma porta não está disponível em algumas situações:
- KestrelServerOptions.ListenLocalhost
- Vinculando HTTP/1.1 ou HTTP/2 baseado em TCP e HTTP/3 baseado em QUIC.
Configurar HTTPS
Kestrel suporta a proteção de endpoints com HTTPS. Os dados enviados por HTTPS são criptografados usando Transport Layer Security (TLS) para aumentar a segurança dos dados transferidos entre o cliente e o servidor.
HTTPS requer um certificado TLS. O certificado TLS é armazenado no servidor e Kestrel está configurado para usá-lo. Um aplicativo pode usar o certificado de desenvolvimento ASP.NET Core HTTPS em um ambiente de desenvolvimento local. O certificado de desenvolvimento não é instalado em ambientes que não sejam de desenvolvimento. Na produção, um certificado TLS deve ser explicitamente configurado. No mínimo, um certificado padrão deve ser fornecido.
A maneira como o HTTPS e o certificado TLS são configurados depende de como os pontos de extremidade são configurados:
- Se prefixos de URL ou especificar portas somente são usadas para definir pontos de extremidade, HTTPS pode ser usado somente se um certificado padrão for fornecido na configuração de ponto de extremidade HTTPS. Um certificado padrão pode ser configurado com uma das seguintes opções:
- Configurar HTTPS em appsettings.json
- Configurar HTTPS no código
Configurar HTTPS no appsettings.json
Um esquema de configuração padrão para aplicações HTTPS está disponível para Kestrel. Configure vários endpoints, incluindo os URLs e os certificados a serem usados, a partir de um ficheiro no disco ou de uma loja de certificados.
Qualquer ponto de extremidade HTTPS que não especifique um certificado (HttpsDefaultCert
no exemplo a seguir) retornará ao certificado definido em Certificates:Default
ou ao certificado de desenvolvimento.
O exemplo a seguir é para appsettings.json
, mas qualquer fonte de configuração pode ser usada:
{
"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$"
}
}
}
}
Advertência
No exemplo anterior, a senha do certificado é armazenada em texto sem formatação no appsettings.json
. O token $CREDENTIAL_PLACEHOLDER$
é usado como um espaço reservado para a senha do certificado. Para armazenar senhas de certificado com segurança em ambientes de desenvolvimento, veja Proteção de segredos no desenvolvimento. Para que as senhas de certificado sejam armazenadas com segurança em ambientes de produção, consulte provedor de configuração do Azure Key Vault. Os segredos de desenvolvimento não devem ser usados para produção ou teste.
Notas de esquema
- Os nomes dos endpoints não distinguem maiúsculas de minúsculas. Por exemplo,
HTTPS
eHttps
são equivalentes. - O parâmetro
Url
é necessário para cada ponto de extremidade. O formato para esse parâmetro é o mesmo que o parâmetro de configuração deUrls
de nível superior, exceto que ele é limitado a um único valor. Veja os formatos de URL mencionados anteriormente neste artigo. - Estes endpoints substituem os definidos na configuração de
Urls
de nível superior, em vez de acrescentá-los. Os pontos de extremidade definidos no código viaListen
são cumulativos com os pontos de extremidade definidos na seção de configuração. - A secção
Certificate
é opcional. Se a seçãoCertificate
não for especificada, os padrões definidos emCertificates:Default
serão usados. Se nenhum padrão estiver disponível, o certificado de desenvolvimento será usado. Se não houver padrões e o certificado de desenvolvimento não estiver presente, o servidor lançará uma exceção e falhará ao iniciar. - A seção
Certificate
oferece suporte a várias fontes de certificado. - Qualquer número de endpoints pode ser definido em
Configuration
, desde que não cause conflitos de porta.
Fontes de certificados
Os nós de certificado podem ser configurados para carregar certificados de várias fontes:
-
Path
ePassword
para carregar arquivos .pfx. -
Path
,KeyPath
ePassword
para carregar os arquivos .pem,/.crt, e .key. -
Subject
eStore
para carregar a partir do armazenamento de certificados.
Por exemplo, o certificado Certificates:Default
pode ser especificado como:
"Default": {
"Subject": "<subject; required>",
"Store": "<cert store; required>",
"Location": "<location; defaults to CurrentUser>",
"AllowInvalid": "<true or false; defaults to false>"
}
Configurar certificados de cliente no appsettings.json
ClientCertificateMode é utilizado para configurar o comportamento dos certificados de cliente.
{
"Kestrel": {
"Endpoints": {
"MyHttpsEndpoint": {
"Url": "https://localhost:5001",
"ClientCertificateMode": "AllowCertificate",
"Certificate": {
"Path": "<path to .pfx file>",
"Password": "$CREDENTIAL_PLACEHOLDER$"
}
}
}
}
}
Advertência
No exemplo anterior, a senha do certificado é armazenada em texto sem formatação no appsettings.json
. O token $CREDENTIAL_PLACEHOLDER$
é usado como um espaço reservado para a senha do certificado. Para armazenar senhas de certificado com segurança em ambientes de desenvolvimento, veja Proteção de segredos no desenvolvimento. Para que as senhas de certificado sejam armazenadas com segurança em ambientes de produção, consulte provedor de configuração do Azure Key Vault. Os segredos de desenvolvimento não devem ser usados para produção ou teste.
O valor padrão é ClientCertificateMode.NoCertificate
, onde Kestrel não solicita ou exige um certificado do cliente.
Para obter mais informações, consulte Configurar autenticação de certificado no ASP.NET Core.
Configurar protocolos SSL/TLS no appsettings.json
Os protocolos SSL são protocolos usados para criptografar e descriptografar o tráfego entre dois pares, tradicionalmente um cliente e um servidor.
{
"Kestrel": {
"Endpoints": {
"MyHttpsEndpoint": {
"Url": "https://localhost:5001",
"SslProtocols": ["Tls12", "Tls13"],
"Certificate": {
"Path": "<path to .pfx file>",
"Password": "$CREDENTIAL_PLACEHOLDER$"
}
}
}
}
}
Advertência
No exemplo anterior, a senha do certificado é armazenada em texto sem formatação no appsettings.json
. O token $CREDENTIAL_PLACEHOLDER$
é usado como um espaço reservado para a senha do certificado. Para armazenar senhas de certificado com segurança em ambientes de desenvolvimento, veja Proteção de segredos no desenvolvimento. Para que as senhas de certificado sejam armazenadas com segurança em ambientes de produção, consulte provedor de configuração do Azure Key Vault. Os segredos de desenvolvimento não devem ser usados para produção ou teste.
O valor padrão, SslProtocols.None
, faz com que Kestrel use os padrões do sistema operacional para escolher o melhor protocolo. A menos que você tenha um motivo específico para selecionar um protocolo, use o padrão.
Configurar HTTPS no código
Ao usar a API Listen
, o método de extensão UseHttps no ListenOptions está disponível para configurar 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
parâmetros:
-
filename
é o caminho e o nome de arquivo de um arquivo de certificado, relativo ao diretório que contém os arquivos de conteúdo do aplicativo. -
password
é a senha necessária para acessar os dados do certificado X.509. -
configureOptions
é umAction
para configurar oHttpsConnectionAdapterOptions
. Devolve oListenOptions
. -
storeName
é o armazenamento de certificados a partir do qual carregar o certificado. -
subject
é o nome do assunto do certificado. -
allowInvalid
indica se certificados inválidos devem ser considerados, como certificados autoassinados. -
location
é o local de armazenamento a partir do qual carregar o certificado. -
serverCertificate
é o certificado X.509.
Para consultar uma lista completa de sobrecargas de UseHttps
, veja UseHttps.
Configurar certificados de cliente no código
ClientCertificateMode configura os requisitos de certificado do cliente.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
listenOptions.ClientCertificateMode = ClientCertificateMode.AllowCertificate;
});
});
O valor padrão é NoCertificate, onde Kestrel não solicita ou exige um certificado do cliente.
Para obter mais informações, consulte Configurar autenticação de certificado no ASP.NET Core.
Configurar padrões HTTPS no código
ConfigureHttpsDefaults(Action<HttpsConnectionAdapterOptions>) especifica uma configuração Action
para ser executada para cada ponto de extremidade HTTPS. Chamar ConfigureHttpsDefaults
múltiplas vezes substitui instâncias anteriores Action
pela última instância de Action
especificada.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
// ...
});
});
Observação
Os pontos de extremidade criados ao chamar Listenantes de chamar ConfigureHttpsDefaults não terão os padrões aplicados.
Configurar protocolos SSL/TLS no código
Os protocolos SSL são protocolos usados para criptografar e descriptografar o tráfego entre dois pares, tradicionalmente um cliente e um servidor.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
listenOptions.SslProtocols = SslProtocols.Tls13;
});
});
Configurar o filtro de pacotes de codificação TLS no código
No Linux, CipherSuitesPolicy pode ser usado para filtrar handshakes TLS por conexão:
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,
// ...
});
};
});
});
Configurar indicação de nome do servidor
Indicação de Nome de Servidor (SNI) pode ser usada para hospedar vários domínios no mesmo endereço IP e porta. O SNI pode ser usado para conservar recursos servindo vários sites a partir de um servidor.
Para que o SNI funcione, o cliente envia o nome do host para a sessão segura para o servidor durante o handshake TLS para que o servidor possa fornecer o certificado correto. O cliente usa o certificado fornecido para comunicação criptografada com o servidor durante a sessão segura que segue o handshake TLS.
Todos os websites devem ser executados na instância Kestrel. Kestrel não suporta a partilha de endereço IP e porta entre várias instâncias sem um proxy reverso.
O SNI pode ser configurado de duas maneiras:
- Configure um mapeamento entre nomes de host e opções HTTPS no Configuration. Por exemplo, JSON no arquivo
appsettings.json
. - Crie um ponto de extremidade no código e selecione um certificado usando o nome do host com o callback ServerCertificateSelector.
Configurar o SNI no appsettings.json
Kestrel suporta SNI definido na configuração. Um ponto de extremidade pode ser configurado com um objeto Sni
que contém um mapeamento entre nomes de host e opções HTTPS. O nome do host de conexão corresponde às opções e elas são usadas para essa conexão.
A configuração a seguir adiciona um ponto de extremidade chamado MySniEndpoint
que usa SNI para selecionar opções HTTPS com base no nome do host:
{
"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$"
}
}
}
}
Advertência
No exemplo anterior, a senha do certificado é armazenada em texto sem formatação no appsettings.json
. O token $CREDENTIAL_PLACEHOLDER$
é usado como um espaço reservado para a senha do certificado. Para armazenar senhas de certificado com segurança em ambientes de desenvolvimento, veja Proteção de segredos no desenvolvimento. Para que as senhas de certificado sejam armazenadas com segurança em ambientes de produção, consulte provedor de configuração do Azure Key Vault. Os segredos de desenvolvimento não devem ser usados para produção ou teste.
Opções HTTPS que podem ser substituídas pelo SNI:
-
Certificate
configura a origem do certificado . -
Protocols
configura os protocolos HTTP permitidos. -
SslProtocols
configura os protocolos permitidos de SSL . -
ClientCertificateMode
configura os requisitos de certificado de cliente .
O nome do host oferece suporte à correspondência por caracteres substitutos:
- Correspondência exata. Por exemplo,
a.example.org
correspondea.example.org
. - Prefixo de substituição. Se houver várias correspondências curinga, o padrão mais longo será escolhido. Por exemplo,
*.example.org
corresponde ab.example.org
ec.example.org
. - Curinga completo.
*
corresponde a todo o resto, incluindo clientes que não estão usando SNI e não enviam um nome de host.
A configuração SNI correspondente é aplicada ao ponto final da conexão, substituindo os valores no ponto final. Se uma conexão não corresponder a um nome de host SNI configurado, a conexão será recusada.
Configurar SNI com código
Kestrel suporta SNI com várias APIs de 'callback':
ServerCertificateSelector
ServerOptionsSelectionCallback
TlsHandshakeCallbackOptions
SNI com ServerCertificateSelector
Kestrel suporta SNI através do callback ServerCertificateSelector
. O callback é invocado uma vez por conexão para permitir que a aplicação inspecione o nome do host e selecione o certificado apropriado.
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 com ServerOptionsSelectionCallback
Kestrel suporta configuração TLS dinâmica adicional através do retorno de chamada ServerOptionsSelectionCallback
. O retorno de chamada é invocado uma vez por conexão para permitir que o aplicativo inspecione o nome do host e selecione o certificado apropriado e a configuração TLS. Os certificados padrão e o ConfigureHttpsDefaults
não são usados com este retorno de chamada.
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 com TlsHandshakeCallbackOptions
Kestrel suporta configuração TLS dinâmica adicional através do retorno de chamada TlsHandshakeCallbackOptions.OnConnection
. O retorno de chamada é invocado uma vez por conexão para permitir que o aplicativo inspecione o nome do host e selecione o certificado apropriado, a configuração TLS e outras opções do servidor. Os certificados padrão e o ConfigureHttpsDefaults
não são usados com este retorno de chamada.
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
});
}
});
});
});
});
Configurar protocolos HTTP
Kestrel suporta todas as versões HTTP comumente usadas. Os pontos de extremidade podem ser configurados para suportar diferentes versões HTTP usando o enum HttpProtocols, que especifica as opções de versão HTTP disponíveis.
O TLS é necessário para suportar mais de uma versão HTTP. O handshake TLS Application-Layer Protocol Negotiation (ALPN) é usado para negociar o protocolo de conexão entre o cliente e o servidor quando um ponto de acesso suporta múltiplos protocolos.
Valor HttpProtocols |
Protocolo de conexão permitido |
---|---|
Http1 |
HTTP/1.1 apenas. Pode ser usado com ou sem TLS. |
Http2 |
HTTP/2 apenas. Pode ser usado sem TLS somente se o cliente suportar um modo Conhecimento Prévio. |
Http3 |
HTTP/3 apenas. Requer o TLS. O cliente pode precisar ser configurado para usar somente HTTP/3. |
Http1AndHttp2 |
HTTP/1.1 e HTTP/2. HTTP/2 requer que o cliente selecione HTTP/2 no TLS Application-Layer Protocol Negotiation (ALPN) handshake; caso contrário, o padrão de conexão é HTTP/1.1. |
Http1AndHttp2AndHttp3 |
HTTP/1.1, HTTP/2 e HTTP/3. A primeira solicitação de cliente normalmente usa HTTP/1.1 ou HTTP/2, e o cabeçalho de resposta alt-svc solicita que o cliente atualize para HTTP/3. HTTP/2 e HTTP/3 requer TLS; caso contrário, o padrão de conexão é HTTP/1.1. |
O valor de protocolo padrão para um endpoint é HttpProtocols.Http1AndHttp2
.
Restrições TLS para HTTP/2:
- TLS versão 1.2 ou posterior
- Renegociação desativada
- Compressão desativada
- Tamanhos mínimos de troca de chaves efêmeras:
- Curva elíptica Diffie-Hellman (ECDHE) [RFC4492]: mínimo de 224 bits
- Diffie-Hellman de campo finito (DHE) [
TLS12
]: mínimo de 2048 bits
- Cipher suite não proibida.
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
[TLS-ECDHE
] com a curva elíptica P-256 [FIPS186
] é suportada por padrão.
Configurar protocolos HTTP no appsettings.json
O exemplo de appsettings.json
a seguir estabelece o protocolo de conexão HTTP/1.1 para um ponto de extremidade específico:
{
"Kestrel": {
"Endpoints": {
"HttpsDefaultCert": {
"Url": "https://localhost:5001",
"Protocols": "Http1"
}
}
}
}
Um protocolo padrão pode ser configurado na seção Kestrel:EndpointDefaults
. O exemplo appsettings.json
a seguir estabelece HTTP/1.1 como o protocolo de conexão padrão para todos os endereços.
{
"Kestrel": {
"EndpointDefaults": {
"Protocols": "Http1"
}
}
}
Os protocolos especificados no código substituem os valores definidos pela configuração.
Configurar protocolos HTTP no código
ListenOptions.Protocols é usado para especificar protocolos com o HttpProtocols enum.
O exemplo a seguir configura um ponto de extremidade para conexões HTTP/1.1, HTTP/2 e HTTP/3 na porta 8000. As conexões são protegidas por TLS com um certificado fornecido:
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;
});
});
Personalizar pontos finais de pipes nomeados Kestrel
O suporte de tubo nomeado do Kestrelinclui opções avançadas de personalização. A propriedade CreateNamedPipeServerStream nas opções de pipe nomeado permite que os pipes sejam personalizados por ponto de extremidade.
Isso é útil, por exemplo, num aplicativo Kestrel que requer dois pontos terminais com diferentes níveis de segurança de acesso . A opção CreateNamedPipeServerStream
pode ser usada para criar pipes com configurações de segurança personalizadas, dependendo do nome do pipe.
using System.IO.Pipes;
using System.Security.AccessControl;
using System.Security.Principal;
var builder = WebApplication.CreateBuilder();
builder.WebHost.ConfigureKestrel(options =>
{
options.ListenNamedPipe("defaultPipe");
options.ListenNamedPipe("securedPipe");
});
builder.WebHost.UseNamedPipes(options =>
{
options.CreateNamedPipeServerStream = (context) =>
{
var pipeName = context.NamedPipeEndPoint.PipeName;
switch (pipeName)
{
case "defaultPipe":
return NamedPipeTransportOptions.CreateDefaultNamedPipeServerStream(context);
case "securedPipe":
var allowSecurity = new PipeSecurity();
allowSecurity.AddAccessRule(new PipeAccessRule("Users", PipeAccessRights.FullControl, AccessControlType.Allow));
return NamedPipeServerStreamAcl.Create(pipeName, PipeDirection.InOut,
NamedPipeServerStream.MaxAllowedServerInstances, PipeTransmissionMode.Byte,
context.PipeOptions, inBufferSize: 0, outBufferSize: 0, allowSecurity);
default:
throw new InvalidOperationException($"Unexpected pipe name: {pipeName}");
}
};
});
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();
Ver também
ASP.NET projetos principais são configurados para se vincular a uma porta HTTP aleatória entre 5000-5300 e uma porta HTTPS aleatória entre 7000-7300. Essa configuração padrão é especificada no arquivo de Properties/launchSettings.json
gerado e pode ser substituída. Se nenhuma porta for especificada, Kestrel se ligará a http://localhost:5000
.
Especifique URLs usando:
-
ASPNETCORE_URLS
variável de ambiente. -
--urls
argumento de linha de comando. -
urls
chave de configuração do host. - UseUrls método de extensão.
O valor fornecido ao usar estas abordagens pode ser um ou mais endereços HTTP e HTTPS (HTTPS se um certificado padrão estiver disponível). Configure o valor como uma lista separada por ponto-e-vírgula (por exemplo, "Urls": "http://localhost:8000;http://localhost:8001"
).
Para obter mais informações sobre essas abordagens, consulte Server URLs e Override configuration.
Um certificado de desenvolvimento é criado:
- Quando o SDK do .NET é instalado.
- A ferramenta dev-certs é usada para criar um certificado.
O certificado de desenvolvimento está disponível apenas para o usuário que gera o certificado. Alguns navegadores exigem a concessão de permissão explícita para confiar no certificado de desenvolvimento local.
Os modelos de projeto configuram aplicativos para serem executados em HTTPS por padrão e incluem redirecionamento HTTPS e suporte a HSTS.
Chame os métodos Listen ou ListenUnixSocket em KestrelServerOptions para configurar prefixos de URL e portas para Kestrel.
UseUrls
, o argumento de linha de comando --urls
, urls
chave de configuração do host e a variável de ambiente ASPNETCORE_URLS
também funcionam, mas têm as limitações observadas posteriormente nesta seção (um certificado padrão deve estar disponível para configuração de ponto de extremidade HTTPS).
KestrelServerOptions
configuração:
ConfigurarPadrõesDeEndPoint
ConfigureEndpointDefaults(Action<ListenOptions>) especifica uma configuração Action
para executar em cada ponto de extremidade especificado. Chamar ConfigureEndpointDefaults
várias vezes substitui os Action
anteriores pelo último Action
especificado:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureEndpointDefaults(listenOptions =>
{
// ...
});
});
Observação
Os pontos de extremidade criados ao chamar Listenantes de chamarConfigureEndpointDefaults não terão os padrões aplicados.
Configurar (IConfiguration)
Permite que Kestrel carregue endpoints de um IConfiguration. A configuração deve estar limitada à seção de configuração para Kestrel. A sobrecarga de Configure(IConfiguration, bool)
pode ser utilizada para habilitar o recarregamento de endereços quando a fonte de configuração for alterada.
Por padrão, a configuração Kestrel é carregada da seção Kestrel
e o recarregamento de alterações está habilitado.
{
"Kestrel": {
"Endpoints": {
"Http": {
"Url": "http://localhost:5000"
},
"Https": {
"Url": "https://localhost:5001"
}
}
}
}
Se a recarga da configuração estiver habilitada e uma alteração for sinalizada, as seguintes etapas serão executadas:
- A nova configuração é comparada com a antiga, e quaisquer pontos de extremidade sem alterações na configuração não são modificados.
- Os pontos de extremidade removidos ou modificados recebem 5 segundos para concluir as solicitações de processamento e desligar.
- Endpoints novos ou modificados são iniciados.
Os clientes que se conectam a um ponto de extremidade modificado podem ser desconectados ou recusados enquanto o ponto de extremidade é reiniciado.
ConfigurarPredefiniçõesHttps
ConfigureHttpsDefaults(Action<HttpsConnectionAdapterOptions>) especifica uma configuração Action
a ser executada para cada endpoint HTTPS. Chamar ConfigureHttpsDefaults
várias vezes substitui os Action
anteriores pelo último Action
especificado.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
// ...
});
});
Observação
Os pontos de extremidade criados ao chamar Listenantes de chamar ConfigureHttpsDefaults não terão os padrões aplicados.
ListenOptions.UseHttps
Configure Kestrel para usar HTTPS.
ListenOptions.UseHttps
extensões:
-
UseHttps
: Configure Kestrel para usar HTTPS com o certificado padrão. Lança uma exceção se nenhum certificado padrão estiver configurado. 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
parâmetros:
-
filename
é o caminho e o nome de arquivo de um arquivo de certificado, relativo ao diretório que contém os arquivos de conteúdo do aplicativo. -
password
é a senha necessária para acessar os dados do certificado X.509. -
configureOptions
é umAction
para configurar oHttpsConnectionAdapterOptions
. Devolve oListenOptions
. -
storeName
é o armazenamento de certificados a partir do qual carregar o certificado. -
subject
é o nome do assunto do certificado. -
allowInvalid
indica se certificados inválidos devem ser considerados, como certificados autoassinados. -
location
é o local de armazenamento a partir do qual carregar o certificado. -
serverCertificate
é o certificado X.509.
Na produção, o HTTPS deve ser explicitamente configurado. No mínimo, um certificado padrão deve ser fornecido.
Se os certificados estiverem sendo lidos do disco, ao contrário de um do Repositório de Certificados do Windows, o diretório que contém deverá ter permissões apropriadas para impedir o acesso não autorizado.
Configurações suportadas descritas a seguir:
- Sem configuração
- Substitua o certificado padrão da configuração
- Alterar os padrões no código
Sem configuração
Kestrel ouve http://localhost:5000
.
Substitua o certificado padrão da configuração
Um esquema de configuração padrão para aplicações HTTPS está disponível para Kestrel. Configure vários pontos de extremidade, incluindo as URLs e os certificados a usar, a partir de um ficheiro no disco ou de um armazenamento de certificados.
No exemplo appsettings.json
seguinte:
- Defina
AllowInvalid
comotrue
para permitir o uso de certificados inválidos (por exemplo, certificados autoassinados). - Qualquer ponto de extremidade HTTPS que não especifique um certificado (
HttpsDefaultCert
no exemplo a seguir) retornará ao certificado definido emCertificates:Default
ou ao certificado de desenvolvimento.
{
"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$"
}
}
}
}
Advertência
No exemplo anterior, as senhas de certificado são armazenadas em texto sem formatação em appsettings.json
. O token $CREDENTIAL_PLACEHOLDER$
é usado como um espaço reservado para a senha de cada certificado. Para armazenar senhas de certificado com segurança em ambientes de desenvolvimento, veja Proteção de segredos no desenvolvimento. Para que as senhas de certificado sejam armazenadas com segurança em ambientes de produção, consulte provedor de configuração do Azure Key Vault. Os segredos de desenvolvimento não devem ser usados para produção ou teste.
Notas de esquema:
- Os nomes dos pontos de extremidade são insensíveis a maiúsculas e minúsculas. Por exemplo,
HTTPS
eHttps
são equivalentes. - O parâmetro
Url
é necessário para cada ponto de extremidade. O formato para esse parâmetro é o mesmo que o parâmetro de configuração deUrls
de nível superior, exceto que ele é limitado a um único valor. - Esses pontos de extremidade substituem os definidos na configuração superior
Urls
em vez de acrescentá-los. Os pontos de extremidade definidos no código viaListen
são cumulativos com os pontos de extremidade definidos na seção de configuração. - A secção
Certificate
é opcional. Se a seçãoCertificate
não for especificada, os padrões definidos emCertificates:Default
serão usados. Se nenhum padrão estiver disponível, o certificado de desenvolvimento será usado. Se não houver padrões e o certificado de desenvolvimento não estiver presente, o servidor lançará uma exceção e falhará ao iniciar. - A seção
Certificate
oferece suporte a várias fontes de certificado . - Qualquer número de pontos de extremidade pode ser definido em Configuração, desde que não causem conflitos de portas.
Fontes de certificados
Os nós de certificado podem ser configurados para carregar certificados de várias fontes:
-
Path
ePassword
para carregar arquivos .pfx. -
Path
,KeyPath
ePassword
para carregar os arquivos .pem,/.crt, e .key. -
Subject
eStore
para carregar do repositório de certificados.
Por exemplo, o certificado Certificates:Default
pode ser especificado como:
"Default": {
"Subject": "<subject; required>",
"Store": "<cert store; required>",
"Location": "<location; defaults to CurrentUser>",
"AllowInvalid": "<true or false; defaults to false>"
}
Carregador de Configuração
Configure(IConfiguration) retorna um KestrelConfigurationLoader com um método Endpoint(String, Action<EndpointConfiguration>) que pode ser utilizado para complementar as definições de um endpoint configurado:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
var kestrelSection = context.Configuration.GetSection("Kestrel");
serverOptions.Configure(kestrelSection)
.Endpoint("HTTPS", listenOptions =>
{
// ...
});
});
KestrelServerOptions.ConfigurationLoader
pode ser acessado diretamente para continuar iterando no carregador existente, como o fornecido pelo WebApplicationBuilder.WebHost.
- A seção de configuração para cada ponto de extremidade está disponível nas opções no método
Endpoint
para que as configurações personalizadas possam ser lidas. - Várias configurações podem ser carregadas ao chamar novamente Configure(IConfiguration) com outra seção. Somente a última configuração é usada, a menos que
Load
seja explicitamente chamada em instâncias anteriores. O metapacote não chamaLoad
de modo que a sua secção de configuração padrão possa ser substituída. -
KestrelConfigurationLoader
espelha a família de APIsListen
doKestrelServerOptions
quandoEndpoint
sobrecarrega, portanto, o código e os endpoints de configuração podem ser configurados no mesmo local. Essas sobrecargas não usam nomes e consomem apenas as opções padrão da configuração.
Alterar os padrões no código
ConfigureEndpointDefaults
e ConfigureHttpsDefaults
podem ser usados para alterar as configurações padrão para ListenOptions
e HttpsConnectionAdapterOptions
, incluindo a substituição do certificado padrão especificado no cenário anterior.
ConfigureEndpointDefaults
e ConfigureHttpsDefaults
devem ser chamados antes que quaisquer pontos de extremidade sejam configurados.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.ConfigureEndpointDefaults(listenOptions =>
{
// ...
});
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
// ...
});
});
Configurar endpoints usando a Indicação de Nome de Servidor
Indicação de Nome de Servidor (SNI) pode ser usada para hospedar vários domínios no mesmo endereço IP e porta. Para que o SNI funcione, o cliente envia o nome do host para a sessão segura para o servidor durante o handshake TLS para que o servidor possa fornecer o certificado correto. O cliente usa o certificado fornecido para comunicação criptografada com o servidor durante a sessão segura que segue o handshake TLS.
O SNI pode ser configurado de duas maneiras:
- Crie um endpoint no código e selecione um certificado usando o nome do host com a callback ServerCertificateSelector.
- Configure um mapeamento entre nomes de host e opções HTTPS no Configuration. Por exemplo, JSON no arquivo
appsettings.json
.
SNI com ServerCertificateSelector
Kestrel suporta SNI através do callback ServerCertificateSelector
. O callback é invocado uma vez por conexão para permitir que a aplicação inspecione o nome do host e selecione o certificado apropriado.
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 com ServerOptionsSelectionCallback
Kestrel suporta configuração TLS dinâmica adicional através do callback ServerOptionsSelectionCallback
. O retorno de chamada é invocado uma vez por conexão para permitir que o aplicativo inspecione o nome do host e selecione o certificado apropriado e a configuração TLS. Os certificados padrão e o ConfigureHttpsDefaults
não são usados com esta chamada de retorno.
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 com TlsHandshakeCallbackOptions
Kestrel suporta configuração TLS dinâmica adicional através do callback TlsHandshakeCallbackOptions.OnConnection
. O retorno de chamada é invocado uma vez por conexão para permitir que o aplicativo inspecione o nome do host e selecione o certificado apropriado, a configuração TLS e outras opções do servidor. Os certificados padrão e o ConfigureHttpsDefaults
não são usados com esta chamada de retorno.
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 em configuração
Kestrel suporta SNI definido na configuração. Um ponto de extremidade pode ser configurado com um objeto Sni
que contém um mapeamento entre nomes de host e opções HTTPS. O nome do host de conexão corresponde às opções e elas são usadas para essa mesma conexão.
A configuração a seguir adiciona um ponto de extremidade chamado MySniEndpoint
que usa SNI para selecionar opções HTTPS com base no nome do host:
{
"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$"
}
}
}
}
Advertência
No exemplo anterior, as senhas de certificado são armazenadas em texto sem formatação em appsettings.json
. O token $CREDENTIAL_PLACEHOLDER$
é usado como um espaço reservado para a senha de cada certificado. Para armazenar senhas de certificado com segurança em ambientes de desenvolvimento, veja Proteção de segredos no desenvolvimento. Para que as senhas de certificado sejam armazenadas com segurança em ambientes de produção, consulte provedor de configuração do Azure Key Vault. Os segredos de desenvolvimento não devem ser usados para produção ou teste.
Opções HTTPS que podem ser substituídas pelo SNI:
-
Certificate
configura a origem do certificado . -
Protocols
configura os protocolos HTTP permitidos. -
SslProtocols
configura os protocolos permitidos de SSL . -
ClientCertificateMode
configura os requisitos de certificado de cliente .
O nome do host oferece suporte à correspondência por caracteres substitutos:
- Correspondência exata. Por exemplo,
a.example.org
correspondea.example.org
. - Prefixo de substituição. Se houver várias correspondências curinga, o padrão mais longo será escolhido. Por exemplo,
*.example.org
corresponde ab.example.org
ec.example.org
. - Curinga completo.
*
corresponde a todo o resto, incluindo clientes que não estão usando SNI e não enviam um nome de host.
A configuração SNI correspondente é aplicada ao ponto final da conexão, substituindo os valores do ponto final. Se uma conexão não corresponder a um nome de host SNI configurado, a conexão será recusada.
Requisitos do SNI
Todos os websites devem executar na mesma instância Kestrel. Kestrel não suporta a partilha de um endereço IP e porta entre várias instâncias sem um proxy reverso.
Protocolos SSL/TLS
Os protocolos SSL são protocolos usados para criptografar e descriptografar o tráfego entre dois pares, tradicionalmente um cliente e um servidor.
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$"
}
}
}
}
}
Advertência
No exemplo anterior, a senha do certificado é armazenada em texto sem formatação no appsettings.json
. O token $CREDENTIAL_PLACEHOLDER$
é usado como um espaço reservado para a senha do certificado. Para armazenar senhas de certificado com segurança em ambientes de desenvolvimento, veja Proteção de segredos no desenvolvimento. Para que as senhas de certificado sejam armazenadas com segurança em ambientes de produção, consulte provedor de configuração do Azure Key Vault. Os segredos de desenvolvimento não devem ser usados para produção ou teste.
O valor padrão, SslProtocols.None
, faz com que Kestrel use os padrões do sistema operacional para escolher o melhor protocolo. A menos que você tenha um motivo específico para selecionar um protocolo, use o padrão.
Certificados de Cliente
ClientCertificateMode
configura os requisitos de certificado de cliente .
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$"
}
}
}
}
}
Advertência
No exemplo anterior, a senha do certificado é armazenada em texto sem formatação no appsettings.json
. O token $CREDENTIAL_PLACEHOLDER$
é usado como um espaço reservado para a senha do certificado. Para armazenar senhas de certificado com segurança em ambientes de desenvolvimento, veja Proteção de segredos no desenvolvimento. Para que as senhas de certificado sejam armazenadas com segurança em ambientes de produção, consulte provedor de configuração do Azure Key Vault.
O valor padrão é ClientCertificateMode.NoCertificate
em que Kestrel não solicitará ou exigirá um certificado do cliente.
Para obter mais informações, consulte Configurar autenticação de certificado no ASP.NET Core.
Registo de conexões
Chame UseConnectionLogging para emitir logs de nível de depuração para comunicação em nível de byte numa ligação. O registo de ligações é útil para resolver problemas na comunicação de baixo nível, como durante a encriptação TLS e atrás de proxies. Se UseConnectionLogging
for colocado antes de UseHttps
, o tráfego criptografado será registado. Se UseConnectionLogging
for colocado após UseHttps
, o tráfego desencriptado é registado. Isso é integrado Connection Middleware.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.Listen(IPAddress.Any, 8000, listenOptions =>
{
listenOptions.UseConnectionLogging();
});
});
Ligar a uma porta TCP
O método Listen liga-se a um soquete TCP e um lambda de opções permite a configuração do certificado 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");
});
});
O exemplo configura HTTPS para um ponto de extremidade com ListenOptions. Use a mesma API para configurar outras definições de Kestrel para pontos de extremidade específicos.
No Windows, certificados autoassinados podem ser criados usando o cmdlet New-SelfSignedCertificate
PowerShell. Para obter um exemplo sem suporte, consulte UpdateIISExpressSSLForChrome.ps1
.
No macOS, Linux e Windows, os certificados podem ser criados usando OpenSSL.
Vincular a um soquete Unix
Utilize um socket Unix com ListenUnixSocket para melhorar o desempenho com o Nginx, como demonstrado neste exemplo:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.ListenUnixSocket("/tmp/kestrel-test.sock");
});
- No arquivo de configuração do Nginx, defina a entrada
server
>location
>proxy_pass
comohttp://unix:/tmp/{KESTREL SOCKET}:/;
.{KESTREL SOCKET}
é o nome do soquete fornecido ao ListenUnixSocket (por exemplo,kestrel-test.sock
no exemplo anterior). - Certifique-se de que o soquete é gravável por Nginx (por exemplo,
chmod go+w /tmp/kestrel-test.sock
).
Porta 0
Quando o número da porta 0
é especificado, Kestrel se liga dinamicamente a uma porta disponível. O exemplo a seguir mostra como determinar a qual porta Kestrel foi atribuída durante a execução:
app.Run(async (context) =>
{
var serverAddressFeature = context.Features.Get<IServerAddressesFeature>();
if (serverAddressFeature is not null)
{
var listenAddresses = string.Join(", ", serverAddressFeature.Addresses);
// ...
}
});
A vinculação dinâmica de uma porta não está disponível em algumas situações:
ListenLocalhost
- Vinculando HTTP/1.1 ou HTTP/2 baseado em TCP e HTTP/3 baseado em QUIC.
Limitações
Configurar endpoints com as seguintes abordagens:
- UseUrls
-
--urls
argumento de linha de comando -
urls
chave de configuração do host -
ASPNETCORE_URLS
variável de ambiente
Esses métodos são úteis para fazer o código funcionar com servidores diferentes Kestrel. No entanto, esteja ciente das seguintes limitações:
- HTTPS não pode ser usado com essas abordagens, a menos que um certificado padrão seja fornecido na configuração do ponto de extremidade HTTPS (por exemplo, usando a configuração
KestrelServerOptions
ou um arquivo de configuração, como mostrado anteriormente). - Quando as abordagens
Listen
eUseUrls
são usadas simultaneamente, os pontos de extremidadeListen
substituem os pontos de extremidadeUseUrls
.
Configuração do terminal do IIS
Ao usar o IIS, as associações de URL para ligações de substituição do IIS são definidas por Listen
ou UseUrls
. Para obter mais informações, consulte ASP.NET módulo principal.
ListenOptions.Protocolos
A propriedade Protocols
estabelece os protocolos HTTP (HttpProtocols
) habilitados num ponto terminal de ligação ou para o servidor. Atribua um valor à propriedade Protocols
a partir do HttpProtocols
enum.
HttpProtocols valor de enum |
Protocolo de conexão permitido |
---|---|
Http1 |
HTTP/1.1 apenas. Pode ser usado com ou sem TLS. |
Http2 |
HTTP/2 apenas. Pode ser usado sem TLS somente se o cliente suportar um modo Conhecimento Prévio. |
Http3 |
HTTP/3 apenas. É necessário o uso de TLS. O cliente pode precisar ser configurado para usar somente HTTP/3. |
Http1AndHttp2 |
HTTP/1.1 e HTTP/2. HTTP/2 requer que o cliente selecione HTTP/2 no TLS Application-Layer Protocol Negotiation (ALPN) handshake; caso contrário, o padrão de conexão é HTTP/1.1. |
Http1AndHttp2AndHttp3 |
HTTP/1.1, HTTP/2 e HTTP/3. A primeira solicitação de cliente normalmente usa HTTP/1.1 ou HTTP/2, e o cabeçalho de resposta alt-svc solicita que o cliente atualize para HTTP/3. HTTP/2 e HTTP/3 requer TLS; caso contrário, o padrão de conexão é HTTP/1.1. |
O valor ListenOptions.Protocols
padrão para qualquer ponto de extremidade é HttpProtocols.Http1AndHttp2
.
Restrições TLS para HTTP/2:
- TLS versão 1.2 ou posterior
- Renegociação desativada
- Compressão desativada
- Tamanhos mínimos de troca de chaves efêmeras:
- Curva elíptica Diffie-Hellman (ECDHE) [RFC4492]: mínimo de 224 bits
- Diffie-Hellman de campo finito (DHE) [
TLS12
]: mínimo de 2048 bits
- Conjunto de cifras não proibido.
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
[TLS-ECDHE
] com a curva elíptica P-256 [FIPS186
] é suportada por padrão.
O exemplo a seguir permite conexões HTTP/1.1 e HTTP/2 na porta 8000. As conexões são protegidas por TLS com um certificado fornecido:
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;
});
});
No Linux, CipherSuitesPolicy pode ser usado para filtrar handshakes TLS por conexão:
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,
// ...
});
};
});
});
Middleware de conexão
O middleware de conexão personalizado pode filtrar handshakes TLS com base em cada conexão para cifras específicas, se necessário.
O exemplo a seguir lança NotSupportedException para qualquer algoritmo de codificação que o aplicativo não suporta. Como alternativa, defina e compare ITlsHandshakeFeature.CipherAlgorithm com uma lista de pacotes de codificação aceitáveis.
Nenhuma criptografia é usada com um algoritmo de cifra CipherAlgorithmType.Null.
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();
});
});
});
Definir o protocolo HTTP a partir da configuração
Por padrão, a configuração Kestrel é carregada da secção Kestrel
. O exemplo appsettings.json
a seguir estabelece HTTP/1.1 como o protocolo de conexão padrão para todos os endereços.
{
"Kestrel": {
"EndpointDefaults": {
"Protocols": "Http1"
}
}
}
O exemplo de appsettings.json
a seguir estabelece o protocolo de conexão HTTP/1.1 para um ponto de extremidade específico:
{
"Kestrel": {
"Endpoints": {
"HttpsDefaultCert": {
"Url": "https://localhost:5001",
"Protocols": "Http1"
}
}
}
}
Os protocolos especificados no código substituem os valores definidos pela configuração.
Prefixos de URL
Ao usar UseUrls
, --urls
argumento de linha de comando, urls
chave de configuração do host ou ASPNETCORE_URLS
variável de ambiente, os prefixos de URL podem estar em qualquer um dos seguintes formatos.
Apenas os prefixos de URL HTTP são válidos.
Kestrel não suporta HTTPS ao configurar associações de URL usando UseUrls
.
Endereço IPv4 com número de porta
http://65.55.39.10:80/
0.0.0.0
é um caso especial que se liga a todos os endereços IPv4.Endereço IPv6 com número de porta
http://[0:0:0:0:0:ffff:4137:270a]:80/
[::]
é o equivalente IPv6 do IPv40.0.0.0
.Nome do host com número da porta
http://contoso.com:80/ http://*:80/
Os nomes dos anfitriões,
*
e+
não são especiais. Qualquer elemento que não seja reconhecido como um endereço IP válido oulocalhost
será associado a todos os IPs IPv4 e IPv6. Para vincular nomes de host diferentes a aplicativos ASP.NET Core diferentes na mesma porta, use HTTP.sys ou um servidor proxy reverso. Exemplos de servidor proxy reverso incluem IIS, Nginx ou Apache.Advertência
A hospedagem numa configuração de proxy reverso requer filtros de anfitrião.
Nome do host
localhost
com número de porta ou IP de retorno com número de portahttp://localhost:5000/ http://127.0.0.1:5000/ http://[::1]:5000/
Quando
localhost
é especificado, Kestrel tenta ligar-se às interfaces de loopback do IPv4 e do IPv6. Se a porta solicitada estiver em uso por outro serviço em qualquer interface de loopback, Kestrel falha ao iniciar. Se qualquer interface de loopback estiver indisponível por qualquer outro motivo (mais comumente porque o IPv6 não é suportado), Kestrel registrará um aviso.
ASP.NET projetos principais são configurados para se vincular a uma porta HTTP aleatória entre 5000-5300 e uma porta HTTPS aleatória entre 7000-7300. Essa configuração padrão é especificada no arquivo de Properties/launchSettings.json
gerado e pode ser substituída. Se nenhuma porta for especificada, Kestrel liga-se a:
http://localhost:5000
-
https://localhost:5001
(quando existe um certificado de desenvolvimento local)
Especifique URLs usando:
-
ASPNETCORE_URLS
variável de ambiente. -
--urls
argumento de linha de comando. -
urls
chave de configuração do host. - UseUrls método de extensão.
O valor fornecido ao usar estas abordagens pode ser um ou mais endereços HTTP e HTTPS (HTTPS se um certificado padrão estiver disponível). Configure o valor como uma lista separada por ponto-e-vírgula (por exemplo, "Urls": "http://localhost:8000;http://localhost:8001"
).
Para obter mais informações sobre essas abordagens, consulte Server URLs e Override configuration.
Um certificado de desenvolvimento é criado:
- Quando o SDK .NET é instalado.
- A ferramenta dev-certs é usada para criar um certificado.
O certificado de desenvolvimento está disponível apenas para o usuário que gera o certificado. Alguns navegadores exigem a concessão de permissão explícita para confiar no certificado de desenvolvimento local.
Os modelos de projeto configuram aplicativos para serem executados em HTTPS por padrão e incluem redirecionamento HTTPS e suporte a HSTS.
Chame os métodos Listen ou ListenUnixSocket em KestrelServerOptions para configurar prefixos de URL e portas para Kestrel.
UseUrls
, o argumento de linha de comando --urls
, urls
chave de configuração do host e a variável de ambiente ASPNETCORE_URLS
também funcionam, mas têm as limitações observadas posteriormente nesta seção (um certificado padrão deve estar disponível para configuração de ponto de extremidade HTTPS).
KestrelServerOptions
configuração:
ConfigurarPadrõesDePontoFinal
ConfigureEndpointDefaults(Action<ListenOptions>) especifica uma configuração Action
para executar em cada ponto de extremidade especificado. Chamar ConfigureEndpointDefaults
várias vezes substitui os Action
anteriores pelo último Action
especificado:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureEndpointDefaults(listenOptions =>
{
// ...
});
});
Observação
Os pontos de extremidade criados ao chamar
Configurar(IConfiguration)
Permite que Kestrel carregue pontos de extremidade de um IConfiguration. A configuração deve estar limitada à seção de configuração para Kestrel. A sobrecarga de Configure(IConfiguration, bool)
pode ser usada para habilitar o recarregamento de pontos de extremidade quando a fonte de configuração for alterada.
Por padrão, a configuração Kestrel é carregada da seção Kestrel
e o recarregamento de alterações está habilitado.
{
"Kestrel": {
"Endpoints": {
"Http": {
"Url": "http://localhost:5000"
},
"Https": {
"Url": "https://localhost:5001"
}
}
}
}
Se a recarga da configuração estiver ativada e for sinalizada uma alteração, os seguintes passos serão executados:
- A nova configuração é comparada com a antiga, e qualquer ponto de extremidade sem alterações de configuração não é modificado.
- Os endpoints removidos ou modificados recebem 5 segundos para concluir o processamento das solicitações e encerrar.
- Endpoints novos ou modificados são ativados.
Os clientes que se conectam a um ponto de extremidade modificado podem ser desconectados ou recusados enquanto o ponto de extremidade é reiniciado.
Configurar Predefinições Https
ConfigureHttpsDefaults(Action<HttpsConnectionAdapterOptions>) especifica uma configuração Action
a ser executada para cada endpoint HTTPS. Chamar ConfigureHttpsDefaults
várias vezes substitui os Action
anteriores pelo último Action
especificado.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
// ...
});
});
Observação
Os pontos de extremidade criados ao chamar Listenantes de chamar ConfigureHttpsDefaults não terão os padrões aplicados.
ListenOptions.UseHttps
Configure Kestrel para usar HTTPS.
ListenOptions.UseHttps
extensões:
-
UseHttps
: Configure Kestrel para usar HTTPS com o certificado padrão. Lança uma exceção se nenhum certificado padrão estiver configurado. 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
parâmetros:
-
filename
é o caminho e o nome de arquivo de um arquivo de certificado, relativo ao diretório que contém os arquivos de conteúdo do aplicativo. -
password
é a senha necessária para acessar os dados do certificado X.509. -
configureOptions
é um(a)Action
para configurar oHttpsConnectionAdapterOptions
. Devolve oListenOptions
. -
storeName
é o repositório de certificados do qual se carrega o certificado. -
subject
é o nome do assunto do certificado. -
allowInvalid
indica se certificados inválidos devem ser considerados, como certificados autoassinados. -
location
é o local de armazenamento a partir do qual carregar o certificado. -
serverCertificate
é o certificado X.509.
Na produção, o HTTPS deve ser explicitamente configurado. No mínimo, um certificado padrão deve ser fornecido.
Configurações suportadas descritas a seguir:
- Sem configuração
- Substitua o certificado padrão da configuração
- Alterar os padrões no código
Sem configuração
Kestrel escuta http://localhost:5000
e https://localhost:5001
(se um certificado padrão estiver disponível).
Substitua o certificado padrão da configuração
Um esquema de configuração padrão para aplicações HTTPS está disponível para Kestrel. Configure vários pontos de extremidade, incluindo as URLs e os certificados a serem usados, quer a partir de um ficheiro no disco, quer de um armazenamento de certificados.
No exemplo appsettings.json
seguinte:
- Defina
AllowInvalid
comotrue
para permitir o uso de certificados inválidos (por exemplo, certificados autoassinados). - Qualquer ponto de extremidade HTTPS que não especifique um certificado (
HttpsDefaultCert
no exemplo a seguir) retornará ao certificado definido emCertificates:Default
ou ao certificado de desenvolvimento.
{
"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$"
}
}
}
}
Advertência
No exemplo anterior, as senhas de certificado são armazenadas em texto sem formatação em appsettings.json
. O token $CREDENTIAL_PLACEHOLDER$
é usado como um espaço reservado para a senha de cada certificado. Para armazenar senhas de certificado com segurança em ambientes de desenvolvimento, veja Proteção de segredos no desenvolvimento. Para que as senhas de certificado sejam armazenadas com segurança em ambientes de produção, consulte provedor de configuração do Azure Key Vault. Os segredos de desenvolvimento não devem ser usados para produção ou teste.
Notas de esquema:
- Os nomes dos pontos de extremidade são insensíveis a maiúsculas e minúsculas. Por exemplo,
HTTPS
eHttps
são equivalentes. - O parâmetro
Url
é necessário para cada ponto de extremidade. O formato para esse parâmetro é o mesmo que o parâmetro de configuração deUrls
de nível superior, exceto que ele é limitado a um único valor. - Esses pontos de extremidade substituem os definidos na configuração superior
Urls
em vez de acrescentá-los. Os pontos de extremidade definidos no código viaListen
são cumulativos com os pontos de extremidade definidos na seção de configuração. - A secção
Certificate
é opcional. Se a seçãoCertificate
não for especificada, os padrões definidos emCertificates:Default
serão usados. Se nenhum padrão estiver disponível, o certificado de desenvolvimento será usado. Se não houver padrões e o certificado de desenvolvimento não estiver presente, o servidor lançará uma exceção e falhará ao iniciar. - A seção
Certificate
oferece suporte a várias fontes de certificado . - Qualquer número de pontos de extremidade pode ser definido na Configuração, desde que não causem conflitos de portas.
Fontes de certificados
Os nós de certificado podem ser configurados para carregar certificados de várias fontes:
-
Path
ePassword
para carregar arquivos .pfx. -
Path
,KeyPath
ePassword
para carregar os arquivos .pem,/.crt, e .key. -
Subject
eStore
para carregar do repositório de certificados.
Por exemplo, o certificado Certificates:Default
pode ser especificado como:
"Default": {
"Subject": "<subject; required>",
"Store": "<cert store; required>",
"Location": "<location; defaults to CurrentUser>",
"AllowInvalid": "<true or false; defaults to false>"
}
Carregador de Configuração
Configure(IConfiguration) retorna um KestrelConfigurationLoader com um método Endpoint(String, Action<EndpointConfiguration>) que pode ser utilizado para complementar as definições de um endpoint configurado:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
var kestrelSection = context.Configuration.GetSection("Kestrel");
serverOptions.Configure(kestrelSection)
.Endpoint("HTTPS", listenOptions =>
{
// ...
});
});
KestrelServerOptions.ConfigurationLoader
pode ser acessado diretamente para continuar iterando no carregador existente, como o fornecido pelo WebApplicationBuilder.WebHost.
- A seção de configuração para cada ponto de extremidade está disponível nas opções no método
Endpoint
para que as configurações personalizadas possam ser lidas. - Várias configurações podem ser carregadas ao chamar novamente o Configure(IConfiguration) com outra secção. Somente a última configuração é usada, a menos que
Load
seja explicitamente chamada em instâncias anteriores. O metapacote não chamaLoad
para que sua seção de configuração padrão possa ser substituída. -
KestrelConfigurationLoader
espelha a família de APIsListen
doKestrelServerOptions
quandoEndpoint
sobrecarrega, portanto, o código e os endpoints de configuração podem ser configurados no mesmo local. Essas sobrecargas não usam nomes e consomem apenas as configurações padrão do sistema.
Alterar os padrões no código
ConfigureEndpointDefaults
e ConfigureHttpsDefaults
podem ser usados para alterar as configurações padrão para ListenOptions
e HttpsConnectionAdapterOptions
, incluindo a substituição do certificado padrão especificado no cenário anterior.
ConfigureEndpointDefaults
e ConfigureHttpsDefaults
devem ser chamados antes de que qualquer ponto de extremidade seja configurado.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.ConfigureEndpointDefaults(listenOptions =>
{
// ...
});
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
// ...
});
});
Configurar endpoints usando Server Name Indication
Indicação de Nome de Servidor (SNI) pode ser usada para hospedar vários domínios no mesmo endereço IP e porta. Para que o SNI funcione, o cliente envia o nome do host para a sessão segura para o servidor durante o handshake TLS para que o servidor possa fornecer o certificado correto. O cliente usa o certificado fornecido para comunicação criptografada com o servidor durante a sessão segura que segue o handshake TLS.
O SNI pode ser configurado de duas maneiras:
- Crie um endpoint no código e selecione um certificado usando o nome do host com a chamada de retorno ServerCertificateSelector.
- Configure um mapeamento entre nomes de host e opções HTTPS no Configuration. Por exemplo, JSON no arquivo
appsettings.json
.
SNI com ServerCertificateSelector
Kestrel suporta SNI através do callback ServerCertificateSelector
. O callback é invocado uma vez por conexão para permitir que a aplicação inspecione o nome do host e selecione o certificado apropriado.
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 com ServerOptionsSelectionCallback
Kestrel suporta configuração TLS dinâmica adicional através da função de retorno ServerOptionsSelectionCallback
. O retorno de chamada é invocado uma vez por conexão para permitir que o aplicativo inspecione o nome do host e selecione o certificado apropriado e a configuração TLS. Os certificados padrão e o ConfigureHttpsDefaults
não são usados com esta chamada de retorno.
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 com TlsHandshakeCallbackOptions
Kestrel suporta configuração TLS dinâmica adicional através do callback TlsHandshakeCallbackOptions.OnConnection
. O retorno de chamada é invocado uma vez por conexão para permitir que o aplicativo inspecione o nome do host e selecione o certificado apropriado, a configuração TLS e outras opções do servidor. Os certificados padrão e o ConfigureHttpsDefaults
não são usados com esta chamada de retorno.
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 em configuração
Kestrel suporta SNI definido na configuração. Um ponto final pode ser configurado com um objeto Sni
que contém um mapeamento entre nomes de anfitrião e opções HTTPS. O nome do host de conexão corresponde às opções e elas são usadas para essa mesma conexão.
A configuração a seguir adiciona um ponto de extremidade chamado MySniEndpoint
que usa SNI para selecionar opções HTTPS com base no nome do host:
{
"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$"
}
}
}
}
Advertência
No exemplo anterior, as senhas de certificado são armazenadas em texto sem formatação em appsettings.json
. O token $CREDENTIAL_PLACEHOLDER$
é usado como um espaço reservado para a senha de cada certificado. Para armazenar senhas de certificado com segurança em ambientes de desenvolvimento, veja Proteção de segredos no desenvolvimento. Para que as senhas de certificado sejam armazenadas com segurança em ambientes de produção, consulte provedor de configuração do Azure Key Vault. Os segredos de desenvolvimento não devem ser usados para produção ou teste.
Opções HTTPS que podem ser substituídas pelo SNI:
-
Certificate
configura a origem do certificado . -
Protocols
configura os protocolos HTTP permitidos. -
SslProtocols
configura os protocolos permitidos de SSL . -
ClientCertificateMode
configura os requisitos de certificado de cliente .
O nome do host oferece suporte à correspondência por caracteres substitutos:
- Correspondência exata. Por exemplo,
a.example.org
correspondea.example.org
. - Prefixo de substituição. Se houver várias correspondências de coringa, o padrão mais longo será escolhido. Por exemplo,
*.example.org
corresponde ab.example.org
ec.example.org
. - Curinga completo.
*
corresponde a todo o resto, incluindo clientes que não estão usando SNI e não enviam um nome de host.
A configuração SNI correspondente é aplicada ao ponto final para a ligação, substituindo os valores existentes nele. Se uma conexão não corresponder a um nome de host SNI configurado, a conexão será recusada.
Requisitos do SNI
Todos os websites devem operar na mesma instância Kestrel. Kestrel não suporta a partilha de um endereço IP e porta entre várias instâncias sem um proxy reverso.
Protocolos SSL/TLS
Os protocolos SSL são protocolos usados para criptografar e descriptografar o tráfego entre dois pares, tradicionalmente um cliente e um servidor.
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$"
}
}
}
}
}
Advertência
No exemplo anterior, a senha do certificado é armazenada em texto sem formatação no appsettings.json
. O token $CREDENTIAL_PLACEHOLDER$
é usado como um espaço reservado para a senha do certificado. Para armazenar senhas de certificado com segurança em ambientes de desenvolvimento, veja Proteção de segredos no desenvolvimento. Para que as senhas de certificado sejam armazenadas com segurança em ambientes de produção, consulte provedor de configuração do Azure Key Vault. Os segredos de desenvolvimento não devem ser usados para produção ou teste.
O valor padrão, SslProtocols.None
, faz com que Kestrel use os padrões do sistema operacional para escolher o melhor protocolo. A menos que você tenha um motivo específico para selecionar um protocolo, use o padrão.
Certificados de Cliente
ClientCertificateMode
configura os requisitos de certificado de cliente .
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$"
}
}
}
}
}
Advertência
No exemplo anterior, a senha do certificado é armazenada em texto sem formatação no appsettings.json
. O token $CREDENTIAL_PLACEHOLDER$
é usado como um espaço reservado para a senha do certificado. Para armazenar senhas de certificado com segurança em ambientes de desenvolvimento, veja Proteção de segredos no desenvolvimento. Para que as senhas de certificado sejam armazenadas com segurança em ambientes de produção, consulte provedor de configuração do Azure Key Vault.
O valor padrão é ClientCertificateMode.NoCertificate
em que Kestrel não solicitará ou exigirá um certificado do cliente.
Para obter mais informações, consulte Configurar autenticação de certificado no ASP.NET Core.
Registo de conexões
Chame UseConnectionLogging para emitir logs ao nível de Debug para comunicação ao nível de bytes numa ligação. O log de conexão é útil para solucionar problemas em comunicação de baixo nível, como durante a criptografia TLS e atrás de proxies. Se UseConnectionLogging
for colocado antes de UseHttps
, o tráfego criptografado será registado. Se UseConnectionLogging
for colocado após UseHttps
, o tráfego desencriptado é registado. Isto está integrado no Connection Middleware.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.Listen(IPAddress.Any, 8000, listenOptions =>
{
listenOptions.UseConnectionLogging();
});
});
Ligar a um soquete TCP
O método Listen liga-se a um soquete TCP e um lambda de opções permite a configuração do certificado 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");
});
});
O exemplo configura HTTPS para um endpoint com ListenOptions. Use a mesma API para configurar outras definições de Kestrel para pontos de extremidade específicos.
No Windows, certificados autoassinados podem ser criados usando o cmdlet New-SelfSignedCertificate
PowerShell. Para obter um exemplo sem suporte, consulte UpdateIISExpressSSLForChrome.ps1
.
No macOS, Linux e Windows, os certificados podem ser criados usando OpenSSL.
Vincular a um soquete Unix
Utilize um socket Unix com ListenUnixSocket para melhorar o desempenho com o Nginx, como demonstrado neste exemplo:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.ListenUnixSocket("/tmp/kestrel-test.sock");
});
- No arquivo de configuração do Nginx, defina a entrada
server
>location
>proxy_pass
comohttp://unix:/tmp/{KESTREL SOCKET}:/;
.{KESTREL SOCKET}
é o nome do soquete fornecido ao ListenUnixSocket (por exemplo,kestrel-test.sock
no exemplo anterior). - Certifique-se de que o soquete é gravável por Nginx (por exemplo,
chmod go+w /tmp/kestrel-test.sock
).
Porta 0
Quando o número da porta 0
é especificado, Kestrel se liga dinamicamente a uma porta disponível. O exemplo a seguir mostra como determinar a qual porta Kestrel foi atribuída durante a execução:
app.Run(async (context) =>
{
var serverAddressFeature = context.Features.Get<IServerAddressesFeature>();
if (serverAddressFeature is not null)
{
var listenAddresses = string.Join(", ", serverAddressFeature.Addresses);
// ...
}
});
Limitações
Configurar endpoints com as seguintes abordagens:
- UseUrls
-
--urls
argumento de linha de comando -
urls
chave de configuração do host -
ASPNETCORE_URLS
variável de ambiente
Esses métodos são úteis para fazer o código funcionar com servidores diferentes Kestrel. No entanto, esteja ciente das seguintes limitações:
- HTTPS não pode ser usado com essas abordagens, a menos que um certificado padrão seja fornecido na configuração do ponto de extremidade HTTPS (por exemplo, usando a configuração
KestrelServerOptions
ou um arquivo de configuração, como mostrado anteriormente). - Quando as abordagens
Listen
eUseUrls
são usadas simultaneamente, os pontos de extremidadeListen
substituem os pontos de extremidadeUseUrls
.
Configuração do terminal do IIS
Ao usar o IIS, as associações de URL para ligações de substituição do IIS são definidas por Listen
ou UseUrls
. Para obter mais informações, consulte ASP.NET módulo principal.
ListenOptions.Protocolos
A propriedade Protocols
estabelece os protocolos HTTP (HttpProtocols
) habilitados num ponto terminal de ligação ou para o servidor. Atribua um valor à propriedade Protocols
a partir do HttpProtocols
enum.
HttpProtocols valor de enum |
Protocolo de conexão permitido |
---|---|
Http1 |
HTTP/1.1 apenas. Pode ser usado com ou sem TLS. |
Http2 |
HTTP/2 apenas. Pode ser usado sem TLS somente se o cliente suportar um modo Conhecimento Prévio. |
Http1AndHttp2 |
HTTP/1.1 e HTTP/2. HTTP/2 requer que o cliente selecione HTTP/2 no TLS Application-Layer Protocol Negotiation (ALPN) handshake; caso contrário, o padrão de conexão é HTTP/1.1. |
O valor ListenOptions.Protocols
padrão para qualquer ponto de extremidade é HttpProtocols.Http1AndHttp2
.
Restrições TLS para HTTP/2:
- TLS versão 1.2 ou posterior
- Renegociação desativada
- Compressão desativada
- Tamanhos mínimos de troca de chaves efêmeras:
- Curva elíptica Diffie-Hellman (ECDHE) [RFC4492]: mínimo de 224 bits
- Diffie-Hellman de campo finito (DHE) [
TLS12
]: mínimo de 2048 bits
- Cipher suite não proibida.
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
[TLS-ECDHE
] com a curva elíptica P-256 [FIPS186
] é suportada por padrão.
O exemplo a seguir permite conexões HTTP/1.1 e HTTP/2 na porta 8000. As conexões são protegidas por TLS com um certificado fornecido:
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;
});
});
No Linux, CipherSuitesPolicy pode ser usado para filtrar handshakes TLS por conexão:
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,
// ...
});
};
});
});
Middleware de conexão
O middleware de conexão personalizado pode filtrar handshakes TLS por conexão para cifras específicas, se necessário.
O exemplo a seguir lança NotSupportedException para qualquer algoritmo de codificação que o aplicativo não suporta. Como alternativa, defina e compare ITlsHandshakeFeature.CipherAlgorithm com uma lista de pacotes de codificação aceitáveis.
Nenhuma criptografia é usada com um algoritmo de cifra CipherAlgorithmType.Null.
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();
});
});
});
Definir o protocolo HTTP a partir da configuração
Por padrão, a configuração Kestrel é carregada da secção Kestrel
. O exemplo appsettings.json
a seguir estabelece HTTP/1.1 como o protocolo de conexão padrão para todos os endereços.
{
"Kestrel": {
"EndpointDefaults": {
"Protocols": "Http1"
}
}
}
O exemplo de appsettings.json
a seguir estabelece o protocolo de conexão HTTP/1.1 para um ponto de extremidade específico:
{
"Kestrel": {
"Endpoints": {
"HttpsDefaultCert": {
"Url": "https://localhost:5001",
"Protocols": "Http1"
}
}
}
}
Os protocolos especificados no código substituem os valores definidos pela configuração.
Prefixos de URL
Ao usar UseUrls
, --urls
argumento de linha de comando, urls
chave de configuração do host ou ASPNETCORE_URLS
variável de ambiente, os prefixos de URL podem estar em qualquer um dos seguintes formatos.
Apenas os prefixos de URL HTTP são válidos.
Kestrel não suporta HTTPS ao configurar associações de URL usando UseUrls
.
Endereço IPv4 com número de porta
http://65.55.39.10:80/
0.0.0.0
é um caso especial que se liga a todos os endereços IPv4.Endereço IPv6 com número de porta
http://[0:0:0:0:0:ffff:4137:270a]:80/
[::]
é o equivalente IPv6 do IPv40.0.0.0
.Nome do host com número da porta
http://contoso.com:80/ http://*:80/
Os nomes dos anfitriões,
*
e+
não são especiais. Qualquer elemento que não seja reconhecido como um endereço IP válido oulocalhost
será associado a todos os IPs IPv4 e IPv6. Para vincular nomes de host diferentes a aplicativos ASP.NET Core diferentes na mesma porta, use HTTP.sys ou um servidor proxy reverso. Exemplos de servidor proxy reverso incluem IIS, Nginx ou Apache.Advertência
A hospedagem numa configuração de proxy reverso requer filtros de anfitrião.
Nome do host com número de porta
localhost
ou IP de loopback com número de portahttp://localhost:5000/ http://127.0.0.1:5000/ http://[::1]:5000/
Quando
localhost
é especificado, Kestrel tenta ligar-se às interfaces de loopback do IPv4 e do IPv6. Se a porta solicitada estiver em uso por outro serviço em qualquer interface de loopback, Kestrel falha ao iniciar. Se qualquer interface de loopback estiver indisponível por qualquer outro motivo (mais comumente porque o IPv6 não é suportado), Kestrel registrará um aviso.
Por padrão, ASP.NET Core se liga a:
http://localhost:5000
-
https://localhost:5001
(quando existe um certificado de desenvolvimento local)
Especifique URLs usando:
-
ASPNETCORE_URLS
variável de ambiente. -
--urls
argumento de linha de comando. -
urls
chave de configuração do host. - UseUrls método de extensão.
O valor fornecido ao usar estas abordagens pode ser um ou mais endereços HTTP e HTTPS (HTTPS se um certificado padrão estiver disponível). Configure o valor como uma lista separada por ponto-e-vírgula (por exemplo, "Urls": "http://localhost:8000;http://localhost:8001"
).
Para obter mais informações sobre essas abordagens, consulte Server URLs e Override configuration.
Um certificado de desenvolvimento é criado:
Alguns navegadores exigem a concessão de permissão explícita para confiar no certificado de desenvolvimento local.
Os modelos de projeto configuram aplicativos para serem executados em HTTPS por padrão e incluem redirecionamento HTTPS e suporte a HSTS.
Chame os métodos Listen ou ListenUnixSocket em KestrelServerOptions para configurar prefixos de URL e portas para Kestrel.
UseUrls
, o argumento de linha de comando --urls
, urls
chave de configuração do host e a variável de ambiente ASPNETCORE_URLS
também funcionam, mas têm as limitações observadas posteriormente nesta seção (um certificado padrão deve estar disponível para configuração de ponto de extremidade HTTPS).
KestrelServerOptions
configuração:
ConfigurarPadrõesDePontoFinal
ConfigureEndpointDefaults(Action<ListenOptions>) especifica uma configuração Action
para executar em cada ponto de extremidade especificado. Chamar ConfigureEndpointDefaults
várias vezes substitui os Action
anteriores pelo último Action
especificado.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureEndpointDefaults(listenOptions =>
{
// Configure endpoint defaults
});
});
Observação
Os pontos de extremidade criados ao chamar Listenantes de chamarConfigureEndpointDefaults não terão os padrões aplicados.
Configurar(IConfiguration)
Permite que Kestrel carregue pontos de extremidade de um IConfiguration. A configuração deve ser restrita à secção de configuração do Kestrel.
A sobrecarga de Configure(IConfiguration, bool)
pode ser usada para habilitar o recarregamento de endpoints quando a fonte de configuração é alterada.
IHostBuilder.ConfigureWebHostDefaults
chama Configure(context.Configuration.GetSection("Kestrel"), reloadOnChange: true)
por padrão para carregar a configuração Kestrel e ativar o recarregamento.
{
"Kestrel": {
"Endpoints": {
"Http": {
"Url": "http://localhost:5000"
},
"Https": {
"Url": "https://localhost:5001"
}
}
}
}
Se a recarga da configuração estiver habilitada e uma alteração for sinalizada, as seguintes etapas serão executadas:
- A nova configuração é comparada com a antiga, e qualquer ponto de extremidade sem alterações de configuração não será modificado.
- Os pontos de extremidade removidos ou modificados recebem 5 segundos para concluir as solicitações de processamento e desligar.
- Endpoints novos ou modificados são iniciados.
Os clientes que se conectam a um ponto de extremidade modificado podem ser desconectados ou recusados enquanto o ponto de extremidade é reiniciado.
Configurar Predefinições HTTPS
ConfigureHttpsDefaults(Action<HttpsConnectionAdapterOptions>) especifica uma configuração Action
a ser executada para cada endpoint HTTPS. Chamar ConfigureHttpsDefaults
várias vezes substitui os Action
anteriores pelo último Action
especificado.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
// certificate is an X509Certificate2
listenOptions.ServerCertificate = certificate;
});
});
Observação
Os pontos de extremidade criados ao chamar Listenantes de chamarConfigureHttpsDefaults não terão os padrões aplicados.
ListenOptions.UseHttps
Configure Kestrel para usar HTTPS.
ListenOptions.UseHttps
extensões:
-
UseHttps
: Configure Kestrel para usar HTTPS com o certificado padrão. Lança uma exceção se nenhum certificado padrão estiver configurado. 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
parâmetros:
-
filename
é o caminho e o nome de arquivo de um arquivo de certificado, relativo ao diretório que contém os arquivos de conteúdo do aplicativo. -
password
é a senha necessária para acessar os dados do certificado X.509. -
configureOptions
é umAction
para configurar oHttpsConnectionAdapterOptions
. Devolve oListenOptions
. -
storeName
é o repositório de certificados de onde carregar o certificado. -
subject
é o nome do assunto do certificado. -
allowInvalid
indica se certificados inválidos devem ser considerados, como certificados autoassinados. -
location
é o local de armazenamento a partir do qual carregar o certificado. -
serverCertificate
é o certificado X.509.
Na produção, o HTTPS deve ser explicitamente configurado. No mínimo, um certificado padrão deve ser fornecido.
Configurações suportadas descritas a seguir:
- Sem configuração
- Substitua o certificado padrão da configuração
- Alterar os padrões no código
Sem configuração
Kestrel escuta http://localhost:5000
e https://localhost:5001
(se um certificado padrão estiver disponível).
Substitua o certificado padrão da configuração
Um esquema de configuração padrão para aplicações HTTPS está disponível para Kestrel. Configure vários pontos de extremidade, incluindo as URLs e os certificados a serem usados, quer a partir de um ficheiro no disco ou de um repositório de certificados.
No exemplo appsettings.json
seguinte:
- Defina
AllowInvalid
comotrue
para permitir o uso de certificados inválidos (por exemplo, certificados autoassinados). - Qualquer ponto de extremidade HTTPS que não especifique um certificado (
HttpsDefaultCert
no exemplo a seguir) retornará ao certificado definido emCertificates:Default
ou ao certificado de desenvolvimento.
{
"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$"
}
}
}
}
Advertência
No exemplo anterior, as senhas de certificado são armazenadas em texto sem formatação em appsettings.json
. O token $CREDENTIAL_PLACEHOLDER$
é usado como um espaço reservado para a senha de cada certificado. Para armazenar senhas de certificado com segurança em ambientes de desenvolvimento, veja Proteção de segredos no desenvolvimento. Para que as senhas de certificado sejam armazenadas com segurança em ambientes de produção, consulte provedor de configuração do Azure Key Vault. Os segredos de desenvolvimento não devem ser usados para produção ou teste.
Notas de esquema:
- Os nomes dos pontos de extremidade não fazem distinção entre maiúsculas e minúsculas. Por exemplo,
HTTPS
eHttps
são equivalentes. - O parâmetro
Url
é necessário para cada ponto de extremidade. O formato para esse parâmetro é o mesmo que o parâmetro de configuração deUrls
de nível superior, exceto que ele é limitado a um único valor. - Esses pontos de extremidade substituem os definidos na configuração superior
Urls
em vez de acrescentá-los. Os pontos de extremidade definidos no código viaListen
são cumulativos com os pontos de extremidade definidos na seção de configuração. - A secção
Certificate
é opcional. Se a seçãoCertificate
não for especificada, os padrões definidos emCertificates:Default
serão usados. Se nenhum padrão estiver disponível, o certificado de desenvolvimento será usado. Se não houver padrões e o certificado de desenvolvimento não estiver presente, o servidor lançará uma exceção e falhará ao iniciar. - A seção
Certificate
oferece suporte a várias fontes de certificado . - Qualquer número de pontos de extremidade pode ser definido em Configuração, desde que não cause conflitos de portas.
Fontes de certificados
Os nós de certificado podem ser configurados para carregar certificados de várias fontes:
-
Path
ePassword
para carregar arquivos .pfx. -
Path
,KeyPath
ePassword
para carregar os arquivos .pem,/.crt, e .key. -
Subject
eStore
para carregar a partir do armazenamento de certificados.
Por exemplo, o certificado Certificates:Default
pode ser especificado como:
"Default": {
"Subject": "<subject; required>",
"Store": "<cert store; required>",
"Location": "<location; defaults to CurrentUser>",
"AllowInvalid": "<true or false; defaults to false>"
}
Carregador de Configuração
options.Configure(context.Configuration.GetSection("{SECTION}"))
retorna um KestrelConfigurationLoader com um método .Endpoint(string name, listenOptions => { })
que pode ser utilizado para complementar as definições de um endpoint configurado:
webBuilder.UseKestrel((context, serverOptions) =>
{
serverOptions.Configure(context.Configuration.GetSection("Kestrel"))
.Endpoint("HTTPS", listenOptions =>
{
listenOptions.HttpsOptions.SslProtocols = SslProtocols.Tls12;
});
});
KestrelServerOptions.ConfigurationLoader
pode ser acessado diretamente para continuar iterando no carregador existente, como o fornecido pelo CreateDefaultBuilder.
- A seção de configuração para cada ponto de extremidade está disponível nas opções no método
Endpoint
para que as configurações personalizadas possam ser lidas. - Podem ser carregadas várias configurações ao chamar
options.Configure(context.Configuration.GetSection("{SECTION}"))
novamente com outra secção. Somente a última configuração é usada, a menos queLoad
seja explicitamente chamada em instâncias anteriores. O metapacote não chamaLoad
para que sua seção de configuração padrão possa ser substituída. -
KestrelConfigurationLoader
espelha a família de APIsListen
doKestrelServerOptions
quandoEndpoint
sobrecarrega, portanto, o código e os endpoints de configuração podem ser configurados no mesmo local. Essas sobrecargas não usam nomes e consomem apenas as configurações padrão da configuração.
Alterar os padrões no código
ConfigureEndpointDefaults
e ConfigureHttpsDefaults
podem ser usados para alterar as configurações padrão para ListenOptions
e HttpsConnectionAdapterOptions
, incluindo a substituição do certificado padrão especificado no cenário anterior.
ConfigureEndpointDefaults
e ConfigureHttpsDefaults
devem ser chamados antes que quaisquer pontos de extremidade sejam definidos.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureEndpointDefaults(listenOptions =>
{
// Configure endpoint defaults
});
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
listenOptions.SslProtocols = SslProtocols.Tls12;
});
});
Configurar endpoints usando a Indicação de Nome de Servidor (Server Name Indication - SNI)
Indicação de Nome de Servidor (SNI) pode ser usada para hospedar vários domínios no mesmo endereço IP e porta. Para que o SNI funcione, o cliente envia o nome do host para a sessão segura para o servidor durante o handshake TLS para que o servidor possa fornecer o certificado correto. O cliente usa o certificado fornecido para comunicação criptografada com o servidor durante a sessão segura que segue o handshake TLS.
O SNI pode ser configurado de duas maneiras:
- Crie um ponto de extremidade no código e selecione um certificado usando o nome do host com a chamada de retorno ServerCertificateSelector.
- Configure um mapeamento entre nomes de host e opções HTTPS no Configuration. Por exemplo, JSON no arquivo
appsettings.json
.
SNI com ServerCertificateSelector
Kestrel suporta SNI através do callback ServerCertificateSelector
. O callback é invocado uma vez por conexão para permitir que a aplicação inspecione o nome do anfitrião e selecione o certificado apropriado. O seguinte código de 'callback' pode ser usado na chamada do método ConfigureWebHostDefaults
do arquivo Program.cs
de um projeto:
// 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 com ServerOptionsSelectionCallback
Kestrel suporta configuração TLS dinâmica adicional através do callback ServerOptionsSelectionCallback
. O retorno de chamada é invocado uma vez por conexão para permitir que o aplicativo inspecione o nome do host e selecione o certificado apropriado e a configuração TLS. Os certificados padrão e o ConfigureHttpsDefaults
não são usados com esta chamada de retorno.
// 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 em configuração
Kestrel suporta SNI definido na configuração. Um endpoint pode ser configurado utilizando um objeto Sni
que contém um mapeamento entre nomes de host e opções HTTPS. O nome do host de conexão corresponde às opções e elas são usadas para essa mesma conexão.
A configuração a seguir adiciona um ponto de extremidade chamado MySniEndpoint
que usa SNI para selecionar opções HTTPS com base no nome do host:
{
"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$"
}
}
}
}
Advertência
No exemplo anterior, as senhas de certificado são armazenadas em texto sem formatação em appsettings.json
. O token $CREDENTIAL_PLACEHOLDER$
é usado como um espaço reservado para a senha de cada certificado. Para armazenar senhas de certificado com segurança em ambientes de desenvolvimento, veja Proteção de segredos no desenvolvimento. Para que as senhas de certificado sejam armazenadas com segurança em ambientes de produção, consulte provedor de configuração do Azure Key Vault. Os segredos de desenvolvimento não devem ser usados para produção ou teste.
Opções HTTPS que podem ser substituídas pelo SNI:
-
Certificate
configura a origem do certificado . -
Protocols
configura os protocolos HTTP permitidos. -
SslProtocols
configura os protocolos permitidos de SSL . -
ClientCertificateMode
configura os requisitos de certificado de cliente .
O nome do host oferece suporte à correspondência por caracteres substitutos:
- Correspondência exata. Por exemplo,
a.example.org
correspondea.example.org
. - Prefixo de substituição. Se houver várias combinações curinga, o padrão mais longo será escolhido. Por exemplo,
*.example.org
corresponde ab.example.org
ec.example.org
. - Curinga completo.
*
corresponde a todo o resto, incluindo clientes que não estão usando SNI e não enviam um nome de host.
A configuração SNI correspondente é aplicada ao ponto final da conexão, substituindo os valores no ponto final. Se uma conexão não corresponder a um nome de host SNI configurado, a conexão será recusada.
Requisitos do SNI
- A executar na estrutura-alvo
netcoreapp2.1
ou posterior. A partir denet461
ou mais tarde, o callback é invocado, mas oname
é semprenull
. Oname
também énull
se o cliente não fornecer o parâmetro de nome do host no handshake TLS. - Todos os sites são executados na mesma instância Kestrel. Kestrel não suporta a partilha de um endereço IP e de uma porta entre múltiplas instâncias sem necessidade de um proxy reverso.
Protocolos SSL/TLS
Os protocolos SSL são protocolos usados para criptografar e descriptografar o tráfego entre dois pares, tradicionalmente um cliente e um servidor.
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$"
}
}
}
}
}
Advertência
No exemplo anterior, a senha do certificado é armazenada em texto sem formatação no appsettings.json
. O token $CREDENTIAL_PLACEHOLDER$
é usado como um espaço reservado para a senha do certificado. Para armazenar senhas de certificado com segurança em ambientes de desenvolvimento, veja Proteção de segredos no desenvolvimento. Para que as senhas de certificado sejam armazenadas com segurança em ambientes de produção, consulte provedor de configuração do Azure Key Vault. Os segredos de desenvolvimento não devem ser usados para produção ou teste.
O valor padrão, SslProtocols.None
, faz com que Kestrel use os padrões do sistema operacional para escolher o melhor protocolo. A menos que você tenha um motivo específico para selecionar um protocolo, use o padrão.
Certificados de Cliente
ClientCertificateMode
configura os requisitos de certificado de cliente .
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$"
}
}
}
}
}
Advertência
No exemplo anterior, a senha do certificado é armazenada em texto sem formatação no appsettings.json
. O token $CREDENTIAL_PLACEHOLDER$
é usado como um espaço reservado para a senha do certificado. Para armazenar senhas de certificado com segurança em ambientes de desenvolvimento, veja Proteção de segredos no desenvolvimento. Para que as senhas de certificado sejam armazenadas com segurança em ambientes de produção, consulte provedor de configuração do Azure Key Vault. Os segredos de desenvolvimento não devem ser usados para produção ou teste.
O valor padrão é ClientCertificateMode.NoCertificate
em que Kestrel não solicitará ou exigirá um certificado do cliente.
Para obter mais informações, consulte Configurar autenticação de certificado no ASP.NET Core.
Registo de conexões
Chame UseConnectionLogging para gerar logs de nível de depuração para comunicação em nível de byte numa conexão. O log de conexão é útil para solucionar problemas em comunicação de baixo nível, como durante a criptografia TLS e atrás de proxies. Se UseConnectionLogging
for colocado antes de UseHttps
, o tráfego criptografado será registado. Se UseConnectionLogging
for colocado após UseHttps
, o tráfego desencriptado é registado. Isto está incorporado no Connection Middleware.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Listen(IPAddress.Any, 8000, listenOptions =>
{
listenOptions.UseConnectionLogging();
});
});
Associar a um socket TCP
O método Listen liga-se a um soquete TCP e um lambda de opções permite a configuração do certificado 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>();
});
O exemplo configura HTTPS para um endpoint com ListenOptions. Use a mesma API para configurar outras definições de Kestrel para pontos de extremidade específicos.
No Windows, certificados autoassinados podem ser criados usando o cmdlet New-SelfSignedCertificate
PowerShell. Para obter um exemplo sem suporte, consulte UpdateIISExpressSSLForChrome.ps1
.
No macOS, Linux e Windows, os certificados podem ser criados usando OpenSSL.
Vincular a um soquete Unix
Utilize um socket Unix com ListenUnixSocket para melhorar o desempenho com o Nginx, como demonstrado neste exemplo:
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.ListenUnixSocket("/tmp/kestrel-test.sock");
serverOptions.ListenUnixSocket("/tmp/kestrel-test.sock",
listenOptions =>
{
listenOptions.UseHttps("testCert.pfx",
"testpassword");
});
})
- No arquivo de configuração do Nginx, defina a entrada
server
>location
>proxy_pass
comohttp://unix:/tmp/{KESTREL SOCKET}:/;
.{KESTREL SOCKET}
é o nome do soquete fornecido ao ListenUnixSocket (por exemplo,kestrel-test.sock
no exemplo anterior). - Certifique-se de que o soquete é gravável por Nginx (por exemplo,
chmod go+w /tmp/kestrel-test.sock
).
Porta 0
Quando o número da porta 0
é especificado, Kestrel se liga dinamicamente a uma porta disponível. O exemplo a seguir mostra como determinar a qual porta Kestrel foi atribuída durante a execução:
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>");
});
}
Quando o aplicativo é executado, a saída da janela do console indica a porta dinâmica onde o aplicativo pode ser alcançado:
Listening on the following addresses: http://127.0.0.1:48508
Limitações
Configurar os endpoints com as seguintes abordagens:
- UseUrls
-
--urls
argumento de linha de comando -
urls
chave de configuração do host -
ASPNETCORE_URLS
variável de ambiente
Esses métodos são úteis para fazer o código funcionar com servidores diferentes Kestrel. No entanto, esteja ciente das seguintes limitações:
- HTTPS não pode ser usado com essas abordagens, a menos que um certificado padrão seja fornecido na configuração do ponto de extremidade HTTPS (por exemplo, usando a configuração
KestrelServerOptions
ou um arquivo de configuração, como mostrado anteriormente). - Quando as abordagens
Listen
eUseUrls
são usadas simultaneamente, os pontos de extremidadeListen
substituem os pontos de extremidadeUseUrls
.
Configuração do terminal do IIS
Ao usar o IIS, as associações de URL para ligações de substituição do IIS são definidas por Listen
ou UseUrls
. Para obter mais informações, consulte ASP.NET módulo principal.
ListenOptions.Protocolos
A propriedade Protocols
estabelece os protocolos HTTP (HttpProtocols
) habilitados num ponto terminal de ligação ou para o servidor. Atribua um valor à propriedade Protocols
a partir do HttpProtocols
enum.
HttpProtocols valor de enum |
Protocolo de conexão permitido |
---|---|
Http1 |
HTTP/1.1 apenas. Pode ser usado com ou sem TLS. |
Http2 |
HTTP/2 apenas. Pode ser usado sem TLS somente se o cliente suportar um modo Conhecimento Prévio. |
Http1AndHttp2 |
HTTP/1.1 e HTTP/2. HTTP/2 requer que o cliente selecione HTTP/2 no TLS Application-Layer Protocol Negotiation (ALPN) handshake; caso contrário, o padrão de conexão é HTTP/1.1. |
O valor ListenOptions.Protocols
padrão para qualquer ponto de extremidade é HttpProtocols.Http1AndHttp2
.
Restrições TLS para HTTP/2:
- TLS versão 1.2 ou posterior
- Renegociação desativada
- Compressão desativada
- Tamanhos mínimos de troca de chaves efêmeras:
- Curva elíptica Diffie-Hellman (ECDHE) [RFC4492]: mínimo de 224 bits
- Diffie-Hellman de campo finito (DHE) [
TLS12
]: mínimo de 2048 bits
- Conjunto de cifras não proibido.
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
[TLS-ECDHE
] com a curva elíptica P-256 [FIPS186
] é suportada por padrão.
O exemplo a seguir permite conexões HTTP/1.1 e HTTP/2 na porta 8000. As conexões são protegidas por TLS com um certificado fornecido:
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Listen(IPAddress.Any, 8000, listenOptions =>
{
listenOptions.UseHttps("testCert.pfx", "testPassword");
});
});
No Linux, CipherSuitesPolicy pode ser usado para filtrar handshakes TLS por conexão:
// using System.Net.Security;
// using Microsoft.AspNetCore.Hosting;
// using Microsoft.AspNetCore.Server.Kestrel.Core;
// using Microsoft.Extensions.DependencyInjection;
// using Microsoft.Extensions.Hosting;
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
listenOptions.OnAuthenticate = (context, sslOptions) =>
{
sslOptions.CipherSuitesPolicy = new CipherSuitesPolicy(
new[]
{
TlsCipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
TlsCipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
// ...
});
};
});
});
Middleware de conexão
O middleware de conexão personalizado pode filtrar handshakes TLS por conexão para cifras específicas, se necessário.
O exemplo a seguir lança NotSupportedException para qualquer algoritmo de codificação que o aplicativo não suporta. Como alternativa, defina e compare ITlsHandshakeFeature.CipherAlgorithm com uma lista de pacotes de codificação aceitáveis.
Nenhuma criptografia é usada com um algoritmo de cifra 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();
});
}
}
}
A filtragem de conexão também pode ser configurada por meio de uma função lambda IConnectionBuilder:
// 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();
});
});
});
Definir o protocolo HTTP a partir da configuração
CreateDefaultBuilder
chama serverOptions.Configure(context.Configuration.GetSection("Kestrel"))
por padrão para carregar a configuração do Kestrel.
O exemplo appsettings.json
a seguir estabelece HTTP/1.1 como o protocolo de conexão padrão para todos os endereços.
{
"Kestrel": {
"EndpointDefaults": {
"Protocols": "Http1"
}
}
}
O exemplo de appsettings.json
a seguir estabelece o protocolo de conexão HTTP/1.1 para um ponto de extremidade específico:
{
"Kestrel": {
"Endpoints": {
"HttpsDefaultCert": {
"Url": "https://localhost:5001",
"Protocols": "Http1"
}
}
}
}
Os protocolos especificados no código substituem os valores definidos pela configuração.
Prefixos de URL
Ao usar UseUrls
, --urls
argumento de linha de comando, urls
chave de configuração do host ou ASPNETCORE_URLS
variável de ambiente, os prefixos de URL podem estar em qualquer um dos seguintes formatos.
Apenas os prefixos de URL HTTP são válidos.
Kestrel não suporta HTTPS ao configurar associações de URL usando UseUrls
.
Endereço IPv4 com número de porta
http://65.55.39.10:80/
0.0.0.0
é um caso especial que se liga a todos os endereços IPv4.Endereço IPv6 com número de porta
http://[0:0:0:0:0:ffff:4137:270a]:80/
[::]
é o equivalente IPv6 do IPv40.0.0.0
.Nome do host com número da porta
http://contoso.com:80/ http://*:80/
Os nomes dos anfitriões,
*
e+
não são especiais. Qualquer elemento que não seja reconhecido como um endereço IP válido oulocalhost
será associado a todos os IPs IPv4 e IPv6. Para vincular nomes de host diferentes a aplicativos ASP.NET Core diferentes na mesma porta, use HTTP.sys ou um servidor proxy reverso. Exemplos de servidor proxy reverso incluem IIS, Nginx ou Apache.Advertência
A hospedagem numa configuração de proxy reverso requer filtros de anfitrião.
Nome do host
localhost
com número de porta ou IP de loopback com número de portahttp://localhost:5000/ http://127.0.0.1:5000/ http://[::1]:5000/
Quando
localhost
é especificado, Kestrel tenta ligar-se às interfaces de loopback do IPv4 e do IPv6. Se a porta solicitada estiver em uso por outro serviço em qualquer interface de loopback, Kestrel falha ao iniciar. Se qualquer interface de loopback estiver indisponível por qualquer outro motivo (mais comumente porque o IPv6 não é suportado), Kestrel registrará um aviso.