Принудительное применение HTTPS в ASP.NET CoreEnforce HTTPS in ASP.NET Core

Автор: Рик Андерсон (Rick Anderson)By Rick Anderson

В этом документе показано, как:This document shows how to:

  • Требовать протокол HTTPS для всех запросов.Require HTTPS for all requests.
  • Перенаправляет все запросы HTTP на HTTPS.Redirect all HTTP requests to HTTPS.

Ни один API не может предотвратить отправку конфиденциальных данных клиентом при первом запросе.No API can prevent a client from sending sensitive data on the first request.

Предупреждение

Проекты APIAPI projects

Не используйте Рекуирехттпсаттрибуте в веб-API, которые получают конфиденциальную информацию.Do not use RequireHttpsAttribute on Web APIs that receive sensitive information. RequireHttpsAttribute использует коды состояния HTTP для перенаправления браузеров из HTTP в HTTPS.RequireHttpsAttribute uses HTTP status codes to redirect browsers from HTTP to HTTPS. Клиенты API могут не распознать или соблюдать перенаправления от HTTP к HTTPS.API clients may not understand or obey redirects from HTTP to HTTPS. Такие клиенты могут передавать данные по протоколу HTTP.Such clients may send information over HTTP. Веб-API должны быть:Web APIs should either:

  • Не прослушивать по протоколу HTTP.Not listen on HTTP.
  • Закройте подключение с кодом состояния 400 (недопустимый запрос) и не обслуживает запрос.Close the connection with status code 400 (Bad Request) and not serve the request.

Проекты HSTS и APIHSTS and API projects

Проекты API по умолчанию не включают HSTS , так как HSTS обычно является инструкцией только браузера.The default API projects don't include HSTS because HSTS is generally a browser only instruction. Другие вызывающие объекты, такие как приложения для телефонов или настольных систем, не подчиняются инструкции.Other callers, such as phone or desktop apps, do not obey the instruction. Даже в обозревателях, один вызов API через HTTP, прошедший проверку подлинности, имеет риски в незащищенных сетях.Even within browsers, a single authenticated call to an API over HTTP has risks on insecure networks. Безопасный подход заключается в настройке проектов API для прослушивания и реагирования по протоколу HTTPS.The secure approach is to configure API projects to only listen to and respond over HTTPS.

Предупреждение

Проекты APIAPI projects

Не используйте Рекуирехттпсаттрибуте в веб-API, которые получают конфиденциальную информацию.Do not use RequireHttpsAttribute on Web APIs that receive sensitive information. RequireHttpsAttribute использует коды состояния HTTP для перенаправления браузеров из HTTP в HTTPS.RequireHttpsAttribute uses HTTP status codes to redirect browsers from HTTP to HTTPS. Клиенты API могут не распознать или соблюдать перенаправления от HTTP к HTTPS.API clients may not understand or obey redirects from HTTP to HTTPS. Такие клиенты могут передавать данные по протоколу HTTP.Such clients may send information over HTTP. Веб-API должны быть:Web APIs should either:

  • Не прослушивать по протоколу HTTP.Not listen on HTTP.
  • Закройте подключение с кодом состояния 400 (недопустимый запрос) и не обслуживает запрос.Close the connection with status code 400 (Bad Request) and not serve the request.

Требование к использованию протокола HTTPSRequire HTTPS

В рабочей ASP.NET Core веб-приложений рекомендуется использовать:We recommend that production ASP.NET Core web apps use:

  • По промежуточного слоя перенаправления HTTPS (UseHttpsRedirection) для перенаправления HTTP-запросов на HTTPS.HTTPS Redirection Middleware (UseHttpsRedirection) to redirect HTTP requests to HTTPS.
  • HSTS по промежуточного слоя (усехстс) для отправки клиентам заголовков протокола безопасности транспорта HTTP (HSTS).HSTS Middleware (UseHsts) to send HTTP Strict Transport Security Protocol (HSTS) headers to clients.

Примечание

Приложения, развернутые в конфигурации обратных прокси-серверов, позволяют прокси-серверу управлять безопасностью подключения (HTTPS).Apps deployed in a reverse proxy configuration allow the proxy to handle connection security (HTTPS). Если прокси-сервер также обрабатывает перенаправление HTTPS, нет необходимости использовать по промежуточного слоя перенаправления HTTPS.If the proxy also handles HTTPS redirection, there's no need to use HTTPS Redirection Middleware. Если прокси-сервер также обрабатывает запись заголовков HSTS (например, поддержка собственного HSTS в IIS 10,0 (1709) или более поздней версии), по промежуточного слоя HSTS не требуется для приложения.If the proxy server also handles writing HSTS headers (for example, native HSTS support in IIS 10.0 (1709) or later), HSTS Middleware isn't required by the app. Дополнительные сведения см. в разделе отказ от HTTPS/HSTS при создании проекта.For more information, see Opt-out of HTTPS/HSTS on project creation.

усехттпсредиректионUseHttpsRedirection

Следующий код вызывает UseHttpsRedirection в классе Startup:The following code calls UseHttpsRedirection in the Startup class:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();

    app.UseMvc();
}

Предыдущий выделенный код:The preceding highlighted code:

Рекомендуется использовать временные перенаправления, а не постоянные перенаправления.We recommend using temporary redirects rather than permanent redirects. Кэширование ссылок может привести к нестабильной работе в средах разработки.Link caching can cause unstable behavior in development environments. Если вы предпочитаете отправить код состояния с постоянным перенаправлением, когда приложение находится в среде, не являющейся средой разработки, см. раздел Настройка постоянных перенаправлений в производстве .If you prefer to send a permanent redirect status code when the app is in a non-Development environment, see the Configure permanent redirects in production section. Мы рекомендуем использовать HSTS для передачи клиентам, что только защищенные запросы ресурсов должны отправляться в приложение (только в рабочей среде).We recommend using HSTS to signal to clients that only secure resource requests should be sent to the app (only in production).

Настройка портаPort configuration

Порт должен быть доступен для промежуточного слоя, чтобы перенаправить незащищенный запрос на HTTPS.A port must be available for the middleware to redirect an insecure request to HTTPS. Если порт недоступен:If no port is available:

  • Перенаправление на HTTPS не выполняется.Redirection to HTTPS doesn't occur.
  • По промежуточного слоя регистрируется предупреждение "не удалось определить HTTPS порт для перенаправления".The middleware logs the warning "Failed to determine the https port for redirect."

Укажите HTTPS порт, используя любой из следующих подходов:Specify the HTTPS port using any of the following approaches:

  • Задайте параметр узлаhttps_port:Set the https_port host setting:

    • В конфигурации узла.In host configuration.

    • Путем установки переменной среды ASPNETCORE_HTTPS_PORT.By setting the ASPNETCORE_HTTPS_PORT environment variable.

    • Путем добавления записи верхнего уровня в appSettings. JSON:By adding a top-level entry in appsettings.json:

      {
          "https_port": 443,
          "Logging": {
              "LogLevel": {
                  "Default": "Information",
                  "Microsoft": "Warning",
                  "Microsoft.Hosting.Lifetime": "Information"
              }
          },
          "AllowedHosts": "*"
      }
      
  • Укажите порт с защитой схемы с помощью переменной среды ASPNETCORE_URLS.Indicate a port with the secure scheme using the ASPNETCORE_URLS environment variable. Переменная среды настраивает сервер.The environment variable configures the server. По промежуточного слоя косвенно обнаруживает HTTPS-порт через @no__t – 0.The middleware indirectly discovers the HTTPS port via IServerAddressesFeature. Этот подход не работает в обратных развертываниях прокси-сервера.This approach doesn't work in reverse proxy deployments.

  • Задайте параметр узлаhttps_port:Set the https_port host setting:

    • В конфигурации узла.In host configuration.

    • Путем установки переменной среды ASPNETCORE_HTTPS_PORT.By setting the ASPNETCORE_HTTPS_PORT environment variable.

    • Путем добавления записи верхнего уровня в appSettings. JSON:By adding a top-level entry in appsettings.json:

      {
          "https_port": 443,
          "Logging": {
              "LogLevel": {
                  "Default": "Warning"
              }
          },
          "AllowedHosts": "*"
      }
      
  • Укажите порт с защитой схемы с помощью переменной среды ASPNETCORE_URLS.Indicate a port with the secure scheme using the ASPNETCORE_URLS environment variable. Переменная среды настраивает сервер.The environment variable configures the server. По промежуточного слоя косвенно обнаруживает HTTPS-порт через @no__t – 0.The middleware indirectly discovers the HTTPS port via IServerAddressesFeature. Этот подход не работает в обратных развертываниях прокси-сервера.This approach doesn't work in reverse proxy deployments.

  • В среде разработки задайте URL-адрес HTTPS в launchsettings. JSON.In development, set an HTTPS URL in launchsettings.json. При использовании IIS Express включите протокол HTTPS.Enable HTTPS when IIS Express is used.

  • Настройте конечную точку HTTPS URL-адреса для общедоступного пограничной развертывания сервера Kestrel или http. sys .Configure an HTTPS URL endpoint for a public-facing edge deployment of Kestrel server or HTTP.sys server. Приложение использует только один HTTPS-порт .Only one HTTPS port is used by the app. По промежуточного слоя обнаруживает порт с помощью IServerAddressesFeature.The middleware discovers the port via IServerAddressesFeature.

Примечание

Когда приложение запускается в конфигурации обратного прокси-сервера, IServerAddressesFeature недоступно.When an app is run in a reverse proxy configuration, IServerAddressesFeature isn't available. Задайте порт с помощью одного из других подходов, описанных в этом разделе.Set the port using one of the other approaches described in this section.

Развертывания пограничных устройствEdge deployments

Если Kestrel или HTTP. sys используется в качестве общедоступного пограничной сервера, то Kestrel или HTTP. sys должны быть настроены на прослушивание обоих типов:When Kestrel or HTTP.sys is used as a public-facing edge server, Kestrel or HTTP.sys must be configured to listen on both:

  • Безопасный порт, на который перенаправляется клиент (как правило, 443 в рабочей среде и 5001 в разработке).The secure port where the client is redirected (typically, 443 in production and 5001 in development).
  • Небезопасный порт (как правило, 80 в рабочей среде и 5000 в разработке).The insecure port (typically, 80 in production and 5000 in development).

Клиент должен получить доступ к незащищенному порту, чтобы приложение получило незащищенный запрос и перенаправлять клиент на безопасный порт.The insecure port must be accessible by the client in order for the app to receive an insecure request and redirect the client to the secure port.

Дополнительные сведения см. в разделе Kestrel Endpoint Configuration или Реализация веб-сервера HTTP.sys в ASP.NET Core.For more information, see Kestrel endpoint configuration or Реализация веб-сервера HTTP.sys в ASP.NET Core.

Сценарии развертыванияDeployment scenarios

Все брандмауэры между клиентом и сервером также должны иметь открытые порты связи для трафика.Any firewall between the client and server must also have communication ports open for traffic.

Если запросы перенаправляются в конфигурации обратных прокси-серверов, используйте промежуточный слой перенаправленных заголовков перед вызовом по промежуточного слоя перенаправления HTTPS.If requests are forwarded in a reverse proxy configuration, use Forwarded Headers Middleware before calling HTTPS Redirection Middleware. По промежуточного слоя перенаправленных заголовков обновляет Request.Scheme, используя заголовок X-Forwarded-Proto.Forwarded Headers Middleware updates the Request.Scheme, using the X-Forwarded-Proto header. По промежуточного слоя позволяет правильно работать с URI перенаправления и другими политиками безопасности.The middleware permits redirect URIs and other security policies to work correctly. Если по промежуточного слоя перенаправленных заголовков не используется, серверное приложение может не получить правильную схему и завершить цикл перенаправления.When Forwarded Headers Middleware isn't used, the backend app might not receive the correct scheme and end up in a redirect loop. Обычное сообщение об ошибке конечного пользователя состоит в том, что произошло слишком много перенаправлений.A common end user error message is that too many redirects have occurred.

При развертывании в службе приложений Azure следуйте указаниям в Tutorial: Привязывание существующего настраиваемого SSL-сертификата к веб-приложениям Azure.When deploying to Azure App Service, follow the guidance in Tutorial: Bind an existing custom SSL certificate to Azure Web Apps.

ПараметрыOptions

Следующий выделенный код вызывает аддхттпсредиректион для настройки параметров промежуточного слоя:The following highlighted code calls AddHttpsRedirection to configure middleware options:

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();

    services.AddHsts(options =>
    {
        options.Preload = true;
        options.IncludeSubDomains = true;
        options.MaxAge = TimeSpan.FromDays(60);
        options.ExcludedHosts.Add("example.com");
        options.ExcludedHosts.Add("www.example.com");
    });

    services.AddHttpsRedirection(options =>
    {
        options.RedirectStatusCode = StatusCodes.Status307TemporaryRedirect;
        options.HttpsPort = 5001;
    });
}
public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

    services.AddHsts(options =>
    {
        options.Preload = true;
        options.IncludeSubDomains = true;
        options.MaxAge = TimeSpan.FromDays(60);
        options.ExcludedHosts.Add("example.com");
        options.ExcludedHosts.Add("www.example.com");
    });

    services.AddHttpsRedirection(options =>
    {
        options.RedirectStatusCode = StatusCodes.Status307TemporaryRedirect;
        options.HttpsPort = 5001;
    });
}

Вызов AddHttpsRedirection требуется только для изменения значений HttpsPort или RedirectStatusCode.Calling AddHttpsRedirection is only necessary to change the values of HttpsPort or RedirectStatusCode.

Предыдущий выделенный код:The preceding highlighted code:

Настройка постоянных перенаправлений в рабочей средеConfigure permanent redirects in production

По промежуточного слоя по умолчанию отправляется Status307TemporaryRedirect со всеми перенаправлениями.The middleware defaults to sending a Status307TemporaryRedirect with all redirects. Если вы предпочитаете отправить код состояния с постоянным перенаправлением, когда приложение находится в среде, не являющейся средой разработки, заключите конфигурацию параметров по промежуточного слоя в условную проверку для среды без разработки.If you prefer to send a permanent redirect status code when the app is in a non-Development environment, wrap the middleware options configuration in a conditional check for a non-Development environment.

При настройке служб в Startup.CS:When configuring services in Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    // IWebHostEnvironment (stored in _env) is injected into the Startup class.
    if (!_env.IsDevelopment())
    {
        services.AddHttpsRedirection(options =>
        {
            options.RedirectStatusCode = StatusCodes.Status308PermanentRedirect;
            options.HttpsPort = 443;
        });
    }
}

При настройке служб в Startup.CS:When configuring services in Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    // IHostingEnvironment (stored in _env) is injected into the Startup class.
    if (!_env.IsDevelopment())
    {
        services.AddHttpsRedirection(options =>
        {
            options.RedirectStatusCode = StatusCodes.Status308PermanentRedirect;
            options.HttpsPort = 443;
        });
    }
}

Альтернативный подход по промежуточного слоя перенаправления HTTPSHTTPS Redirection Middleware alternative approach

Альтернативой по промежуточного слоя перенаправления HTTPS (UseHttpsRedirection) является использование по промежуточного слоя переписывания URL-адресов (AddRedirectToHttps).An alternative to using HTTPS Redirection Middleware (UseHttpsRedirection) is to use URL Rewriting Middleware (AddRedirectToHttps). AddRedirectToHttps может также задавать код состояния и порт при выполнении перенаправления.AddRedirectToHttps can also set the status code and port when the redirect is executed. Дополнительные сведения см. в разделе по промежуточного слоя перезаписи URL-адресов.For more information, see URL Rewriting Middleware.

При перенаправлении по протоколу HTTPS без требования дополнительных правил перенаправления рекомендуется использовать по промежуточного слоя перенаправления HTTPS (UseHttpsRedirection), описанные в этом разделе.When redirecting to HTTPS without the requirement for additional redirect rules, we recommend using HTTPS Redirection Middleware (UseHttpsRedirection) described in this topic.

Протокол HTTPS протокола безопасности транспорта HTTP (HSTS)HTTP Strict Transport Security Protocol (HSTS)

В OWASP, обеспечение безопасности транспорта по протоколу HTTP (HSTS) является расширением безопасности, которое определяется веб-приложением с помощью заголовка ответа.Per OWASP, HTTP Strict Transport Security (HSTS) is an opt-in security enhancement that's specified by a web app through the use of a response header. Когда браузер, поддерживающий HSTS, получает этот заголовок:When a browser that supports HSTS receives this header:

  • В браузере хранится конфигурация домена, которая предотвращает отправку обмена данными по протоколу HTTP.The browser stores configuration for the domain that prevents sending any communication over HTTP. Браузер принудительно выполняет все связи по протоколу HTTPS.The browser forces all communication over HTTPS.
  • Браузер не разрешает пользователю использовать недоверенные или недопустимые сертификаты.The browser prevents the user from using untrusted or invalid certificates. Браузер отключает запросы, позволяющие пользователю временно доверять такому сертификату.The browser disables prompts that allow a user to temporarily trust such a certificate.

Так как HSTS обеспечивается клиентом, он имеет некоторые ограничения:Because HSTS is enforced by the client it has some limitations:

  • Клиент должен поддерживать HSTS.The client must support HSTS.
  • HSTS требует по крайней мере одного успешного запроса HTTPS для установки политики HSTS.HSTS requires at least one successful HTTPS request to establish the HSTS policy.
  • Приложение должно проверять каждый HTTP-запрос и перенаправлять или отклонять HTTP-запрос.The application must check every HTTP request and redirect or reject the HTTP request.

ASP.NET Core 2,1 и более поздних версий реализуют HSTS с методом расширения UseHsts.ASP.NET Core 2.1 and later implements HSTS with the UseHsts extension method. Следующий код вызывает UseHsts, если приложение не находится в режиме разработки:The following code calls UseHsts when the app isn't in development mode:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();

    app.UseMvc();
}

UseHsts не рекомендуется в разработке, так как параметры HSTS очень кэшируются браузерами.UseHsts isn't recommended in development because the HSTS settings are highly cacheable by browsers. По умолчанию UseHsts исключает локальный петлевой адрес.By default, UseHsts excludes the local loopback address.

Для рабочих сред, которые реализуют HTTPS в первый раз, задайте для начального значения хстсоптионс. MaxAge небольшое значение, используя один из методов TimeSpan.For production environments that are implementing HTTPS for the first time, set the initial HstsOptions.MaxAge to a small value using one of the TimeSpan methods. Задайте в качестве значения в часах не более одного дня на случай, если необходимо вернуть инфраструктуру HTTPS к протоколу HTTP.Set the value from hours to no more than a single day in case you need to revert the HTTPS infrastructure to HTTP. Убедившись в устойчивости конфигурации HTTPS, увеличьте значение HSTS max-age. часто используемое значение — один год.After you're confident in the sustainability of the HTTPS configuration, increase the HSTS max-age value; a commonly used value is one year.

В приведенном ниже кодеThe following code:

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();

    services.AddHsts(options =>
    {
        options.Preload = true;
        options.IncludeSubDomains = true;
        options.MaxAge = TimeSpan.FromDays(60);
        options.ExcludedHosts.Add("example.com");
        options.ExcludedHosts.Add("www.example.com");
    });

    services.AddHttpsRedirection(options =>
    {
        options.RedirectStatusCode = StatusCodes.Status307TemporaryRedirect;
        options.HttpsPort = 5001;
    });
}
public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

    services.AddHsts(options =>
    {
        options.Preload = true;
        options.IncludeSubDomains = true;
        options.MaxAge = TimeSpan.FromDays(60);
        options.ExcludedHosts.Add("example.com");
        options.ExcludedHosts.Add("www.example.com");
    });

    services.AddHttpsRedirection(options =>
    {
        options.RedirectStatusCode = StatusCodes.Status307TemporaryRedirect;
        options.HttpsPort = 5001;
    });
}
  • Задает параметр предварительной загрузки для заголовка с уровнем безопасности "Долгосрочный транспорт — Безопасность".Sets the preload parameter of the Strict-Transport-Security header. Предварительная загрузка не является частью спецификации RFC HSTS, но поддерживается веб-браузерами для предварительной загрузки HSTS сайтов при новой установке.Preload isn't part of the RFC HSTS specification, but is supported by web browsers to preload HSTS sites on fresh install. Дополнительные сведения см. в разделе https://hstspreload.org/.See https://hstspreload.org/ for more information.
  • Включает инклудесубдомаин, который применяет политику HSTS для размещения поддоменов.Enables includeSubDomain, which applies the HSTS policy to Host subdomains.
  • Явно задает параметр max-age для заголовка с ограничением транспорта-безопасности до 60 дней.Explicitly sets the max-age parameter of the Strict-Transport-Security header to 60 days. Если значение не задано, по умолчанию используется значение 30 дней.If not set, defaults to 30 days. Дополнительные сведения см. в директиве max-age .See the max-age directive for more information.
  • Добавляет example.com в список узлов для исключения.Adds example.com to the list of hosts to exclude.

UseHsts исключает следующие узлы замыкания на себя:UseHsts excludes the following loopback hosts:

  • localhost : Адрес замыкания на себя IPv4.localhost : The IPv4 loopback address.
  • 127.0.0.1 : Адрес замыкания на себя IPv4.127.0.0.1 : The IPv4 loopback address.
  • [::1] : IPv6-адрес замыкания на себя.[::1] : The IPv6 loopback address.

Отказ от HTTPS/HSTS при создании проектаOpt-out of HTTPS/HSTS on project creation

В некоторых сценариях серверной службы, где безопасность подключения обрабатывается на общедоступной границе сети, Настройка безопасности подключения на каждом узле не требуется.In some backend service scenarios where connection security is handled at the public-facing edge of the network, configuring connection security at each node isn't required. Веб-приложения, созданные на основе шаблонов в Visual Studio или команды DotNet New , включают Перенаправление HTTPS и HSTS.Web apps that are generated from the templates in Visual Studio or from the dotnet new command enable HTTPS redirection and HSTS. Для развертываний, которые не нуждаются в этих сценариях, можно отказаться от HTTPS/HSTS при создании приложения из шаблона.For deployments that don't require these scenarios, you can opt-out of HTTPS/HSTS when the app is created from the template.

Чтобы отказаться от HTTPS/HSTS:To opt-out of HTTPS/HSTS:

Снимите флажок настроить для HTTPS .Uncheck the Configure for HTTPS check box.

Диалоговое окно нового ASP.NET Core веб-приложения с снятым флажком настроить для HTTPS.

Диалоговое окно нового ASP.NET Core веб-приложения с снятым флажком настроить для HTTPS.

Доверять сертификату разработки ASP.NET Core HTTPS в Windows и macOSTrust the ASP.NET Core HTTPS development certificate on Windows and macOS

Пакет SDK для .NET Core включает сертификат разработки HTTPS.The .NET Core SDK includes an HTTPS development certificate. Сертификат устанавливается в рамках первого запуска.The certificate is installed as part of the first-run experience. Например, dotnet --info возвращает результат, аналогичный приведенному ниже:For example, dotnet --info produces output similar to the following:

ASP.NET Core
------------
Successfully installed the ASP.NET Core HTTPS Development Certificate.
To trust the certificate run 'dotnet dev-certs https --trust' (Windows and macOS only).
For establishing trust on other platforms refer to the platform specific documentation.
For more information on configuring HTTPS see https://go.microsoft.com/fwlink/?linkid=848054.

При установке пакета SDK для .NET Core в локальное хранилище сертификатов пользователя устанавливается сертификат разработки HTTPS ASP.NET Core.Installing the .NET Core SDK installs the ASP.NET Core HTTPS development certificate to the local user certificate store. Сертификат установлен, но не является доверенным.The certificate has been installed, but it's not trusted. Чтобы сделать сертификат доверенным, выполните однократный шаг для запуска средства DotNet dev-certs:To trust the certificate perform the one-time step to run the dotnet dev-certs tool:

dotnet dev-certs https --trust

Следующая команда вызывает справку по средству dev-certs.The following command provides help on the dev-certs tool:

dotnet dev-certs https --help

Как настроить сертификат разработчика для DOCKERHow to set up a developer certificate for Docker

Также см. эту проблему в GitHub.See this GitHub issue.

Доверенный HTTPS сертификат из подсистемы Windows для LinuxTrust HTTPS certificate from Windows Subsystem for Linux

Подсистема Windows для Linux (WSL) создает самозаверяющий сертификат HTTPS. Чтобы настроить хранилище сертификатов Windows для доверия к сертификату WSL, сделайте следующее:The Windows Subsystem for Linux (WSL) generates a HTTPS self-signed cert. To configure the Windows certificate store to trust the WSL certificate:

  • Выполните следующую команду, чтобы экспортировать созданный сертификат WSL: dotnet dev-certs https -ep %USERPROFILE%\.aspnet\https\aspnetapp.pfx -p <cryptic-password>Run the following command to export the WSL generated certificate: dotnet dev-certs https -ep %USERPROFILE%\.aspnet\https\aspnetapp.pfx -p <cryptic-password>

  • В окне WSL выполните следующую команду: ASPNETCORE_Kestrel__Certificates__Default__Password="<cryptic-password>" ASPNETCORE_Kestrel__Certificates__Default__Path=/mnt/c/Users/user-name/.aspnet/https/aspnetapp.pfx dotnet watch run.In a WSL window, run the following command: ASPNETCORE_Kestrel__Certificates__Default__Password="<cryptic-password>" ASPNETCORE_Kestrel__Certificates__Default__Path=/mnt/c/Users/user-name/.aspnet/https/aspnetapp.pfx dotnet watch run

    Приведенная выше команда задает переменные среды, чтобы в Linux использовался доверенный сертификат Windows.The preceding command sets the environment variables so Linux uses the Windows trusted certificate.

Устранение неполадок с сертификатамиTroubleshoot certificate problems

В этом разделе содержатся сведения о том, когда сертификат разработки ASP.NET Core HTTPS установлен и является доверенным, но по-прежнему имеются предупреждения браузера о том, что сертификат не является доверенным.This section provides help when the ASP.NET Core HTTPS development certificate has been installed and trusted, but you still have browser warnings that the certificate is not trusted.

Все платформы — сертификат не является довереннымAll platforms - certificate not trusted

Выполните следующие команды:Run the following commands:

dotnet dev-certs https --clean
dotnet dev-certs https --trust

Закройте все открытые экземпляры браузера.Close any browser instances open. Откройте новое окно браузера для приложения.Open a new browser window to app. Доверие сертификатов кэшируется браузерами.Certificate trust is cached by browsers.

Предыдущие команды решают большинство проблем с доверием к браузеру.The preceding commands solve most browser trust issues. Если браузер все еще не доверяет сертификату, следуйте приведенным ниже рекомендациям для платформы.If the browser is still not trusting the certificate, follow the platform specific suggestions that follow.

DOCKER — сертификат не является довереннымDocker - certificate not trusted

  • Удалите папку C:\Users @ no__t-1USER} \аппдата\роаминг\асп.нет\хттпс .Delete the C:\Users{USER}\AppData\Roaming\ASP.NET\Https folder.
  • Очистите решение.Clean the solution. Удалите папки bin и obj.Delete the bin and obj folders.
  • Перезапустите средство разработки.Restart the development tool. Например, Visual Studio, Visual Studio Code или Visual Studio для Mac.For example, Visual Studio, Visual Studio Code, or Visual Studio for Mac.

Windows — сертификат не является довереннымWindows - certificate not trusted

  • Проверьте сертификаты в хранилище сертификатов.Check the certificates in the certificate store. Должен существовать сертификат localhost с понятным именем ASP.NET Core HTTPS development certificate в разделе Current User > Personal > Certificates и Current User > Trusted root certification authorities > Certificates.There should be a localhost certificate with the ASP.NET Core HTTPS development certificate friendly name both under Current User > Personal > Certificates and Current User > Trusted root certification authorities > Certificates
  • Удалите все найденные сертификаты из личных и доверенных корневых центров сертификации.Remove all the found certificates from both Personal and Trusted root certification authorities. Не удаляйте сертификат IIS Express localhost.Do not remove the IIS Express localhost certificate.
  • Выполните следующие команды:Run the following commands:
dotnet dev-certs https --clean
dotnet dev-certs https --trust

Закройте все открытые экземпляры браузера.Close any browser instances open. Откройте новое окно браузера для приложения.Open a new browser window to app.

OS X — сертификат не является довереннымOS X - certificate not trusted

  • Откройте доступ к цепочке ключей.Open KeyChain Access.
  • Выберите цепочку ключей системы.Select the System keychain.
  • Проверьте наличие сертификата localhost.Check for the presence of a localhost certificate.
  • Убедитесь, что он содержит символ + на значке, чтобы указать, что он является доверенным для всех пользователей.Check that it contains a + symbol on the icon to indicate its trusted for all users.
  • Удалите сертификат из цепочки ключей системы.Remove the certificate from the system keychain.
  • Выполните следующие команды:Run the following commands:
dotnet dev-certs https --clean
dotnet dev-certs https --trust

Закройте все открытые экземпляры браузера.Close any browser instances open. Откройте новое окно браузера для приложения.Open a new browser window to app.

Дополнительные сведенияAdditional information