Partilhar via


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étodo UseHttps.

Os endpoints podem ser configurados usando URLs, JSON em appsettings.jsone 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 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 IPv4 0.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 porta

    http://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 fonte IConfiguration 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 chama Load para que sua seção de configuração padrão possa ser substituída.
  • KestrelConfigurationLoader espelha a família Listen de APIs do KestrelServerOptions à medida que Endpoint 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:

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 como http://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:

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:

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 e Https 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 de Urls 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 via Listen são cumulativos com os pontos de extremidade definidos na seção de configuração.
  • A secção Certificate é opcional. Se a seção Certificate não for especificada, os padrões definidos em Certificates: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 e Password para carregar arquivos .pfx.
  • Path, KeyPath e Password para carregar os arquivos .pem,/.crt, e .key.
  • Subject e Store 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 é um Action para configurar o HttpsConnectionAdapterOptions. Devolve o ListenOptions.
  • 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 corresponde a.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 a b.example.org e c.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();

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:

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 Actionanteriores 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 Actionanteriores 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 Action para configurar o HttpsConnectionAdapterOptions. Devolve o ListenOptions.
  • 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 como true 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 em Certificates: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 e Https 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 de Urls 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 via Listen são cumulativos com os pontos de extremidade definidos na seção de configuração.
  • A secção Certificate é opcional. Se a seção Certificate não for especificada, os padrões definidos em Certificates: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 e Password para carregar arquivos .pfx.
  • Path, KeyPath e Password para carregar os arquivos .pem,/.crt, e .key.
  • Subject e Store 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 chama Load de modo que a sua secção de configuração padrão possa ser substituída.
  • KestrelConfigurationLoader espelha a família de APIs Listen do KestrelServerOptions quando Endpoint 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 corresponde a.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 a b.example.org e c.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 como http://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 e UseUrls são usadas simultaneamente, os pontos de extremidade Listen substituem os pontos de extremidade UseUrls.

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 IPv4 0.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 ou localhost 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 porta

    http://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 Actionanteriores 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 antes de chamar não terão os padrões aplicados.

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 Actionanteriores 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 o HttpsConnectionAdapterOptions. Devolve o ListenOptions.
  • 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 como true 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 em Certificates: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 e Https 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 de Urls 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 via Listen são cumulativos com os pontos de extremidade definidos na seção de configuração.
  • A secção Certificate é opcional. Se a seção Certificate não for especificada, os padrões definidos em Certificates: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 e Password para carregar arquivos .pfx.
  • Path, KeyPath e Password para carregar os arquivos .pem,/.crt, e .key.
  • Subject e Store 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 chama Load para que sua seção de configuração padrão possa ser substituída.
  • KestrelConfigurationLoader espelha a família de APIs Listen do KestrelServerOptions quando Endpoint 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 corresponde a.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 a b.example.org e c.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 como http://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 e UseUrls são usadas simultaneamente, os pontos de extremidade Listen substituem os pontos de extremidade UseUrls.

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 IPv4 0.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 ou localhost 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 porta

    http://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:

  • Quando o .NET SDK é instalado.
  • A ferramenta dev-certs é usada para criar um 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 Actionanteriores 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 Actionanteriores 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 é um Action para configurar o HttpsConnectionAdapterOptions. Devolve o ListenOptions.
  • 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 como true 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 em Certificates: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 e Https 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 de Urls 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 via Listen são cumulativos com os pontos de extremidade definidos na seção de configuração.
  • A secção Certificate é opcional. Se a seção Certificate não for especificada, os padrões definidos em Certificates: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 e Password para carregar arquivos .pfx.
  • Path, KeyPath e Password para carregar os arquivos .pem,/.crt, e .key.
  • Subject e Store 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 que Load seja explicitamente chamada em instâncias anteriores. O metapacote não chama Load para que sua seção de configuração padrão possa ser substituída.
  • KestrelConfigurationLoader espelha a família de APIs Listen do KestrelServerOptions quando Endpoint 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 corresponde a.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 a b.example.org e c.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 de net461 ou mais tarde, o callback é invocado, mas o name é sempre null. O name 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 como http://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 e UseUrls são usadas simultaneamente, os pontos de extremidade Listen substituem os pontos de extremidade UseUrls.

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 IPv4 0.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 ou localhost 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 porta

    http://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.