Бөлісу құралы:


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

Дэвид Гальван и Рик Андерсон

В этой статье показано, как:

  • Требовать HTTPS для всех запросов.
  • Перенаправляет все запросы HTTP на HTTPS.

Ни один API не может запретить клиенту отправлять конфиденциальные данные в первом запросе.

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

Проекты API

Не используйтеRequireHttpsAttribute, которые получают конфиденциальную информацию. RequireHttpsAttribute использует коды состояния HTTP для перенаправления браузеров из HTTP в HTTPS. Клиенты API могут не понимать или подчиняться перенаправлениям из HTTP в HTTPS. Такие клиенты могут отправлять данные по протоколу HTTP. Веб-API должны иметь следующее:

  • Не прослушивать HTTP.
  • Закройте подключение с кодом состояния 400 (недопустимый запрос) и не обслуживайте запрос.

Чтобы отключить перенаправление HTTP в API, задайте ASPNETCORE_URLS переменную среды или используйте флаг командной --urls строки. Дополнительные сведения см. в разделе "Использование нескольких сред" в ASP.NET Core и 8 способов задания URL-адресов для приложения ASP.NET Core от Эндрю Lock.

Проекты HSTS и API

Проекты API по умолчанию не включают HSTS, так как HSTS обычно является инструкцией только для браузера. Другие вызывающие программы, такие как приложения для телефонов или настольных компьютеров, не следуют инструкции. Даже в браузерах один прошедший проверку подлинности вызов API через HTTP имеет риски в небезопасных сетях. Безопасный подход заключается в настройке проектов API только для прослушивания и реагирования по протоколу HTTPS.

Перенаправление HTTP на HTTPS вызывает ошибку ERR_INVALID_REDIRECT в предварительном запросе CORS.

Запросы к конечной точке по протоколу HTTP, которые перенаправляются на HTTPS с использованием UseHttpsRedirection, завершаются ошибкой ERR_INVALID_REDIRECT в предварительном запросе CORS.

Проекты API могут отклонять HTTP-запросы, а не использовать UseHttpsRedirection для перенаправления запросов на HTTPS.

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

Рекомендуется использовать рабочие веб-приложения ASP.NET Core:

  • Промежуточное программное обеспечение для перенаправления HTTPS (UseHttpsRedirection) для перенаправления HTTP-запросов на HTTPS.
  • Посредник HSTS (UseHsts) для отправки клиентам заголовков протокола HTTP Strict Transport Security.

Примечание.

Приложения, развернутые в конфигурации обратного прокси-сервера, позволяют прокси-серверу обрабатывать безопасность подключения (HTTPS). Если прокси-сервер также обрабатывает перенаправление HTTPS, нет необходимости использовать ПО промежуточного слоя перенаправления HTTPS. Если прокси-сервер также обрабатывает запись заголовков HSTS (например, встроенная поддержка HSTS в IIS 10.0 (1709) или более поздней версии), ПО промежуточного слоя HSTS не требуется приложению. Дополнительные сведения см. в разделе "Отказ от HTTPS/HSTS" при создании проекта.

UseHttpsRedirection

Следующий код вызывает UseHttpsRedirection в файле Program.cs:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Предыдущий выделенный код:

Рекомендуется использовать временные перенаправления, а не постоянные перенаправления. Кэширование ссылок может привести к нестабильной работе в средах разработки. Если вы предпочитаете отправлять код состояния постоянного перенаправления, если приложение находится в среде, отличной от разработки, см . раздел "Настройка постоянных перенаправлений в рабочей среде ". Мы рекомендуем использовать HSTS для сигнала клиентам о том, что в приложение должны отправляться только безопасные запросы ресурсов (только в рабочей среде).

Конфигурация порта

Порт должен быть доступен для промежуточного слоя для перенаправления небезопасного запроса на HTTPS. Если порт недоступен:

  • Перенаправление на HTTPS не происходит.
  • ПО промежуточного слоя записывает предупреждение "Не удалось определить порт https для перенаправления".

Укажите порт HTTPS с помощью любого из следующих подходов:

  • Задайте httpsRedirectionOptions.HttpsPort.

  • https_port Задайте настройку узла:

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

    • Задав ASPNETCORE_HTTPS_PORT переменную среды.

    • Добавив запись верхнего уровня в appsettings.json:

      {
        "https_port": 443,
        "Logging": {
          "LogLevel": {
            "Default": "Information",
            "Microsoft.AspNetCore": "Warning"
          }
        },
        "AllowedHosts": "*"
      }
      
  • Укажите порт с безопасной схемой с помощью переменной среды ASPNETCORE_URLS. Переменная среды настраивает сервер. ПО промежуточного слоя косвенно обнаруживает порт HTTPS через IServerAddressesFeature. Этот подход не работает в развертывании обратного прокси-сервера.

  • Веб-шаблоны ASP.NET Core настраивают HTTPS URL в Properties/launchsettings.json для Kestrel и IIS Express. launchsettings.json используется только на локальном компьютере.

  • Настройте конечную точку HTTPS URL для публичного пограничного Kestrel развертывания сервера или сервера HTTP.sys. Приложение использует только один порт HTTPS. ПО промежуточного слоя обнаруживает порт через IServerAddressesFeature.

Примечание.

Когда приложение выполняется в конфигурации обратного прокси-сервера, IServerAddressesFeature недоступно. Задайте порт с помощью одного из других подходов, описанных в этом разделе.

Развертывания на периферии

Если Kestrel или HTTP.sys используется в качестве общедоступного пограничного сервера, то необходимо настроить Kestrel или HTTP.sys для прослушивания обоих:

  • Безопасный порт, в котором клиент перенаправляется (обычно 443 в рабочей среде и 5001 в разработке).
  • Небезопасный порт (обычно 80 в производственной среде и 5000 в среде разработки).

Небезопасный порт должен быть доступен клиентом, чтобы приложение получило небезопасный запрос и перенаправляет клиента на безопасный порт.

Дополнительные сведения см. в разделе Kestrel о конфигурации конечной точки или реализации веб-сервера HTTP.sys в ASP.NET Core.

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

Любой брандмауэр между клиентом и сервером также должен иметь порты связи, открытые для трафика.

Если запросы перенаправляются в конфигурации обратного прокси-сервера, используйте ПО промежуточного слоя заголовков пересылки перед вызовом промежуточного ПО для перенаправления HTTPS. Промежуточное программное обеспечение для перенаправленных заголовков обновляет Request.Scheme с помощью заголовка X-Forwarded-Proto. Промежуточное ПО обеспечивает корректную работу URI перенаправления и других политик безопасности. Если промежуточное ПО для перенаправленных заголовков не используется, серверное приложение может не получить правильную схему и в конечном итоге оказаться в цикле перенаправления. Обычное сообщение об ошибке конечного пользователя заключается в том, что произошло слишком много перенаправлений.

При развертывании в службе приложений Azure следуйте инструкциям в руководстве по привязке существующего пользовательского SSL-сертификата к веб-приложениям Azure.

Настройки

Следующий выделенный вызов кода AddHttpsRedirection для настройки параметров посреднического ПО:

using static Microsoft.AspNetCore.Http.StatusCodes;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

builder.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");
});

builder.Services.AddHttpsRedirection(options =>
{
    options.RedirectStatusCode = Status307TemporaryRedirect;
    options.HttpsPort = 5001;
});

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Вызов AddHttpsRedirection необходим только для изменения значений HttpsPort или RedirectStatusCode.

Предыдущий выделенный код:

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

По умолчанию промежуточное ПО отправляет Status307TemporaryRedirect при всех перенаправлениях. Если вы предпочитаете отправлять код состояния постоянного перенаправления, когда приложение находится вне среды разработки, оберните конфигурацию параметров промежуточного слоя условной проверкой на отсутствие среды разработки.

При настройке служб в Program.cs:

using static Microsoft.AspNetCore.Http.StatusCodes;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

if (!builder.Environment.IsDevelopment())
{
    builder.Services.AddHttpsRedirection(options =>
    {
        options.RedirectStatusCode = Status308PermanentRedirect;
        options.HttpsPort = 443;
    });
}

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");

    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Альтернативный подход к перенаправлению HTTPS с использованием промежуточного программного обеспечения.

Альтернативой использованию Промежуточного ПО для перенаправления HTTPS является использование Промежуточного ПО для переписывания URL-адресов. AddRedirectToHttps также может задать код состояния и порт при выполнении перенаправления. Дополнительные сведения см. в перезаписи URL с помощью промежуточного программного обеспечения.

При перенаправлении на HTTPS без требования к дополнительным правилам перенаправления рекомендуется использовать ПО промежуточного слоя перенаправления HTTPS(UseHttpsRedirection), описанное в этой статье.

Протокол строгой транспортной безопасности HTTP (HSTS)

Согласно OWASP, HTTP Strict Transport Security (HSTS) — это опция безопасности, которая может быть включена веб-приложением с помощью заголовка ответа. Когда браузер, поддерживающий HSTS, получает этот заголовок:

  • Браузер сохраняет конфигурацию для домена, который предотвращает отправку сообщений по протоколу HTTP. Браузер принудительно выполняет обмен данными по протоколу HTTPS.
  • Браузер запрещает пользователю использовать недоверенные или недопустимые сертификаты. Браузер отключает запросы, позволяющие пользователю временно доверять такому сертификату.

Так как HSTS применяется клиентом, он имеет некоторые ограничения:

  • Клиент должен поддерживать HSTS.
  • Для установки политики HSTS требуется по крайней мере один успешный HTTPS-запрос.
  • Приложение должно проверить каждый HTTP-запрос и перенаправить или отклонить HTTP-запрос.

ASP.NET Core реализует HSTS с помощью UseHsts метода расширения. Следующий код вызывается UseHsts, когда приложение не в режиме разработки:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

UseHsts не рекомендуется на этапе разработки, так как параметры HSTS сильно кэшируются браузерами. По умолчанию UseHsts исключает локальный адрес обратной связи.

Для рабочих сред, реализующих протокол HTTPS в первый раз, установите начальное значение HstsOptions.MaxAge на небольшой уровень, используя один из методов TimeSpan. Установите время от нескольких часов до одного дня в случае, если потребуется вернуть инфраструктуру HTTPS на HTTP. После того как вы уверены в устойчивости конфигурации HTTPS, увеличьте значение HSTS max-age ; обычно используемое значение составляет один год.

Следующий выделенный код:

using static Microsoft.AspNetCore.Http.StatusCodes;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

builder.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");
});

builder.Services.AddHttpsRedirection(options =>
{
    options.RedirectStatusCode = Status307TemporaryRedirect;
    options.HttpsPort = 5001;
});

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();
  • Задает параметр предварительной загрузки заголовка Strict-Transport-Security . Предварительная загрузка не является частью спецификации RFC HSTS, но поддерживается веб-браузерами для предварительной загрузки сайтов HSTS на свежей установке. Дополнительные сведения см. в разделе https://hstspreload.org/.
  • Включает параметр includeSubDomain, который применяет политику HSTS к поддоменам хоста.
  • Явно устанавливает параметр max-age заголовка Strict-Transport-Security на 60 дней. Если значение не задано, значение по умолчанию — 30 дней. Дополнительные сведения см. в директиве max-age.
  • Добавляет example.com в список узлов, которые нужно исключить.

UseHsts исключает следующие узлы для обратной связи:

  • localhost : адрес обратного цикла IPv4.
  • 127.0.0.1 : адрес обратного цикла IPv4.
  • [::1] : адрес обратной связи IPv6.

Отказ от HTTPS/HSTS при создании проекта

В некоторых сценариях серверной службы, где безопасность подключения обрабатывается на общедоступном крае сети, настройка безопасности подключения на каждом узле не требуется. Веб-приложения, созданные из шаблонов в Visual Studio или с помощью команды dotnet new, включают перенаправление HTTPS и HSTS. Для развертываний, которые не требуют этих сценариев, вы можете отказаться от HTTPS/HSTS при создании приложения из шаблона.

Чтобы отказаться от HTTPS/HSTS, выполните приведенные действия.

Снимите флажок "Настройка для HTTPS ".

Диалоговое окно

Доверять сертификату разработки ASP.NET Core HTTPS

Пакет SDK для .NET Core включает сертификат разработки HTTPS. Сертификат устанавливается при первом использовании. Например, dotnet --info производит вариант следующего выходного результата.

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. Сертификат установлен, но он не является доверенным. Чтобы доверять сертификату, выполните однократный шаг для запуска dotnet dev-certs средства:

dotnet dev-certs https --trust

Следующая команда отображает справку по инструменту dotnet dev-certs.

dotnet dev-certs https --help

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

Не создавайте сертификат разработки в среде, которая будет распространяться, например образ контейнера или виртуальная машина. Это может привести к спуфингу и повышению привилегий. Чтобы предотвратить это, задайте переменную среды DOTNET_GENERATE_ASPNET_CERTIFICATE значением false перед вызовом .NET CLI в первый раз. Это пропустит автоматическое создание сертификата разработки ASP.NET Core во время первого запуска интерфейса командной строки.

Настройка сертификата разработчика для Docker

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

Рекомендации, связанные с Linux

Дистрибутивы Linux существенно отличаются в том, как они помечают сертификаты как доверенные. Хотя предполагается, что dotnet dev-certs может быть широко применимо, оно официально поддерживается только в Ubuntu и Fedora и в частности направлено на обеспечение надежности в браузерах на основе Firefox и Chromium (Edge, Chrome и Chromium).

Зависимости

Чтобы установить доверие OpenSSL, утилита openssl должна быть в пути поиска.

Чтобы установить доверие браузера (например, в Edge или Firefox), certutil средство должно быть включено в переменную PATH.

Доверие OpenSSL

Если сертификат разработки ASP.NET Core является доверенным, он экспортируется в папку в домашнем каталоге текущего пользователя. Чтобы OpenSSL (и клиенты, которые его используют) могли работать с этой папкой, необходимо задать переменную среды SSL_CERT_DIR. Можно сделать это за один сеанс, выполнив команду export SSL_CERT_DIR=$HOME/.aspnet/dev-certs/trust:/usr/lib/ssl/certs (точное значение будет указано в выводе при передаче --verbose), или добавив его в ваш (зависимый от дистрибутива и оболочки) файл конфигурации, например, .profile.

Это необходимо, чтобы такие средства, как curl, доверяли сертификату разработки. Или, как вариант, можно передать или для каждого вызова .

Обратите внимание, что для этого требуется версия 1.1.1h или более поздней версии или 3.0.0 или более поздней версии в зависимости от используемой основной версии.

Если доверие OpenSSL оказывается в плохом состоянии (например, если dotnet dev-certs https --clean не удается его устранить), часто можно исправить ситуацию с помощью инструмента c_rehash.

Переопределения

Если вы используете другой браузер с собственным хранилищем служб безопасности сети (NSS), можно использовать DOTNET_DEV_CERTS_NSSDB_PATHS переменную среды, чтобы указать список каталогов NSS с разделителями двоеточий (например, каталог, содержащий cert9.db) для добавления сертификата разработки.

Если вы храните сертификаты, которым нужно доверять OpenSSL в определенном каталоге, можно использовать DOTNET_DEV_CERTS_OPENSSL_CERTIFICATE_DIRECTORY переменную среды, чтобы указать, где это находится.

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

Если вы задаете любой из этих переменных, важно, чтобы они были одинаковыми значениями при каждом обновлении доверия. Если они изменяются, средство не будет знать о сертификатах в предыдущих местоположениях (например, чтобы удалить их).

Использование sudo

Как и на других платформах, сертификаты разработки хранятся и надежны отдельно для каждого пользователя. В результате, если вы запускаете dotnet dev-certs под другим пользователем (например, с помощью sudo), именно этот пользователь (например, root) будет доверять сертификату разработки.

Доверять сертификату HTTPS в Linux с помощью инструмента linux-dev-certs

Linux-dev-certs — это глобальное средство с открытым кодом, поддерживаемое сообществом, .NET, которое предоставляет удобный способ создания и доверия сертификату разработчика в Linux. Средство не обслуживается и не поддерживается корпорацией Майкрософт.

Следующие команды устанавливают средство и создают доверенный сертификат разработчика:

dotnet tool update -g linux-dev-certs
dotnet linux-dev-certs install

Для получения дополнительной информации или чтобы сообщить о проблемах, см. репозиторий linux-dev-certs на GitHub.

Устранение неполадок с сертификатами, таких как ненадежный сертификат

В этом разделе содержатся сведения о том, что сертификат разработки ASP.NET Core HTTPS установлен и доверен, но у вас по-прежнему есть предупреждения браузера о том, что сертификат не является доверенным. Сертификат разработки ASP.NET Core HTTPS используется Kestrel.

Чтобы восстановить сертификат IIS Express, ознакомьтесь с этой проблемой Stackoverflow .

Все платформы — сертификат не доверенный

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

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

Закройте все открытые экземпляры браузера. Откройте новое окно браузера для приложения. Доверие сертификатов кэшируется браузерами.

dotnet dev-certs https --clean Сбой

Приведенные выше команды решают большинство проблем доверия браузера. Если браузер по-прежнему не доверяет сертификату, следуйте приведенным ниже предложениям для конкретной платформы.

Docker — сертификат не доверенный

  • Удалите папку C:\Users{USER}\AppData\Roaming\ASP.NET\Https .
  • Очистите решение. Удалите папки bin и obj.
  • Перезапустите средство разработки. Например, Visual Studio или Visual Studio Code.

Windows — сертификат не доверенный

  • Проверьте сертификаты в хранилище сертификатов. Должен быть localhost сертификат с удобочитаемым именем ASP.NET Core HTTPS development certificate как под Current User > Personal > Certificates, так и под Current User > Trusted root certification authorities > Certificates
  • Удалите все найденные сертификаты как из персональных, так и доверенных корневых центров сертификации. Не удаляйте сертификат IIS Express localhost.
  • Выполните следующие команды:
dotnet dev-certs https --clean
dotnet dev-certs https --trust

Закройте все открытые экземпляры браузера. Откройте новое окно браузера для приложения.

OS X — сертификат, не доверенный

  • Откройте доступ к цепочке ключей.
  • Выберите цепочку ключей системы.
  • Проверьте наличие сертификата localhost.
  • Убедитесь, что он содержит + символ на значке, чтобы указать, что он является доверенным для всех пользователей.
  • Удалите сертификат из цепочки ключей системы.
  • Выполните следующие команды:
dotnet dev-certs https --clean
dotnet dev-certs https --trust

Закройте все открытые экземпляры браузера. Откройте новое окно браузера для приложения.

Сведения об устранении неполадок с сертификатами в Visual Studio см. в статье об ошибке HTTPS с помощью IIS Express (dotnet/AspNetCore #16892).

Сертификат Linux не является доверенным

Убедитесь, что сертификат, настроенный для доверия, является сертификатом разработчика HTTPS, который будет использоваться сервером Kestrel .

Проверьте сертификат разработчика Kestrel HTTPS по умолчанию для текущего пользователя в следующем расположении:

ls -la ~/.dotnet/corefx/cryptography/x509stores/my

Файл сертификата разработчика Kestrel HTTPS — это отпечаток SHA1. Когда файл удаляется с помощью dotnet dev-certs https --clean, он воссоздается по мере необходимости с другим отпечатком. Проверьте, совпадает ли отпечаток экспортированного сертификата с помощью следующей команды:

openssl x509 -noout -fingerprint -sha1 -inform pem -in /usr/local/share/ca-certificates/aspnet/https.crt

Если сертификат не соответствует, он может быть одним из следующих вариантов:

  • Старый сертификат.
  • Экспортирован сертификат разработчика для корневого пользователя. В этом случае экспортируйте сертификат.

Сертификат корневого пользователя можно проверить по адресу:

ls -la /root/.dotnet/corefx/cryptography/x509stores/my

SSL-сертификат IIS Express, используемый в Visual Studio

Чтобы устранить проблемы с сертификатом IIS Express, выберите "Восстановить " в установщике Visual Studio. Дополнительные сведения см. здесь на GitHub.

Групповая политика не позволяет доверять самозаверенным сертификатам.

В некоторых случаях групповая политика может предотвратить доверие самозаверяемых сертификатов. Дополнительные сведения см. здесь на GitHub.

Дополнительная информация:

Примечание.

Если вы используете пакет SDK для .NET 9 или более поздней версии, ознакомьтесь с обновленными процедурами Linux в версии .NET 9 этой статьи.

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

Проекты API

Не используйтеRequireHttpsAttribute веб-API, получающих конфиденциальную информацию. RequireHttpsAttribute использует коды состояния HTTP для перенаправления браузеров из HTTP в HTTPS. Клиенты API могут не понимать или подчиняться перенаправлениям из HTTP в HTTPS. Такие клиенты могут отправлять данные по протоколу HTTP. Веб-API должны иметь следующее:

  • Не использовать HTTP для прослушивания.
  • Закройте подключение с кодом состояния 400 (недопустимый запрос) и не обслуживайте запрос.

Чтобы отключить перенаправление HTTP в API, задайте ASPNETCORE_URLS переменную среды или используйте флаг командной --urls строки. Дополнительные сведения см. в разделе "Использование нескольких сред" в ASP.NET Core и 8 способов задания URL-адресов для приложения ASP.NET Core от Эндрю Lock.

Проекты HSTS и API

Проекты API по умолчанию не включают HSTS, так как HSTS обычно является инструкцией только для браузера. Другие клиенты, такие как телефонные или настольные приложения, не выполняют инструкции. Даже в браузерах один прошедший проверку подлинности вызов API через HTTP имеет риски в небезопасных сетях. Безопасный подход заключается в настройке проектов API только для прослушивания и реагирования по протоколу HTTPS.

Перенаправление HTTP на HTTPS вызывает ошибку ERR_INVALID_REDIRECT в предварительном запросе CORS.

Запросы к конечной точке с использованием HTTP, которые перенаправляются на HTTPS, UseHttpsRedirection завершаются ошибкой ERR_INVALID_REDIRECT на подготовительном запросе CORS.

Проекты API могут отклонять HTTP-запросы, а не использовать UseHttpsRedirection для перенаправления запросов на HTTPS.

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

Рекомендуется использовать рабочие веб-приложения ASP.NET Core:

  • Промежуточное ПО для перенаправления HTTPS (UseHttpsRedirection) используется для перенаправления HTTP-запросов на HTTPS.
  • Посредством промежуточного слоя HSTS (UseHsts) для отправки клиентам заголовков HTTP Strict Transport Security Protocol (HSTS).

Примечание.

Приложения, развернутые в конфигурации обратного прокси-сервера, позволяют прокси-серверу обрабатывать безопасность подключения (HTTPS). Если прокси-сервер также обрабатывает перенаправление HTTPS, нет необходимости использовать ПО промежуточного слоя перенаправления HTTPS. Если прокси-сервер также обрабатывает запись заголовков HSTS (например, встроенная поддержка HSTS в IIS 10.0 (1709) или более поздней версии), ПО промежуточного слоя HSTS не требуется приложению. Дополнительные сведения см. в разделе "Отказ от HTTPS/HSTS" при создании проекта.

UseHttpsRedirection

Следующий код вызывает UseHttpsRedirection в файле Program.cs:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Предыдущий выделенный код:

Рекомендуется использовать временные перенаправления, а не постоянные перенаправления. Кэширование ссылок может привести к нестабильной работе в средах разработки. Если вы предпочитаете отправлять код состояния постоянного перенаправления, если приложение находится в среде, отличной от разработки, см . раздел "Настройка постоянных перенаправлений в рабочей среде ". Мы рекомендуем использовать HSTS для сигнала клиентам о том, что в приложение должны отправляться только безопасные запросы ресурсов (только в рабочей среде).

Конфигурация порта

Порт должен быть доступен для промежуточного слоя, чтобы перенаправлять небезопасные запросы на HTTPS. Если порт недоступен:

  • Перенаправление на HTTPS не происходит.
  • ПО промежуточного слоя записывает предупреждение "Не удалось определить порт https для перенаправления".

Укажите порт HTTPS с помощью любого из следующих подходов:

  • Задайте HttpsRedirectionOptions.HttpsPort.

  • https_port Задайте настройку хоста:

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

    • Установив переменную окружения ASPNETCORE_HTTPS_PORT.

    • Добавив запись верхнего уровня в appsettings.json:

      {
        "https_port": 443,
        "Logging": {
          "LogLevel": {
            "Default": "Information",
            "Microsoft.AspNetCore": "Warning"
          }
        },
        "AllowedHosts": "*"
      }
      
  • Укажите порт с безопасной схемой с помощью переменной среды ASPNETCORE_URLS. Переменная среды настраивает сервер. ПО промежуточного слоя косвенно обнаруживает порт HTTPS через IServerAddressesFeature. Этот подход не работает в развертывании обратного прокси-сервера.

  • Веб-шаблоны ASP.NET Core задают URL-адрес HTTPS в Properties/launchsettings.json как для Kestrel, так и для IIS Express. launchsettings.json используется только на локальном компьютере.

  • Настройте конечную точку URL-адреса HTTPS для развертывания на общедоступном пограничном узле сервера Kestrel или сервера HTTP.sys. Приложение использует только один порт HTTPS. ПО промежуточного слоя обнаруживает порт через IServerAddressesFeature.

Примечание.

Когда приложение выполняется в конфигурации обратного прокси-сервера, IServerAddressesFeature недоступно. Задайте порт с помощью одного из других подходов, описанных в этом разделе.

Развертывания Edge

Если Kestrel или HTTP.sys используется в качестве пограничного сервера, обрабатывающего публичные запросы, Kestrel или HTTP.sys необходимо настроить для прослушивания обоих:

  • Безопасный порт, в котором клиент перенаправляется (обычно 443 в рабочей среде и 5001 в разработке).
  • Небезопасный порт (как правило, 80 в производственной среде и 5000 в среде разработки).

Небезопасный порт должен быть доступен клиентом, чтобы приложение получило небезопасный запрос и перенаправляет клиента на безопасный порт.

Дополнительные сведения см. в разделе Kestrel о конфигурации конечной точки или реализации веб-сервера HTTP.sys в ASP.NET Core.

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

Любой брандмауэр между клиентом и сервером также должен иметь порты связи, открытые для трафика.

Если запросы перенаправляются в конфигурации обратного прокси-сервера, используйте ПО промежуточного слоя перенаправленных заголовков перед вызовом ПО промежуточного слоя для перенаправления HTTPS. Промежуточное программное обеспечение для переадресации заголовков обновляет Request.Scheme, используя заголовок X-Forwarded-Proto. Промежуточное ПО обеспечивает корректную работу URI перенаправления и других политик безопасности. Если промежуточное ПО для перенаправленных заголовков не используется, серверное приложение может не получить правильную схему и в конечном итоге окажется в цикле перенаправлений. Обычное сообщение об ошибке конечного пользователя заключается в том, что произошло слишком много перенаправлений.

При развертывании в службе приложений Azure следуйте указаниям в учебном пособии: Привязка существующего пользовательского SSL-сертификата к веб-приложениям Azure.

Параметры

Следующий выделенный код вызывает AddHttpsRedirection для настройки параметров промежуточного программного обеспечения:

using static Microsoft.AspNetCore.Http.StatusCodes;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

builder.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");
});

builder.Services.AddHttpsRedirection(options =>
{
    options.RedirectStatusCode = Status307TemporaryRedirect;
    options.HttpsPort = 5001;
});

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Вызов AddHttpsRedirection необходим только для изменения значений HttpsPort или RedirectStatusCode.

Предыдущий выделенный код:

Настройка постоянных перенаправлений в производственной среде

Промежуточное ПО по умолчанию отправляет Status307TemporaryRedirect со всеми перенаправлениями. Если вы предпочитаете отправлять код состояния постоянного перенаправления, когда приложение работает в среде, отличной от разработки, оберните настройку параметров промежуточного слоя в условие проверки на неразработческую среду.

При настройке сервисов в Program.cs:

using static Microsoft.AspNetCore.Http.StatusCodes;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

if (!builder.Environment.IsDevelopment())
{
    builder.Services.AddHttpsRedirection(options =>
    {
        options.RedirectStatusCode = Status308PermanentRedirect;
        options.HttpsPort = 443;
    });
}

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");

    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Альтернативный подход к HTTPS middleware перенаправлению

Альтернативой использованию промежуточного ПО перенаправления HTTPS является использование промежуточного ПО перезаписи URL-адресов (UseHttpsRedirection, AddRedirectToHttps). AddRedirectToHttps также может задать код состояния и порт при выполнении перенаправления. Для получения дополнительной информации см. Промежуточное программное обеспечение для перезаписи URL-адресов.

При перенаправлении на HTTPS без требования к дополнительным правилам перенаправления рекомендуется использовать ПО промежуточного слоя перенаправления HTTPS(UseHttpsRedirection), описанное в этой статье.

Протокол строгой транспортной безопасности HTTP (HSTS)

Для OWASPHTTP Strict Transport Security (HSTS) — это добровольное улучшение безопасности, указанное веб-приложением с помощью заголовка ответа. Когда браузер, поддерживающий HSTS, получает этот заголовок:

  • Браузер сохраняет конфигурацию для домена, который предотвращает отправку сообщений по протоколу HTTP. Браузер принудительно выполняет обмен данными по протоколу HTTPS.
  • Браузер запрещает пользователю использовать недоверенные или недопустимые сертификаты. Браузер отключает запросы, позволяющие пользователю временно доверять такому сертификату.

Так как HSTS применяется клиентом, он имеет некоторые ограничения:

  • Клиент должен поддерживать HSTS.
  • Для установки политики HSTS требуется по крайней мере один успешный HTTPS-запрос.
  • Приложение должно проверить каждый HTTP-запрос и перенаправить или отклонить HTTP-запрос.

ASP.NET Core реализует HSTS посредством UseHsts метода расширения. Следующий код вызывает UseHsts , когда приложение не находится в режиме разработки.

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

UseHsts не рекомендуется в процессе разработки, так как параметры HSTS сильно кэшируются браузерами. По умолчанию UseHsts исключает локальный адрес обратного цикла.

Для рабочих сред, которые впервые внедряют протокол HTTPS, задайте небольшое начальное HstsOptions.MaxAge значение с помощью одного из TimeSpan методов. Задайте значение от часов не более одного дня, если необходимо вернуть инфраструктуру HTTPS на HTTP. После того как вы уверены в устойчивости конфигурации HTTPS, увеличьте значение HSTS max-age ; обычно используемое значение составляет один год.

Следующий выделенный код:

using static Microsoft.AspNetCore.Http.StatusCodes;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

builder.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");
});

builder.Services.AddHttpsRedirection(options =>
{
    options.RedirectStatusCode = Status307TemporaryRedirect;
    options.HttpsPort = 5001;
});

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();
  • Задает параметр предварительной загрузки заголовка Strict-Transport-Security . Предварительная загрузка не является частью спецификации RFC HSTS, но поддерживается веб-браузерами для предварительной загрузки сайтов HSTS на свежей установке. Дополнительные сведения см. в разделе https://hstspreload.org/.
  • Включает includeSubDomain, который применяет политику HSTS к поддоменам узла.
  • Явно устанавливает параметр max-age заголовка Strict-Transport-Security на 60 дней. Если значение не задано, значение по умолчанию — 30 дней. Для получения дополнительной информации см. директиву max-age.
  • Добавляет example.com в список узлов, которые нужно исключить.

UseHsts исключает следующие узлы обратного цикла:

  • localhost : адрес обратного цикла IPv4.
  • 127.0.0.1 : адрес обратного цикла IPv4.
  • [::1] : адрес обратного цикла IPv6.

Отказ от HTTPS/HSTS при создании проекта

В некоторых сценариях серверной службы, где безопасность подключения обрабатывается на общедоступном крае сети, настройка безопасности подключения на каждом узле не требуется. Веб-приложения, созданные из шаблонов в Visual Studio или с помощью команды dotnet new, включают перенаправление HTTPS и HSTS. Для развертываний, которые не требуют этих сценариев, вы можете отказаться от HTTPS/HSTS при создании приложения из шаблона.

Чтобы отказаться от HTTPS/HSTS, выполните приведенные действия.

Снимите флажок "Настройка для HTTPS ".

Диалоговое окно

Доверять сертификату разработки ASP.NET Core HTTPS в Windows и macOS

В браузере Firefox см. следующий раздел.

Пакет SDK для .NET Core включает сертификат разработки HTTPS. Сертификат устанавливается в рамках первого запуска. Например, dotnet --info порождает вариацию следующих результатов.

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. Сертификат установлен, но он не является доверенным. Чтобы доверять сертификату, выполните однократный шаг для запуска dotnet dev-certs средства:

dotnet dev-certs https --trust

Следующая команда предоставляет справку по инструменту dotnet dev-certs.

dotnet dev-certs https --help

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

Не создавайте сертификат разработки в среде, которая будет распространяться, например образ контейнера или виртуальная машина. Это может привести к спуфингу и эскалации привилегий. Чтобы предотвратить это, задайте переменную среды DOTNET_GENERATE_ASPNET_CERTIFICATE в значение false перед первым вызовом .NET CLI. Это пропустит автоматическое создание сертификата разработки ASP.NET Core во время первого запуска интерфейса командной строки.

Доверяйте сертификату безопасности HTTPS в Firefox, чтобы предотвратить ошибку SEC_ERROR_INADEQUATE_KEY_USAGE

Браузер Firefox использует собственное хранилище сертификатов, поэтому не доверяет сертификатам IIS Express или Kestrel разработчика.

Существует два подхода к принятию сертификата HTTPS в Firefox: создание файла политики или настройка через браузер Firefox. При настройке с помощью браузера создается файл политики, поэтому два подхода эквивалентны.

Создание файла политики для доверия к сертификату HTTPS с помощью Firefox

Создайте файл политики (policies.jsonпо адресу:

Добавьте следующий код JSON в файл политики Firefox:

{
  "policies": {
    "Certificates": {
      "ImportEnterpriseRoots": true
    }
  }
}

Файл политики заставляет Firefox доверять сертификатам из хранилища доверенных сертификатов Windows. В следующем разделе представлен альтернативный подход к созданию предыдущего файла политики с помощью браузера Firefox.

Настройка доверия сертификата HTTPS с помощью браузера Firefox

Настройте security.enterprise_roots.enabled = true, следуя следующим инструкциям.

  1. Введите about:config в браузере FireFox.
  2. Нажмите кнопку "Принять риск" и "Продолжить ", если вы принимаете риск.
  3. Выберите "Показать все"
  4. Задайте значение security.enterprise_roots.enabled = true.
  5. Выход и перезапуск Firefox

Дополнительные сведения см. в разделе "Настройка центров сертификации" в Firefox и mozilla/policy-templates/README-файле.

Настройка сертификата разработчика для Docker

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

Доверять сертификату HTTPS в Linux

Установка доверия зависит от конкретного дистрибутива и браузера. В следующих разделах приведены инструкции для некоторых популярных дистрибутивов и браузеров Chromium (Edge и Chrome) и Firefox.

Ubuntu доверяет сертификату для обмена данными между службами

Следующие инструкции не работают для некоторых версий Ubuntu, таких как 20.04. Дополнительные сведения см. в статье о проблеме GitHub dotnet/AspNetCore.Docs #23686.

  1. Установите OpenSSL 1.1.1h или более поздней версии. Инструкции по обновлению OpenSSL см. в дистрибутиве.

  2. Выполните следующие команды:

    dotnet dev-certs https
    sudo -E dotnet dev-certs https -ep /usr/local/share/ca-certificates/aspnet/https.crt --format PEM
    sudo update-ca-certificates
    

Предыдущие команды:

  • Убедитесь, что создается сертификат разработчика текущего пользователя.
  • Экспортирует сертификат с повышенными разрешениями, необходимыми для ca-certificates папки, с помощью среды текущего пользователя.
  • Удаление -E флага экспортирует корневой сертификат пользователя, создав его при необходимости. Каждый созданный сертификат имеет другой отпечаток. При запуске от имени пользователя root sudo и -E не требуются.

Путь в предыдущей команде предназначен для Ubuntu. Для других дистрибутивов выберите соответствующий путь или используйте путь для центров сертификации (ЦС).

Доверие к сертификату HTTPS в Linux с помощью Edge или Chrome

Для браузеров chromium в Linux:

  • Установите libnss3-tools для вашей дистрибуции.

  • Создайте или убедитесь, что папка $HOME/.pki/nssdb существует на компьютере.

  • Экспортируйте сертификат со следующей командой:

    dotnet dev-certs https
    sudo -E dotnet dev-certs https -ep /usr/local/share/ca-certificates/aspnet/https.crt --format PEM
    

    Путь в предыдущей команде предназначен для Ubuntu. Для других дистрибутивов выберите соответствующий путь или используйте путь для центров сертификации (ЦС).

  • Выполните следующие команды:

    certutil -d sql:$HOME/.pki/nssdb -A -t "P,," -n localhost -i /usr/local/share/ca-certificates/aspnet/https.crt
    
  • Закройте и перезапустите браузер.

Доверие к сертификату с помощью Firefox в Linux

  • Экспортируйте сертификат со следующей командой:

    dotnet dev-certs https
    sudo -E dotnet dev-certs https -ep /usr/local/share/ca-certificates/aspnet/https.crt --format PEM
    

    Путь в предыдущей команде предназначен для Ubuntu. Для других дистрибутивов выберите соответствующий путь или используйте путь для центров сертификации (ЦС).

  • Создайте JSON-файл в /usr/lib/firefox/distribution/policies.json с помощью следующей команды:

cat <<EOF | sudo tee /usr/lib/firefox/distribution/policies.json
{
    "policies": {
        "Certificates": {
            "Install": [
                "/usr/local/share/ca-certificates/aspnet/https.crt"
            ]
        }
    }
}
EOF

Примечание. Firefox для Ubuntu 21.10 поставляется как snap пакет, а папка установки — /snap/firefox/current/usr/lib/firefox.

Дополнительную информацию о конфигурировании доверия к сертификату HTTPS с помощью браузера Firefox см. в разделе Настройка доверия сертификата HTTPS с помощью браузера Firefox этой статьи, чтобы альтернативным способом настроить файл политики через браузер.

Доверять сертификату с помощью Fedora 34

См.

Доверие к сертификату с другими дистрибутивами

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

Доверять сертификату HTTPS из подсистема Windows для Linux

Следующие инструкции не работают для некоторых дистрибутивов Linux, таких как Ubuntu 20.04. Дополнительные сведения см. в статье о проблеме GitHub dotnet/AspNetCore.Docs #23686.

Подсистема Windows для Linux (WSL) создает самозаверяющий сертификат разработки HTTPS, который по умолчанию не является доверенным в Windows. Самый простой способ доверия Windows к сертификату WSL — настроить WSL для использования того же сертификата, что и Windows:

  • В Windows экспортируйте сертификат разработчика в файл:

    dotnet dev-certs https -ep https.pfx -p $CREDENTIAL_PLACEHOLDER$ --trust
    

    Где $CREDENTIAL_PLACEHOLDER$ находится пароль.

  • В окне WSL импортируйте экспортированный сертификат в экземпляр WSL.

    dotnet dev-certs https --clean --import <<path-to-pfx>> --password $CREDENTIAL_PLACEHOLDER$
    

Описанный подход — это однократная операция для каждого сертификата и каждой WSL-дистрибуции. Проще, чем экспортировать сертификат снова и снова. Если вы обновляете или повторно создаете сертификат в Windows, вам может потребоваться снова выполнить приведенные выше команды.

Устранение неполадок с сертификатами, таких как ненадежный сертификат.

В этом разделе содержатся сведения о том, что сертификат разработки ASP.NET Core HTTPS установлен и доверен, но у вас по-прежнему есть предупреждения браузера о том, что сертификат не является доверенным. Сертификат разработки ASP.NET Core HTTPS используется Kestrel.

Чтобы восстановить сертификат IIS Express, ознакомьтесь с этой проблемой Stackoverflow .

Все платформы — сертификат не доверенный

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

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

Закройте все открытые экземпляры браузера. Откройте новое окно браузера для приложения. Доверие сертификатов кэшируется браузерами.

dotnet dev-certs https --clean Сбой

Приведенные выше команды решают большинство проблем доверия браузера. Если браузер по-прежнему не доверяет сертификату, следуйте приведенным ниже предложениям для конкретной платформы.

Docker — сертификат не доверенный

  • Удалите папку C:\Users{USER}\AppData\Roaming\ASP.NET\Https .
  • Очистите решение. Удалите папки bin и obj.
  • Перезапустите средство разработки. Например, Visual Studio или Visual Studio Code.

Windows — сертификат не доверенный

  • Проверьте сертификаты в хранилище сертификатов. Должен быть localhost сертификат с понятным именем ASP.NET Core HTTPS development certificate, как под Current User > Personal > Certificates, так и под Current User > Trusted root certification authorities > Certificates.
  • Удалите все найденные сертификаты как из личных, так и из доверенных корневых удостоверяющих центров. Не удаляйте сертификат IIS Express localhost.
  • Выполните следующие команды:
dotnet dev-certs https --clean
dotnet dev-certs https --trust

Закройте все открытые экземпляры браузера. Откройте новое окно браузера для приложения.

OS X — сертификат, не доверенный

  • Откройте доступ к цепочке ключей.
  • Выберите цепочку ключей системы.
  • Проверьте наличие сертификата localhost.
  • Убедитесь, что он содержит + символ на значке, чтобы указать, что он является доверенным для всех пользователей.
  • Удалите сертификат из цепочки ключей системы.
  • Выполните следующие команды:
dotnet dev-certs https --clean
dotnet dev-certs https --trust

Закройте все открытые экземпляры браузера. Откройте новое окно браузера для приложения.

Сведения об устранении неполадок с сертификатами в Visual Studio см. в статье об ошибке HTTPS с помощью IIS Express (dotnet/AspNetCore #16892).

Сертификат Linux не является доверенным

Убедитесь, что сертификат, настроенный для доверия, является сертификатом разработчика HTTPS, который будет использоваться сервером Kestrel .

Проверьте сертификат разработчика Kestrel HTTPS по умолчанию для текущего пользователя в следующем расположении:

ls -la ~/.dotnet/corefx/cryptography/x509stores/my

Файл сертификата разработчика Kestrel HTTPS — это отпечаток SHA1. Когда файл удаляется через dotnet dev-certs https --clean, он создается заново при необходимости с другим отпечатком. Проверьте, совпадает ли отпечаток экспортированного сертификата, используя следующую команду:

openssl x509 -noout -fingerprint -sha1 -inform pem -in /usr/local/share/ca-certificates/aspnet/https.crt

Если сертификат не соответствует, он может быть одним из следующих вариантов:

  • Старый сертификат.
  • Экспортирован сертификат разработчика для корневого пользователя. В этом случае экспортируйте сертификат.

Сертификат корневого пользователя можно проверить по адресу:

ls -la /root/.dotnet/corefx/cryptography/x509stores/my

SSL-сертификат IIS Express, используемый в Visual Studio

Чтобы устранить проблемы с сертификатом IIS Express, выберите "Восстановить " в установщике Visual Studio. Дополнительные сведения см. здесь на GitHub.

Групповая политика не позволяет доверять самозаверяющим сертификатам

В некоторых случаях групповая политика может предотвратить доверие самозаверяемых сертификатов. Дополнительные сведения см. здесь на GitHub.

Дополнительная информация:

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

Проекты API

Не используйте RequireHttpsAttribute на веб-API, которые получают конфиденциальную информацию. RequireHttpsAttribute использует коды состояния HTTP для перенаправления браузеров из HTTP в HTTPS. Клиенты API могут не понимать или подчиняться перенаправлениям из HTTP в HTTPS. Такие клиенты могут отправлять данные по протоколу HTTP. Веб-API должны иметь следующее:

  • Не прослушивать HTTP.
  • Закройте подключение с кодом состояния 400 (недопустимый запрос) и не обслуживайте запрос.

Чтобы отключить перенаправление HTTP в API, задайте ASPNETCORE_URLS переменную среды или используйте флаг командной --urls строки. Дополнительные сведения см. в разделе "Использование нескольких сред" в ASP.NET Core и 5 способах задания URL-адресов для приложения ASP.NET Core от Эндрю Lock.

Проекты HSTS и API

Проекты API по умолчанию не включают HSTS, так как HSTS обычно является инструкцией только для браузера. Другие вызывающие программы, такие как приложения для телефонов или для настольных устройств, не выполняют инструкцию. Даже в браузерах один прошедший проверку подлинности вызов API через HTTP имеет риски в небезопасных сетях. Безопасный подход заключается в настройке проектов API только для прослушивания и реагирования по протоколу HTTPS.

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

Рекомендуется использовать рабочие веб-приложения ASP.NET Core:

  • Промежуточное программное обеспечение для перенаправления HTTP-запросов на HTTPS (UseHttpsRedirection).
  • Промежуточный слой HSTS (UseHsts) для отправки клиентам заголовков HTTP Strict Transport Security Protocol (HSTS).

Примечание.

Приложения, развернутые в конфигурации обратного прокси-сервера, позволяют прокси-серверу обрабатывать безопасность подключения (HTTPS). Если прокси-сервер также обрабатывает перенаправление HTTPS, нет необходимости использовать ПО промежуточного слоя перенаправления HTTPS. Если прокси-сервер также обрабатывает запись заголовков HSTS (например, встроенная поддержка HSTS в IIS 10.0 (1709) или более поздней версии), ПО промежуточного слоя HSTS не требуется приложению. Дополнительные сведения см. в разделе "Отказ от HTTPS/HSTS" при создании проекта.

UseHttpsRedirection

В следующем коде выполняется вызов UseHttpsRedirection в классе Startup.

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();
    });
}

Предыдущий выделенный код:

Рекомендуется использовать временные перенаправления, а не постоянные перенаправления. Кэширование ссылок может привести к нестабильной работе в средах разработки. Если вы предпочитаете отправлять код состояния постоянного перенаправления, если приложение находится в среде, отличной от разработки, см . раздел "Настройка постоянных перенаправлений в рабочей среде ". Мы рекомендуем использовать HSTS для сигнала клиентам о том, что в приложение должны отправляться только безопасные запросы ресурсов (только в рабочей среде).

Конфигурация порта

Порт должен быть доступен для промежуточного слоя, чтобы перенаправить небезопасный запрос на HTTPS. Если порт недоступен:

  • Перенаправление на HTTPS не происходит.
  • ПО промежуточного слоя записывает предупреждение "Не удалось определить порт https для перенаправления".

Укажите порт HTTPS с помощью любого из следующих подходов:

  • Установите HttpsRedirectionOptions.HttpsPort.

  • https_port Задайте параметр узла:

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

    • Задав ASPNETCORE_HTTPS_PORT переменную среды.

    • Добавив запись верхнего уровня в appsettings.json:

      {
          "https_port": 443,
          "Logging": {
              "LogLevel": {
                  "Default": "Information",
                  "Microsoft": "Warning",
                  "Microsoft.Hosting.Lifetime": "Information"
              }
          },
          "AllowedHosts": "*"
      }
      
  • Укажите порт с безопасной схемой с помощью переменной среды ASPNETCORE_URLS. Переменная среды настраивает сервер. ПО промежуточного слоя косвенно обнаруживает порт HTTPS через IServerAddressesFeature. Этот подход не работает в развертывании обратного прокси-сервера.

  • В разработке задайте URL-адрес HTTPS в launchsettings.json. Включите ПРОТОКОЛ HTTPS при использовании IIS Express.

  • Настройте конечную точку URL HTTPS для общедоступного развертывания сервера Kestrel или сервера HTTP.sys. Приложение использует только один порт HTTPS. ПО промежуточного слоя обнаруживает порт через IServerAddressesFeature.

Примечание.

Когда приложение выполняется в конфигурации обратного прокси-сервера, IServerAddressesFeature недоступно. Задайте порт с помощью одного из других подходов, описанных в этом разделе.

Развертывания на периферии

Когда используется Kestrel или HTTP.sys в качестве сервера на внешнем контуре, Kestrel или HTTP.sys необходимо настроить для прослушивания обоих параметров:

  • Безопасный порт, в котором клиент перенаправляется (обычно 443 в рабочей среде и 5001 в разработке).
  • Не защищённый порт сервера (обычно: 80 в рабочей среде и 5000 в разработке).

Небезопасный порт должен быть доступен клиентом, чтобы приложение получило небезопасный запрос и перенаправляет клиента на безопасный порт.

Дополнительные сведения см. в разделе Kestrel о конфигурации конечной точки или реализации веб-сервера HTTP.sys в ASP.NET Core.

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

Любой брандмауэр между клиентом и сервером также должен иметь порты связи, открытые для трафика.

Если запросы перенаправляются в конфигурации реверс-прокси, используйте программное обеспечение промежуточного слоя Forwarded Headers перед вызовом промежуточного слоя перенаправления HTTPS. Промежуточное ПО перенаправленных заголовков обновляет Request.Scheme, используя заголовок X-Forwarded-Proto. Программное обеспечение промежуточного слоя позволяет корректно работать URI перенаправления и другим политикам безопасности. Если промежуточное программное обеспечение для перенаправленных заголовков не используется, серверное приложение может не получить правильный протокол и в конечном итоге оказаться в цикле перенаправления. Обычное сообщение об ошибке конечного пользователя заключается в том, что произошло слишком много перенаправлений.

При развертывании в службе приложений Azure следуйте инструкциям в руководстве по привязке существующего пользовательского SSL-сертификата к веб-приложениям Azure.

Параметры

Следующий выделенный код вызывает AddHttpsRedirection для настройки параметров промежуточного ПО:

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 = (int) HttpStatusCode.TemporaryRedirect;
        options.HttpsPort = 5001;
    });
}

Вызов AddHttpsRedirection необходим только для изменения значений HttpsPort или RedirectStatusCode.

Предыдущий выделенный код:

Настройка постоянных перенаправлений в продакшене

Промежуточный слой по умолчанию отправляет Status307TemporaryRedirect со всеми перенаправлениями. Если вы предпочитаете отправлять код состояния постоянного перенаправления, когда приложение находится в среде, отличной от разработки, оберните конфигурацию параметров по промежуточного программного обеспечения в условие проверки на среду, отличную от разработки.

При настройке служб в 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 = (int) HttpStatusCode.PermanentRedirect;
            options.HttpsPort = 443;
        });
    }
}

Альтернативный подход для промежуточного ПО перенаправления HTTPS

Альтернативой использованию ПО промежуточного слоя для перенаправления HTTPS является использование ПО промежуточного слоя для перезаписи URL-адресов (AddRedirectToHttps). AddRedirectToHttps также может задать код состояния и порт при выполнении перенаправления. Дополнительные сведения см. в разделе Переписывание URL-адресов с использованием промежуточного программного обеспечения.

При перенаправлении на HTTPS без требования к дополнительным правилам перенаправления рекомендуется использовать ПО промежуточного слоя перенаправления HTTPS(UseHttpsRedirection), описанное в этой статье.

Протокол строгой транспортной безопасности HTTP (HSTS)

Согласно OWASP, HTTP Strict Transport Security (HSTS) — это улучшение безопасности по выбору, которое задаётся веб-приложением через заголовок ответа. Когда браузер, поддерживающий HSTS, получает этот заголовок:

  • Браузер сохраняет конфигурацию для домена, который предотвращает отправку сообщений по протоколу HTTP. Браузер принудительно выполняет обмен данными по протоколу HTTPS.
  • Браузер запрещает пользователю использовать недоверенные или недопустимые сертификаты. Браузер отключает запросы, позволяющие пользователю временно доверять такому сертификату.

Так как HSTS применяется клиентом, он имеет некоторые ограничения:

  • Клиент должен поддерживать HSTS.
  • Для установки политики HSTS требуется по крайней мере один успешный HTTPS-запрос.
  • Приложение должно проверить каждый HTTP-запрос и перенаправить или отклонить HTTP-запрос.

ASP.NET Core реализует HSTS с помощью метода расширения UseHsts. Следующий код вызывается UseHsts, когда приложение не находится в режиме разработки.

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();
    });
}

UseHsts не рекомендуется при разработке, поскольку параметры HSTS сильно кэшируются браузерами. По умолчанию UseHsts исключает локальный адрес обратного цикла.

Для рабочих сред, реализующих протокол HTTPS в первый раз, задайте начальное HstsOptions.MaxAge значение маленьким, используя один из методов TimeSpan. Установите значение таким образом, чтобы оно составляло от часов до не более чем одного дня, если необходимо вернуть инфраструктуру с HTTPS на HTTP. После того как вы уверены в устойчивости конфигурации HTTPS, увеличьте значение HSTS max-age ; обычно используемое значение составляет один год.

Следующий код:

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 = (int) HttpStatusCode.TemporaryRedirect;
        options.HttpsPort = 5001;
    });
}
  • Задает параметр предварительной загрузки заголовка Strict-Transport-Security . Предварительная загрузка не является частью спецификации RFC HSTS, но поддерживается веб-браузерами для предварительной загрузки сайтов HSTS на свежей установке. Дополнительные сведения см. в разделе https://hstspreload.org/.
  • Включает параметр includeSubDomain, который применяет политику HSTS к поддоменам хоста.
  • Задает параметр max-age заголовка Strict-Transport-Security на 60 дней. Если значение не задано, значение по умолчанию — 30 дней. Дополнительные сведения см. в директиве max-age.
  • Добавляет example.com в список узлов, которые нужно исключить.

UseHsts исключает следующие узлы обратного цикла:

  • localhost : адрес обратного цикла IPv4.
  • 127.0.0.1 : адрес обратного цикла IPv4.
  • [::1] : адрес обратного цикла IPv6.

Отказ от HTTPS/HSTS при создании проекта

В некоторых сценариях серверной службы, где безопасность подключения обрабатывается на общедоступном крае сети, настройка безопасности подключения на каждом узле не требуется. Веб-приложения, созданные из шаблонов в Visual Studio или из команды dotnet new, включают редирект HTTPS и HSTS. Для развертываний, которые не требуют этих сценариев, вы можете отказаться от HTTPS/HSTS при создании приложения из шаблона.

Чтобы отказаться от HTTPS/HSTS, выполните приведенные действия.

Снимите флажок "Настройка для HTTPS ".

Диалоговое окно

Доверять сертификату разработки ASP.NET Core HTTPS в Windows и macOS

В браузере Firefox см. следующий раздел.

Пакет SDK для .NET Core включает сертификат разработки HTTPS. Сертификат устанавливается в рамках первого запуска. Например, при первом запуске dotnet new webapp создается вариант следующих выходных данных:

Installed an ASP.NET Core HTTPS development certificate.
To trust the certificate, run 'dotnet dev-certs https --trust'
Learn about HTTPS: https://aka.ms/dotnet-https

При установке пакета SDK для .NET Core в локальное хранилище сертификатов пользователя устанавливается сертификат разработки HTTPS ASP.NET Core. Сертификат установлен, но он не является доверенным. Чтобы доверять сертификату, выполните однократный шаг для запуска dotnet dev-certs средства:

dotnet dev-certs https --trust

Следующая команда предоставляет справочную информацию по инструменту dotnet dev-certs.

dotnet dev-certs https --help

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

Не создавайте сертификат разработки в среде, которая будет распространяться, например образ контейнера или виртуальная машина. Это может привести к спуфингу и повышению привилегий. Чтобы предотвратить это, задайте переменную среды DOTNET_GENERATE_ASPNET_CERTIFICATE в false перед первым вызовом .NET CLI. Это пропустит автоматическое создание сертификата разработки ASP.NET Core во время первого запуска интерфейса командной строки.

Доверяйте сертификату HTTPS в Firefox, чтобы предотвратить ошибку SEC_ERROR_INADEQUATE_KEY_USAGE

Браузер Firefox использует собственное хранилище сертификатов, поэтому не доверяет сертификатам IIS Express или Kestrel разработчика.

Существует два подхода к доверию сертификату HTTPS в Firefox: создание файла политики или настройка непосредственно в браузере Firefox. При настройке с помощью браузера создается файл политики, поэтому два подхода эквивалентны.

Создание файла политики для доверия к сертификату HTTPS с помощью Firefox

Создайте файл политики (policies.jsonпо адресу:

Добавьте следующий код JSON в файл политики Firefox:

{
  "policies": {
    "Certificates": {
      "ImportEnterpriseRoots": true
    }
  }
}

Файл политики заставляет Firefox доверять сертификатам из хранилища доверенных сертификатов Windows. В следующем разделе представлен альтернативный подход к созданию предыдущего файла политики с помощью браузера Firefox.

Настройка доверия сертификата HTTPS с помощью браузера Firefox

Задайте security.enterprise_roots.enabled = true, используя следующие инструкции:

  1. Введите about:config в браузере FireFox.
  2. Нажмите кнопку "Принять риск" и "Продолжить ", если вы принимаете риск.
  3. Выберите "Показать все".
  4. Задайте security.enterprise_roots.enabled = true.
  5. Выход и перезапуск Firefox.

Дополнительные сведения см. в разделе "Настройка центров сертификации" в Firefox и mozilla/policy-templates/README-файле.

Настройка сертификата разработчика для Docker

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

Доверять сертификату HTTPS в Linux

Установление доверия зависит от особенностей дистрибуции и браузера. В следующих разделах приведены инструкции для некоторых популярных дистрибутивов и браузеров Chromium (Edge и Chrome) и Firefox.

Ubuntu доверяет сертификату для обмена данными между службами

  1. Установите OpenSSL 1.1.1h или более поздней версии. Инструкции по обновлению OpenSSL см. в дистрибутиве.

  2. Выполните следующие команды:

    dotnet dev-certs https
    sudo -E dotnet dev-certs https -ep /usr/local/share/ca-certificates/aspnet/https.crt --format PEM
    sudo update-ca-certificates
    

Предыдущие команды:

  • Убедитесь, что создается сертификат разработчика текущего пользователя.
  • Экспортируйте сертификат с повышенными правами, необходимыми для ca-certificates папки, с помощью среды текущего пользователя.
  • -E Удалите флаг для экспорта корневого сертификата пользователя, создав его при необходимости. Каждый созданный сертификат имеет другой отпечаток. При запуске от имени пользователя root sudo и -E не требуются.

Путь в предыдущей команде предназначен для Ubuntu. Для других дистрибутивов выберите соответствующий путь или используйте путь для центров сертификации (ЦС).

Доверие к сертификату HTTPS в Linux с помощью Edge или Chrome

Для браузеров chromium в Linux:

  • Установите libnss3-tools для вашего дистрибутива.

  • Создайте или убедитесь, что папка $HOME/.pki/nssdb существует на компьютере.

  • Экспортируйте сертификат со следующей командой:

    dotnet dev-certs https
    sudo -E dotnet dev-certs https -ep /usr/local/share/ca-certificates/aspnet/https.crt --format PEM
    

    Путь в предыдущей команде предназначен для Ubuntu. Для других дистрибутивов выберите соответствующий путь или используйте путь для центров сертификации (ЦС).

  • Выполните следующие команды:

    certutil -d sql:$HOME/.pki/nssdb -A -t "P,," -n localhost -i /usr/local/share/ca-certificates/aspnet/https.crt
    
  • Закройте и перезапустите браузер.

Доверие к сертификату с помощью Firefox в Linux

  • Экспортируйте сертификат со следующей командой:

    dotnet dev-certs https
    sudo -E dotnet dev-certs https -ep /usr/local/share/ca-certificates/aspnet/https.crt --format PEM
    

    Путь в предыдущей команде предназначен для Ubuntu. Для других дистрибутивов выберите соответствующий путь или используйте путь для центров сертификации (ЦС).

  • Создайте JSON-файл /usr/lib/firefox/distribution/policies.json со следующим содержимым:

cat <<EOF | sudo tee /usr/lib/firefox/distribution/policies.json
{
    "policies": {
        "Certificates": {
            "Install": [
                "/usr/local/share/ca-certificates/aspnet/https.crt"
            ]
        }
    }
}
EOF

См. раздел Настройка доверия сертификата HTTPS с помощью браузера Firefox в этой статье для альтернативного способа настройки файла политики с помощью браузера.

Доверять сертификату с помощью Fedora 34

Firefox на Fedora

echo 'pref("general.config.filename", "firefox.cfg");
pref("general.config.obscure_value", 0);' > ./autoconfig.js

echo '//Enable policies.json
lockPref("browser.policies.perUserDir", false);' > firefox.cfg

echo "{
    \"policies\": {
        \"Certificates\": {
            \"Install\": [
                \"aspnetcore-localhost-https.crt\"
            ]
        }
    }
}" > policies.json

dotnet dev-certs https -ep localhost.crt --format PEM

sudo mv autoconfig.js /usr/lib64/firefox/
sudo mv firefox.cfg /usr/lib64/firefox/
sudo mv policies.json /usr/lib64/firefox/distribution/
mkdir -p ~/.mozilla/certificates
cp localhost.crt ~/.mozilla/certificates/aspnetcore-localhost-https.crt
rm localhost.crt

Доверие dotnet-to-dotnet в Fedora

sudo cp localhost.crt /etc/pki/tls/certs/localhost.pem
sudo update-ca-trust
rm localhost.crt

См. этот комментарий GitHub для получения дополнительной информации.

Доверять сертификату в других дистрибутивах

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

Доверять сертификату HTTPS из подсистема Windows для Linux

Подсистема Windows для Linux (WSL) создает самозаверяющий сертификат разработки HTTPS. Чтобы настроить хранилище сертификатов Windows для доверия к сертификату WSL:

  • Экспорт сертификата разработчика в файл в Windows:

    dotnet dev-certs https -ep C:\<<path-to-folder>>\aspnetcore.pfx -p $CREDENTIAL_PLACEHOLDER$
    

    Где $CREDENTIAL_PLACEHOLDER$ находится пароль.

  • В окне WSL импортируйте экспортируемый сертификат в экземпляр WSL.

    dotnet dev-certs https --clean --import /mnt/c/<<path-to-folder>>/aspnetcore.pfx -p $CREDENTIAL_PLACEHOLDER$
    

Предлагаемый подход — это однократная операция для каждого сертификата и дистрибутива WSL. Это проще, чем экспортировать сертификат снова и снова. Если вы обновляете или повторно создаете сертификат в Windows, вам может потребоваться снова выполнить приведенные выше команды.

Устранение неполадок с сертификатами, таких как ненадежный сертификат

В этом разделе содержатся сведения о том, что сертификат разработки ASP.NET Core HTTPS установлен и доверен, но у вас по-прежнему есть предупреждения браузера о том, что сертификат не является доверенным. Сертификат разработки HTTPS для ASP.NET Core используется Kestrel.

Чтобы восстановить сертификат IIS Express, ознакомьтесь с этой проблемой Stackoverflow .

Все платформы — сертификат не доверенный

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

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

Закройте все открытые экземпляры браузера. Откройте новое окно браузера в приложении. Доверие сертификатов кэшируется браузерами.

dotnet dev-certs https --clean выдает ошибку

Приведенные выше команды решают большинство проблем доверия браузера. Если браузер по-прежнему не доверяет сертификату, следуйте приведенным ниже предложениям для конкретной платформы.

Docker — сертификат не доверенный

  • Удалите папку C:\Users{USER}\AppData\Roaming\ASP.NET\Https .
  • Очистите решение. Удалите папки bin и obj.
  • Перезапустите средство разработки. Например, Visual Studio, Visual Studio Code или Visual Studio для Mac.

Windows — сертификат не доверенный

  • Проверьте сертификаты в хранилище сертификатов. Должен быть localhost сертификат с понятным именем под ASP.NET Core HTTPS development certificate как под Current User > Personal > Certificates, так и под Current User > Trusted root certification authorities > Certificates.
  • Удалите все найденные сертификаты как из персональных, так и доверенных корневых центров сертификации. Не удаляйте сертификат IIS Express localhost.
  • Выполните следующие команды:
dotnet dev-certs https --clean
dotnet dev-certs https --trust

Закройте все открытые экземпляры браузера. Откройте новое окно браузера в приложении. Доверие сертификатов кэшируется браузерами.

OS X — сертификат, не доверенный

  • Откройте доступ к цепочке ключей.
  • Выберите цепочку ключей системы.
  • Проверьте наличие сертификата localhost.
  • Убедитесь, что он содержит + символ на значке, чтобы указать, что он является доверенным для всех пользователей.
  • Удалите сертификат из цепочки ключей системы.
  • Выполните следующие команды:
dotnet dev-certs https --clean
dotnet dev-certs https --trust

Закройте все открытые экземпляры браузера. Откройте новое окно браузера в приложении. Доверие сертификатов кэшируется браузерами.

Сведения об устранении неполадок с сертификатами в Visual Studio см. в статье об ошибке HTTPS с помощью IIS Express (dotnet/AspNetCore #16892).

Сертификат Linux не является доверенным

Убедитесь, что сертификат, настроенный для доверия, является сертификатом разработчика HTTPS, который будет использоваться сервером Kestrel .

Проверьте сертификат разработчика Kestrel HTTPS по умолчанию для текущего пользователя в следующем расположении:

ls -la ~/.dotnet/corefx/cryptography/x509stores/my

Файл сертификата разработчика Kestrel HTTPS — это отпечаток SHA1. Когда файл удаляется с помощью dotnet dev-certs https --clean, он генерируется заново при необходимости с другим отпечатком. Проверьте, совпадает ли отпечаток экспортированного сертификата, используя следующую команду:

openssl x509 -noout -fingerprint -sha1 -inform pem -in /usr/local/share/ca-certificates/aspnet/https.crt

Если сертификат не соответствует, он может быть одним из следующих вариантов:

  • Старый сертификат.
  • Экспортирован сертификат разработчика для корневого пользователя. В этом случае экспортируйте сертификат.

Сертификат корневого пользователя можно проверить по адресу:

ls -la /root/.dotnet/corefx/cryptography/x509stores/my

SSL-сертификат IIS Express, используемый в Visual Studio

Чтобы устранить проблемы с сертификатом IIS Express, выберите "Восстановить " в установщике Visual Studio. Дополнительные сведения см. здесь на GitHub.

Дополнительная информация:

Примечание.

Если вы используете пакет SDK для .NET 9 или более поздней версии, ознакомьтесь с обновленными процедурами Linux в версии .NET 9 этой статьи.

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

Проекты API

Не используйте RequireHttpsAttribute на веб-API, которые получают конфиденциальную информацию. RequireHttpsAttribute использует коды состояния HTTP для перенаправления браузеров из HTTP в HTTPS. Клиенты API могут не понимать или подчиняться перенаправлениям из HTTP в HTTPS. Такие клиенты могут отправлять данные по протоколу HTTP. Веб-API должны иметь следующее:

  • Не прослушивать HTTP.
  • Закройте подключение с кодом состояния 400 (недопустимый запрос) и не обслуживайте запрос.

Чтобы отключить перенаправление HTTP в API, задайте ASPNETCORE_URLS переменную среды или используйте флаг командной --urls строки. Дополнительные сведения см. в разделе "Использование нескольких сред" в ASP.NET Core и 8 способов задания URL-адресов для приложения ASP.NET Core от Эндрю Lock.

Проекты HSTS и API

Проекты API по умолчанию не включают HSTS, так как HSTS обычно является инструкцией только для браузера. Другие клиенты, такие как телефонные или настольные приложения, не подчиняются инструкции. Даже в браузерах один прошедший проверку подлинности вызов API через HTTP имеет риски в небезопасных сетях. Безопасный подход заключается в настройке проектов API только для прослушивания и реагирования по протоколу HTTPS.

Перенаправление HTTP на HTTPS вызывает ERR_INVALID_REDIRECT в предварительном запросе CORS

Запросы к конечной точке, которые выполняются с использованием протокола HTTP и перенаправляются на HTTPS, завершаются ошибкой ERR_INVALID_REDIRECT во время предварительного запроса CORS UseHttpsRedirection.

Проекты API могут отклонять HTTP-запросы, а не использовать UseHttpsRedirection для перенаправления запросов на HTTPS.

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

Рекомендуется использовать рабочие веб-приложения ASP.NET Core:

  • Промежуточный слой перенаправления HTTPS (UseHttpsRedirection) для перенаправления HTTP-запросов на HTTPS.
  • Промежуточное ПО HSTS (UseHsts) для отправки заголовков HTTP Strict Transport Security Protocol (HSTS) клиентам.

Примечание.

Приложения, развернутые в конфигурации обратного прокси-сервера, позволяют прокси-серверу обрабатывать безопасность подключения (HTTPS). Если прокси-сервер также обрабатывает перенаправление HTTPS, нет необходимости использовать ПО промежуточного слоя перенаправления HTTPS. Если прокси-сервер также обрабатывает запись заголовков HSTS (например, встроенная поддержка HSTS в IIS 10.0 (1709) или более поздней версии), ПО промежуточного слоя HSTS не требуется приложению. Дополнительные сведения см. в разделе "Отказ от HTTPS/HSTS" при создании проекта.

UseHttpsRedirection

Следующий код вызывает UseHttpsRedirection в файле Program.cs.

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Предыдущий выделенный код:

Рекомендуется использовать временные перенаправления, а не постоянные перенаправления. Кэширование ссылок может привести к нестабильной работе в средах разработки. Если вы предпочитаете отправлять код состояния постоянного перенаправления, если приложение находится в среде, отличной от разработки, см . раздел "Настройка постоянных перенаправлений в рабочей среде ". Мы рекомендуем использовать HSTS для сигнала клиентам о том, что в приложение должны отправляться только безопасные запросы ресурсов (только в рабочей среде).

Конфигурация порта

Порт должен быть доступен для промежуточного слоя, чтобы перенаправить небезопасный запрос на HTTPS. Если порт недоступен:

  • Перенаправление на HTTPS не происходит.
  • ПО промежуточного слоя записывает предупреждение "Не удалось определить порт https для перенаправления".

Укажите порт HTTPS с помощью любого из следующих подходов:

  • Задайте HttpsRedirectionOptions.HttpsPort.

  • https_port Установите настройку хоста:

    • В конфигурации хоста.

    • Установив переменную среды ASPNETCORE_HTTPS_PORT.

    • Добавив запись верхнего уровня в appsettings.json:

      {
        "https_port": 443,
        "Logging": {
          "LogLevel": {
            "Default": "Information",
            "Microsoft.AspNetCore": "Warning"
          }
        },
        "AllowedHosts": "*"
      }
      
  • Укажите порт с безопасной схемой с помощью переменной среды ASPNETCORE_URLS. Переменная среды конфигурирует сервер. ПО промежуточного слоя косвенно обнаруживает порт HTTPS через IServerAddressesFeature. Этот подход не работает в развертывании обратного прокси-сервера.

  • Веб-шаблоны ASP.NET Core задают HTTPS URL-адрес в Properties/launchsettings.json как для Kestrel, так и для IIS Express. launchsettings.json используется только на локальном компьютере.

  • Настройте конечную точку URL-адреса HTTPS для периферийного общедоступного развертывания Kestrel сервера или сервера HTTP.sys. Приложение использует только один порт HTTPS. ПО промежуточного слоя обнаруживает порт через IServerAddressesFeature.

Примечание.

Когда приложение выполняется в конфигурации обратного прокси-сервера, IServerAddressesFeature недоступно. Задайте порт с помощью одного из других подходов, описанных в этом разделе.

Развертывания периферийные

Если Kestrel или HTTP.sys используется в качестве общедоступного пограничного сервера или Kestrel HTTP.sys необходимо настроить для прослушивания обоих:

  • Безопасный порт, в котором клиент перенаправляется (обычно 443 в рабочей среде и 5001 в разработке).
  • Небезопасный порт (как правило, 80 в продакшене и 5000 в разработке).

Небезопасный порт должен быть доступен клиентом, чтобы приложение получило небезопасный запрос и перенаправляет клиента на безопасный порт.

Дополнительные сведения см. в разделе Kestrel о конфигурации конечной точки или реализации веб-сервера HTTP.sys в ASP.NET Core.

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

Любой брандмауэр между клиентом и сервером также должен иметь порты связи, открытые для трафика.

Если запросы перенаправляются в конфигурации обратного прокси-сервера, используйте Промежуточное программное обеспечение заголовков переадресации перед вызовом ПО перенаправления HTTPS. Промежуточное ПО для перенаправленных заголовков обновляет Request.Scheme с помощью заголовка X-Forwarded-Proto. Промежуточное ПО обеспечивает правильную работу URI перенаправления и других политик безопасности. Если промежуточное ПО заголовков пересылки не используется, серверное приложение может не получать правильную схему и зайти в цикл перенаправления. Обычное сообщение об ошибке конечного пользователя заключается в том, что произошло слишком много перенаправлений.

При развертывании в службе приложений Azure следуйте рекомендациям в руководстве: Привязка существующего пользовательского SSL-сертификата к веб-приложениям Azure.

Параметры

Выделенный код вызывает AddHttpsRedirection для настройки параметров промежуточного программного обеспечения.

using static Microsoft.AspNetCore.Http.StatusCodes;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

builder.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");
});

builder.Services.AddHttpsRedirection(options =>
{
    options.RedirectStatusCode = Status307TemporaryRedirect;
    options.HttpsPort = 5001;
});

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Вызов AddHttpsRedirection необходим только для изменения значений HttpsPort или RedirectStatusCode.

Предыдущий выделенный код:

Настройка постоянных перенаправлений в продакшене

Промежуточное ПО по умолчанию отправляет Status307TemporaryRedirect со всеми перенаправлениями. Если вы предпочитаете отправлять код состояния постоянного перенаправления, когда приложение находится в среде, отличной от разработки, оберните конфигурацию параметров промежуточного слоя в условную проверку на среду, отличную от разработки.

При настройке служб в Program.cs:

using static Microsoft.AspNetCore.Http.StatusCodes;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

if (!builder.Environment.IsDevelopment())
{
    builder.Services.AddHttpsRedirection(options =>
    {
        options.RedirectStatusCode = Status308PermanentRedirect;
        options.HttpsPort = 443;
    });
}

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");

    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Альтернативный подход к промежуточному ПО для перенаправления HTTPS

Альтернативой использованию посредника перенаправления HTTPS является UseHttpsRedirection использование посредника переписывания URL-адресов (AddRedirectToHttps). AddRedirectToHttps также может задать код состояния и порт при выполнении перенаправления. Дополнительные сведения см. в разделе Перезапись URL-адресов с помощью промежуточного программного обеспечения.

При перенаправлении на HTTPS без требования к дополнительным правилам перенаправления рекомендуется использовать ПО промежуточного слоя перенаправления HTTPS(UseHttpsRedirection), описанное в этой статье.

Протокол строгой защиты транспортного уровня HTTP (HSTS)

Для OWASP, HTTP Strict Transport Security (HSTS) — это опциональное улучшение безопасности, указанное веб-приложением с помощью заголовка ответа. Когда браузер, поддерживающий HSTS, получает этот заголовок:

  • Браузер сохраняет конфигурацию для домена, который предотвращает отправку сообщений по протоколу HTTP. Браузер принудительно выполняет обмен данными по протоколу HTTPS.
  • Браузер запрещает пользователю использовать недоверенные или недопустимые сертификаты. Браузер отключает запросы, позволяющие пользователю временно доверять такому сертификату.

Так как HSTS применяется клиентом, он имеет некоторые ограничения:

  • Клиент должен поддерживать HSTS.
  • Для установки политики HSTS требуется по крайней мере один успешный HTTPS-запрос.
  • Приложение должно проверить каждый HTTP-запрос и перенаправить или отклонить HTTP-запрос.

ASP.NET Core реализует HSTS методом расширения UseHsts. Следующий код вызывает UseHsts, когда приложение не находится в режиме разработки:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

UseHsts не рекомендуется в процессе разработки, так как параметры HSTS интенсивно кэшируются браузерами. По умолчанию UseHsts исключает локальный адрес обратного цикла.

Для производственных сред, в которых HTTPS реализуется впервые, установите начальное HstsOptions.MaxAge на небольшое значение, используя один из методов TimeSpan. Установите значение от нескольких часов до не более чем одного дня, если необходимо вернуть инфраструктуру HTTPS на HTTP. После того как вы уверены в устойчивости конфигурации HTTPS, увеличьте значение HSTS max-age ; обычно используемое значение составляет один год.

Следующий выделенный код:

using static Microsoft.AspNetCore.Http.StatusCodes;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

builder.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");
});

builder.Services.AddHttpsRedirection(options =>
{
    options.RedirectStatusCode = Status307TemporaryRedirect;
    options.HttpsPort = 5001;
});

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();
  • Задает параметр предварительной загрузки заголовка Strict-Transport-Security . Предварительная загрузка не является частью спецификации RFC HSTS, но поддерживается веб-браузерами для предварительной загрузки сайтов HSTS на свежей установке. Дополнительные сведения см. в разделе https://hstspreload.org/.
  • Это позволяет включить includeSubDomain, который применяет политику HSTS к поддоменам узла.
  • Явно устанавливает параметр max-age в заголовке Strict-Transport-Security на 60 дней. Если значение не задано, значение по умолчанию — 30 дней. Дополнительные сведения см. в директиве max-age.
  • Добавляет example.com в список узлов, которые нужно исключить.

UseHsts исключает следующие loopback-хосты:

  • localhost : адрес обратного цикла IPv4.
  • 127.0.0.1: адрес обратной связи IPv4.
  • [::1] : адрес обратной связи IPv6.

Отказ от HTTPS/HSTS при создании проекта

В некоторых сценариях серверной службы, где безопасность подключения обрабатывается на общедоступном крае сети, настройка безопасности подключения на каждом узле не требуется. Веб-приложения, созданные из шаблонов в Visual Studio или с помощью команды dotnet new, включают перенаправление HTTPS и HSTS. Для развертываний, которые не требуют этих сценариев, вы можете отказаться от HTTPS/HSTS при создании приложения из шаблона.

Чтобы отказаться от HTTPS/HSTS, выполните приведенные действия.

Снимите флажок "Настройка для HTTPS ".

Диалоговое окно

Доверять сертификату разработки ASP.NET Core HTTPS в Windows и macOS

В браузере Firefox см. следующий раздел.

Пакет SDK для .NET Core включает сертификат разработки HTTPS. Сертификат устанавливается в процессе первого запуска программы. Например, dotnet --info порождает вариант следующего результата.

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. Сертификат установлен, но он не является доверенным. Чтобы доверять сертификату, выполните однократный шаг для запуска dotnet dev-certs средства:

dotnet dev-certs https --trust

Следующая команда предоставляет справочную информацию по инструменту dotnet dev-certs.

dotnet dev-certs https --help

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

Не создавайте сертификат разработки в среде, которая будет распространяться, например образ контейнера или виртуальная машина. Это может привести к спуфингу и повышению привилегий. Чтобы предотвратить это, задайте переменную среды DOTNET_GENERATE_ASPNET_CERTIFICATE на false перед первым вызовом .NET CLI. Это пропустит автоматическое создание сертификата разработки ASP.NET Core во время первого запуска интерфейса командной строки.

Доверяйте сертификату HTTPS с Помощью Firefox, чтобы предотвратить ошибку SEC_ERROR_INADEQUATE_KEY_USAGE

Браузер Firefox использует собственное хранилище сертификатов, поэтому не доверяет сертификатам IIS Express или Kestrel разработчика.

Существует два подхода к доверию сертификату HTTPS в Firefox: создать файл политики или настроить сам браузер Firefox. При настройке с помощью браузера создается файл политики, поэтому два подхода эквивалентны.

Создание файла политики для доверия к сертификату HTTPS с помощью Firefox

Создайте файл политики (policies.jsonпо адресу:

Добавьте следующий код JSON в файл политики Firefox:

{
  "policies": {
    "Certificates": {
      "ImportEnterpriseRoots": true
    }
  }
}

Предыдущий файл политики заставляет Firefox доверять сертификатам из числа доверенных сертификатов в хранилище сертификатов Windows. В следующем разделе представлен альтернативный подход к созданию предыдущего файла политики с помощью браузера Firefox.

Настройка доверия сертификата HTTPS с помощью браузера Firefox

Настройте security.enterprise_roots.enabled = true, используя следующие инструкции:

  1. Введите about:config в браузере FireFox.
  2. Нажмите кнопку "Принять риск" и "Продолжить ", если вы принимаете риск.
  3. Выберите "Показать все"
  4. Задайте значение security.enterprise_roots.enabled = true.
  5. Выход и перезапуск Firefox

Дополнительные сведения см. в разделе "Настройка центров сертификации" в Firefox и mozilla/policy-templates/README-файле.

Настройка сертификата разработчика для Docker

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

Доверять сертификату HTTPS в Linux

Установка доверия зависит от специфики распределения и браузера. В следующих разделах приведены инструкции для некоторых популярных дистрибутивов и браузеров Chromium (Edge и Chrome) и Firefox.

Ubuntu доверяет сертификату для обмена данными между службами

Следующие инструкции не работают для некоторых версий Ubuntu, таких как 20.04. Дополнительные сведения см. в статье о проблеме GitHub dotnet/AspNetCore.Docs #23686.

  1. Установите OpenSSL 1.1.1h или более поздней версии. Инструкции по обновлению OpenSSL см. в дистрибутиве.

  2. Выполните следующие команды:

    dotnet dev-certs https
    sudo -E dotnet dev-certs https -ep /usr/local/share/ca-certificates/aspnet/https.crt --format PEM
    sudo update-ca-certificates
    

Предыдущие команды:

  • Убедитесь, что создается сертификат разработчика текущего пользователя.
  • Экспортирует сертификат с повышенными разрешениями, необходимыми для ca-certificates папки, с помощью среды текущего пользователя.
  • Удаление -E флага экспортирует корневой сертификат пользователя, создав его при необходимости. Каждый созданный сертификат имеет другой отпечаток. При запуске с правами суперпользователя sudo и -E не требуются.

Путь в предыдущей команде предназначен для Ubuntu. Для других дистрибутивов выберите соответствующий путь или используйте путь для центров сертификации (ЦС).

Доверие к сертификату HTTPS в Linux с помощью Edge или Chrome

Для браузеров chromium в Linux:

  • Установите libnss3-tools для вашего дистрибутива.

  • Создайте или убедитесь, что папка $HOME/.pki/nssdb существует на компьютере.

  • Экспортируйте сертификат со следующей командой:

    dotnet dev-certs https
    sudo -E dotnet dev-certs https -ep /usr/local/share/ca-certificates/aspnet/https.crt --format PEM
    

    Путь в предыдущей команде предназначен для Ubuntu. Для других дистрибутивов выберите соответствующий путь или используйте путь для центров сертификации (ЦС).

  • Выполните следующие команды:

    certutil -d sql:$HOME/.pki/nssdb -A -t "P,," -n localhost -i /usr/local/share/ca-certificates/aspnet/https.crt
    
  • Закройте и перезапустите браузер.

Доверие к сертификату с помощью Firefox в Linux

  • Экспортируйте сертификат со следующей командой:

    dotnet dev-certs https
    sudo -E dotnet dev-certs https -ep /usr/local/share/ca-certificates/aspnet/https.crt --format PEM
    

    Путь в предыдущей команде предназначен для Ubuntu. Для других дистрибутивов выберите соответствующий путь или используйте путь для центров сертификации (ЦС).

  • Создайте JSON-файл по адресу /usr/lib/firefox/distribution/policies.json с помощью следующей команды:

cat <<EOF | sudo tee /usr/lib/firefox/distribution/policies.json
{
    "policies": {
        "Certificates": {
            "Install": [
                "/usr/local/share/ca-certificates/aspnet/https.crt"
            ]
        }
    }
}
EOF

Примечание. Firefox для Ubuntu 21.10 предоставляется как пакет Snap, и папка установки — /snap/firefox/current/usr/lib/firefox.

См. статью Настройка доверия сертификата HTTPS с помощью браузера Firefox для альтернативного способа настройки файла политики с помощью браузера.

Доверять сертификату с помощью Fedora 34

См.

Доверять сертификату с другими дистрибутивами

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

Доверять сертификату HTTPS из подсистема Windows для Linux

Следующие инструкции не работают для некоторых дистрибутивов Linux, таких как Ubuntu 20.04. Дополнительные сведения см. в статье о проблеме GitHub dotnet/AspNetCore.Docs #23686.

Подсистема Windows для Linux (WSL) создает самозаверяющий сертификат разработки HTTPS, который по умолчанию не является доверенным в Windows. Самый простой способ доверия Windows к сертификату WSL — настроить WSL для использования того же сертификата, что и Windows:

  • В Windows экспортируйте сертификат разработчика в файл:

    dotnet dev-certs https -ep https.pfx -p $CREDENTIAL_PLACEHOLDER$ --trust
    

    Где $CREDENTIAL_PLACEHOLDER$ находится пароль.

  • В окне WSL импортируйте экспортированный сертификат в экземпляр WSL:

    dotnet dev-certs https --clean --import <<path-to-pfx>> --password $CREDENTIAL_PLACEHOLDER$
    

Представленный подход является однократной операцией для каждого сертификата и каждого дистрибутива WSL. Это проще, чем снова и снова экспортировать сертификат. Если вы обновляете или повторно создаете сертификат в Windows, вам может потребоваться снова выполнить приведенные выше команды.

Диагностика и устранение проблем с сертификатами, таких как сертификат, которому нельзя доверять

В этом разделе содержатся сведения о том, что сертификат разработки ASP.NET Core HTTPS установлен и доверен, но у вас по-прежнему есть предупреждения браузера о том, что сертификат не является доверенным. Сертификат для разработки ASP.NET Core с использованием HTTPS используется Kestrel.

Чтобы восстановить сертификат IIS Express, ознакомьтесь с этой проблемой Stackoverflow .

Все платформы — сертификат не доверенный

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

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

Закройте все открытые экземпляры браузера. Откройте новое окно браузера для приложения. Доверие сертификатов кэшируется браузерами.

dotnet dev-certs https --clean завершается с ошибкой

Приведенные выше команды решают большинство проблем доверия браузера. Если браузер по-прежнему не доверяет сертификату, следуйте приведенным ниже предложениям для конкретной платформы.

Docker — сертификат не доверенный

  • Удалите папку C:\Users{USER}\AppData\Roaming\ASP.NET\Https .
  • Очистите раствор. Удалите папки bin и obj.
  • Перезапустите средство разработки. Например, Visual Studio или Visual Studio Code.

Windows — сертификат не доверенный

  • Проверьте сертификаты в хранилище сертификатов. Должен быть сертификат localhost с дружественным именем ASP.NET Core HTTPS development certificate и под Current User > Personal > Certificates, и под Current User > Trusted root certification authorities > Certificates
  • Удалите все найденные сертификаты как из личного хранилища, так и из доверенного корневого центра сертификации. Не удаляйте сертификат IIS Express localhost.
  • Выполните следующие команды:
dotnet dev-certs https --clean
dotnet dev-certs https --trust

Закройте все открытые экземпляры браузера. Откройте новое окно браузера для приложения.

OS X — сертификат, не доверенный

  • Откройте доступ к цепочке ключей.
  • Выберите цепочку ключей системы.
  • Проверьте наличие сертификата localhost.
  • Убедитесь, что он содержит + символ на значке, чтобы указать, что он является доверенным для всех пользователей.
  • Удалите сертификат из цепочки ключей системы.
  • Выполните следующие команды:
dotnet dev-certs https --clean
dotnet dev-certs https --trust

Закройте все открытые экземпляры браузера. Откройте новое окно браузера для приложения.

Сведения об устранении неполадок с сертификатами в Visual Studio см. в статье об ошибке HTTPS с помощью IIS Express (dotnet/AspNetCore #16892).

Сертификат Linux не является доверенным

Убедитесь, что сертификат, настроенный для доверия, является сертификатом разработчика HTTPS, который будет использоваться сервером Kestrel .

Проверьте сертификат разработчика Kestrel HTTPS по умолчанию для текущего пользователя в следующем расположении:

ls -la ~/.dotnet/corefx/cryptography/x509stores/my

Файл сертификата разработчика Kestrel HTTPS — это отпечаток SHA1. Когда файл удаляется с помощью dotnet dev-certs https --clean, он при необходимости повторно создается с другим отпечатком. Проверьте, совпадает ли отпечаток экспортированного сертификата, с помощью следующей команды:

openssl x509 -noout -fingerprint -sha1 -inform pem -in /usr/local/share/ca-certificates/aspnet/https.crt

Если сертификат не соответствует, он может быть одним из следующих вариантов:

  • Старый сертификат.
  • Экспортирован сертификат разработчика для корневого пользователя. В этом случае экспортируйте сертификат.

Сертификат корневого пользователя можно проверить по адресу:

ls -la /root/.dotnet/corefx/cryptography/x509stores/my

SSL-сертификат IIS Express, используемый в Visual Studio

Чтобы устранить проблемы с сертификатом IIS Express, выберите "Восстановить " в установщике Visual Studio. Дополнительные сведения см. здесь на GitHub.

Групповая политика не позволяет доверять самозаверенным сертификатам

В некоторых случаях групповая политика может предотвратить доверие самозаверяемых сертификатов. Дополнительные сведения см. здесь на GitHub.

Дополнительная информация:

Примечание.

Если вы используете пакет SDK для .NET 9 или более поздней версии, ознакомьтесь с обновленными процедурами Linux в версии .NET 9 этой статьи.

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

Проекты API

Не используйте RequireHttpsAttribute на веб-API, получающих конфиденциальную информацию. RequireHttpsAttribute использует коды состояния HTTP для перенаправления браузеров из HTTP в HTTPS. Клиенты API могут не понимать или подчиняться перенаправлениям из HTTP в HTTPS. Такие клиенты могут отправлять данные по протоколу HTTP. Веб-API должны иметь следующее:

  • Не использовать HTTP для прослушивания.
  • Закройте подключение с кодом состояния 400 (недопустимый запрос) и не обслуживайте запрос.

Чтобы отключить перенаправление HTTP в API, задайте ASPNETCORE_URLS переменную среды или используйте флаг командной --urls строки. Дополнительные сведения см. в разделе "Использование нескольких сред" в ASP.NET Core и 8 способов задания URL-адресов для приложения ASP.NET Core от Эндрю Lock.

Проекты HSTS и API

Проекты API по умолчанию не включают HSTS, так как HSTS обычно является инструкцией только для браузера. Другие абоненты, такие как телефонные или классические приложения, не подчиняются инструкции. Даже в браузерах один прошедший проверку подлинности вызов API через HTTP имеет риски в небезопасных сетях. Безопасный подход заключается в настройке проектов API только для прослушивания и реагирования по протоколу HTTPS.

Перенаправление HTTP на HTTPS вызывает ошибку ERR_INVALID_REDIRECT в предварительном запросе в CORS.

Запросы к конечной точке с помощью HTTP, перенаправленных на HTTPS, UseHttpsRedirection завершаются ошибкой ERR_INVALID_REDIRECT в предварительном запросе CORS.

Проекты API могут отклонять HTTP-запросы, а не использовать UseHttpsRedirection для перенаправления запросов на HTTPS.

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

Рекомендуется использовать рабочие веб-приложения ASP.NET Core:

  • Промежуточное ПО перенаправления HTTPS (UseHttpsRedirection) для перенаправления HTTP-запросов на HTTPS.
  • Промежуточное программное обеспечение HSTS (UseHsts) для отправки клиентам заголовков HTTP Strict Transport Security Protocol (HSTS).

Примечание.

Приложения, развернутые в конфигурации обратного прокси-сервера, позволяют прокси-серверу обрабатывать безопасность подключения (HTTPS). Если прокси-сервер также обрабатывает перенаправление HTTPS, нет необходимости использовать ПО промежуточного слоя перенаправления HTTPS. Если прокси-сервер также обрабатывает запись заголовков HSTS (например, встроенная поддержка HSTS в IIS 10.0 (1709) или более поздней версии), ПО промежуточного слоя HSTS не требуется приложению. Дополнительные сведения см. в разделе "Отказ от HTTPS/HSTS" при создании проекта.

Использовать перенаправление HTTPS (UseHttpsRedirection)

Следующий код вызывает UseHttpsRedirection в Program.cs файле:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Предыдущий выделенный код:

Рекомендуется использовать временные перенаправления, а не постоянные перенаправления. Кэширование ссылок может привести к нестабильной работе в средах разработки. Если вы предпочитаете отправлять код состояния постоянного перенаправления, если приложение находится в среде, отличной от разработки, см . раздел "Настройка постоянных перенаправлений в рабочей среде ". Мы рекомендуем использовать HSTS для сигнала клиентам о том, что в приложение должны отправляться только безопасные запросы ресурсов (только в рабочей среде).

Конфигурация порта

Порт должен быть доступен для промежуточного ПО, чтобы перенаправлять небезопасные запросы на HTTPS. Если порт недоступен:

  • Перенаправление на HTTPS не происходит.
  • ПО промежуточного слоя записывает предупреждение "Не удалось определить порт https для перенаправления".

Укажите порт HTTPS с помощью любого из следующих подходов:

  • Задайте HttpsRedirectionOptions.HttpsPort.

  • https_port Задайте настройку узла:

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

    • Установив переменную среды ASPNETCORE_HTTPS_PORT.

    • Добавив запись верхнего уровня в appsettings.json:

      {
        "https_port": 443,
        "Logging": {
          "LogLevel": {
            "Default": "Information",
            "Microsoft.AspNetCore": "Warning"
          }
        },
        "AllowedHosts": "*"
      }
      
  • Укажите порт с безопасной схемой с помощью переменной среды ASPNETCORE_URLS. Переменная среды настраивает сервер. ПО промежуточного слоя косвенно обнаруживает порт HTTPS через IServerAddressesFeature. Этот подход не работает в развертывании обратного прокси-сервера.

  • Веб-шаблоны ASP.NET Core устанавливают HTTPS URL-адрес в Properties/launchsettings.json как для Kestrel, так и для IIS Express. launchsettings.json используется только на локальном компьютере.

  • Настройте конечную точку URL-адреса HTTPS для развертывания сервера на границе сети или сервера HTTP.sys. Приложение использует только один порт HTTPS. ПО промежуточного слоя обнаруживает порт через IServerAddressesFeature.

Примечание.

Когда приложение выполняется в конфигурации обратного прокси-сервера, IServerAddressesFeature недоступно. Задайте порт с помощью одного из других подходов, описанных в этом разделе.

Развертывания Edge

Если Kestrel или HTTP.sys используется в качестве общедоступного пограничного сервера, то Kestrel или HTTP.sys необходимо настроить для прослушивания обоих вариантов:

  • Безопасный порт, в котором клиент перенаправляется (обычно 443 в рабочей среде и 5001 в разработке).
  • Небезопасный порт (как правило, 80 в рабочей среде и 5000 в разработке).

Небезопасный порт должен быть доступен клиентом, чтобы приложение получило небезопасный запрос и перенаправляет клиента на безопасный порт.

Дополнительные сведения см. в разделе Kestrel о конфигурации конечной точки или реализации веб-сервера HTTP.sys в ASP.NET Core.

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

Любой брандмауэр между клиентом и сервером также должен иметь порты связи, открытые для трафика.

Если запросы перенаправляются в конфигурации обратного прокси-сервера, используйте посредник с заголовками перенаправления перед вызовом ПО промежуточного слоя перенаправления HTTPS. Промежуточное ПО заголовков пересылки обновляет Request.Scheme, используя заголовок X-Forwarded-Proto. Промежуточное ПО обеспечивает корректную работу URI перенаправления и других политик безопасности. Если промежуточное ПО перенаправленных заголовков не используется, серверное приложение может не получить правильную схему и оказаться в цикле перенаправления. Обычное сообщение об ошибке конечного пользователя заключается в том, что произошло слишком много перенаправлений.

При развертывании в службе приложений Azure следуйте инструкциям в руководстве "Привязка существующего пользовательского SSL-сертификата к веб-приложениям Azure".

Настройки

В следующем выделенном коде вызывается AddHttpsRedirection для настройки параметров промежуточного ПО:

using static Microsoft.AspNetCore.Http.StatusCodes;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

builder.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");
});

builder.Services.AddHttpsRedirection(options =>
{
    options.RedirectStatusCode = Status307TemporaryRedirect;
    options.HttpsPort = 5001;
});

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Вызов AddHttpsRedirection необходим только для изменения значений HttpsPort или RedirectStatusCode.

Предыдущий выделенный код:

Настройка постоянных перенаправлений в продуктивной среде

Промежуточное ПО по умолчанию отправляет Status307TemporaryRedirect при всех перенаправлениях. Если вы предпочитаете отправлять код состояния постоянного перенаправления, когда приложение находится в среде, отличной от разработки, оберните конфигурацию параметров промежуточного слоя условной проверкой на предмет неиспользования среды разработки.

При настройке служб в Program.cs:

using static Microsoft.AspNetCore.Http.StatusCodes;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

if (!builder.Environment.IsDevelopment())
{
    builder.Services.AddHttpsRedirection(options =>
    {
        options.RedirectStatusCode = Status308PermanentRedirect;
        options.HttpsPort = 443;
    });
}

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");

    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Альтернативный подход к промежуточному ПО для перенаправления HTTPS

Альтернативой использованию ПО промежуточного слоя перенаправления HTTPS является использование ПО промежуточного слоя переопределения URL-адресов (AddRedirectToHttps). AddRedirectToHttps также может задать код состояния и порт при выполнении перенаправления. Дополнительные сведения см. в разделе «Промежуточное ПО для перезаписи URL-адресов».

При перенаправлении на HTTPS без требования к дополнительным правилам перенаправления рекомендуется использовать ПО промежуточного слоя перенаправления HTTPS(UseHttpsRedirection), описанное в этой статье.

Механизм строгой транспортной защиты HTTP (HSTS)

По данным OWASP, HTTP Strict Transport Security (HSTS) — это опциональное улучшение безопасности, которое указывается веб-приложением с помощью заголовка ответа. Когда браузер, поддерживающий HSTS, получает этот заголовок:

  • Браузер сохраняет конфигурацию для домена, который предотвращает отправку сообщений по протоколу HTTP. Браузер принудительно выполняет обмен данными по протоколу HTTPS.
  • Браузер запрещает пользователю использовать недоверенные или недопустимые сертификаты. Браузер отключает запросы, позволяющие пользователю временно доверять такому сертификату.

Так как HSTS применяется клиентом, он имеет некоторые ограничения:

  • Клиент должен поддерживать HSTS.
  • Для установки политики HSTS требуется по крайней мере один успешный HTTPS-запрос.
  • Приложение должно проверить каждый HTTP-запрос и перенаправить или отклонить HTTP-запрос.

ASP.NET Core реализует HSTS с UseHsts помощью метода расширения. Следующий код вызывает UseHsts, когда приложение не находится в режиме разработки:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

UseHsts не рекомендуется использовать в процессе разработки, так как параметры HSTS сильно кэшируются браузерами. По умолчанию UseHsts исключает локальный адрес обратного цикла.

Для рабочих сред, реализующих протокол HTTPS в первый раз, задайте начальное HstsOptions.MaxAge значение небольшого размера, используя один из TimeSpan методов. Установите значение в пределах от нескольких часов до не более чем одного дня, если необходимо вернуть инфраструктуру HTTPS на HTTP. После того как вы уверены в устойчивости конфигурации HTTPS, увеличьте значение HSTS max-age ; обычно используемое значение составляет один год.

Следующий выделенный код:

using static Microsoft.AspNetCore.Http.StatusCodes;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

builder.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");
});

builder.Services.AddHttpsRedirection(options =>
{
    options.RedirectStatusCode = Status307TemporaryRedirect;
    options.HttpsPort = 5001;
});

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();
  • Задает параметр предварительной загрузки заголовка Strict-Transport-Security . Предварительная загрузка не является частью спецификации RFC HSTS, но поддерживается веб-браузерами для предварительной загрузки сайтов HSTS на свежей установке. Дополнительные сведения см. в разделе https://hstspreload.org/.
  • Включает параметр includeSubDomain, который применяет политику HSTS к поддоменам хоста.
  • Явно задает параметр max-age в заголовке Strict-Transport-Security на 60 дней. Если значение не задано, значение по умолчанию — 30 дней. Дополнительные сведения см. в директиве max-age.
  • Добавляет example.com в список узлов, которые нужно исключить.

UseHsts исключает следующие узлы обратной связи:

  • localhost : адрес обратной связи IPv4.
  • 127.0.0.1 : адрес обратной связи IPv4.
  • [::1] : адрес обратного цикла IPv6.

Отказ от HTTPS/HSTS при создании проекта

В некоторых сценариях серверной службы, где безопасность подключения обрабатывается на общедоступном крае сети, настройка безопасности подключения на каждом узле не требуется. Веб-приложения, созданные из шаблонов в Visual Studio или из команды dotnet new, включают перенаправление HTTPS и HSTS. Для развертываний, которые не требуют этих сценариев, вы можете отказаться от HTTPS/HSTS при создании приложения из шаблона.

Чтобы отказаться от HTTPS/HSTS, выполните приведенные действия.

Снимите флажок "Настройка для HTTPS ".

Диалоговое окно

Доверять сертификату разработки ASP.NET Core HTTPS в Windows и macOS

В браузере Firefox см. следующий раздел.

Пакет SDK для .NET Core включает сертификат разработки HTTPS. Сертификат устанавливается в рамках первого использования программы. Например, dotnet --info генерирует вариант следующего выходного результата:

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. Сертификат установлен, но он не является доверенным. Чтобы доверять сертификату, выполните однократный шаг для запуска dotnet dev-certs средства:

dotnet dev-certs https --trust

Следующая команда вызывает справку по инструменту dotnet dev-certs.

dotnet dev-certs https --help

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

Не создавайте сертификат разработки в среде, которая будет распространяться, например образ контейнера или виртуальная машина. Это может привести к спуфингу и повышению привилегий. Чтобы предотвратить это, установите переменную среды DOTNET_GENERATE_ASPNET_CERTIFICATE в false перед вызовом .NET CLI в первый раз. Это пропустит автоматическое создание сертификата разработки ASP.NET Core во время первого запуска интерфейса командной строки.

Доверяйте HTTPS-сертификату в Firefox, чтобы предотвратить ошибку SEC_ERROR_INADEQUATE_KEY_USAGE

Браузер Firefox использует собственное хранилище сертификатов, поэтому не доверяет сертификатам IIS Express или Kestrel разработчика.

Существует два подхода к тому, чтобы доверять сертификату HTTPS в Firefox: создать файл политики или настроить в браузере Firefox. При настройке с помощью браузера создается файл политики, поэтому два подхода эквивалентны.

Создание файла политики для доверия к сертификату HTTPS с помощью Firefox

Создайте файл политики (policies.jsonпо адресу:

Добавьте следующий код JSON в файл политики Firefox:

{
  "policies": {
    "Certificates": {
      "ImportEnterpriseRoots": true
    }
  }
}

Предыдущий файл политики делает сертификаты доверия Firefox из доверенных сертификатов в хранилище сертификатов Windows. В следующем разделе представлен альтернативный подход к созданию предыдущего файла политики с помощью браузера Firefox.

Настройка доверия сертификата HTTPS с помощью браузера Firefox

Установите security.enterprise_roots.enabled = true, используя следующие инструкции:

  1. Введите about:config в браузере FireFox.
  2. Нажмите кнопку "Принять риск" и "Продолжить ", если вы принимаете риск.
  3. Выберите "Показать все"
  4. Задайте значение security.enterprise_roots.enabled = true.
  5. Выход и перезапуск Firefox

Дополнительные сведения см. в разделе "Настройка центров сертификации" в Firefox и mozilla/policy-templates/README-файле.

Настройка сертификата разработчика для Docker

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

Доверять сертификату HTTPS в Linux

Установка доверия зависит от распределения и специфики браузера. В следующих разделах приведены инструкции для некоторых популярных дистрибутивов и браузеров Chromium (Edge и Chrome) и Firefox.

Доверять сертификату HTTPS в Linux с помощью сертификатов linux-dev-certs

Linux-dev-certs — это глобальное средство с открытым кодом, поддерживаемое сообществом, .NET, которое предоставляет удобный способ создания и доверия сертификату разработчика в Linux. Средство не поддерживается и не обслуживается корпорацией Майкрософт.

Следующие команды устанавливают средство и создают доверенный сертификат разработчика:

dotnet tool update -g linux-dev-certs
dotnet linux-dev-certs install

Для получения дополнительной информации или сообщения о проблемах см. репозиторий linux-dev-certs на GitHub.

Ubuntu доверяет сертификату для обмена данными между службами

Следующие инструкции не работают для некоторых версий Ubuntu, таких как 20.04. Дополнительные сведения см. в статье о проблеме GitHub dotnet/AspNetCore.Docs #23686.

  1. Установите OpenSSL 1.1.1h или более поздней версии. Инструкции по обновлению OpenSSL см. в дистрибутиве.

  2. Выполните следующие команды:

    dotnet dev-certs https
    sudo -E dotnet dev-certs https -ep /usr/local/share/ca-certificates/aspnet/https.crt --format PEM
    sudo update-ca-certificates
    

Предыдущие команды:

  • Убедитесь, что создается сертификат разработчика текущего пользователя.
  • Экспортирует сертификат с повышенными разрешениями, необходимыми для ca-certificates папки, с помощью среды текущего пользователя.
  • Удаление -E флага экспортирует корневой сертификат пользователя, создав его при необходимости. Каждый созданный сертификат имеет другой отпечаток. При выполнении в качестве корневого каталога sudo и -E не требуется.

Путь в предыдущей команде предназначен для Ubuntu. Для других дистрибутивов выберите соответствующий путь или используйте путь для центров сертификации (ЦС).

Доверие к сертификату HTTPS в Linux с помощью Edge или Chrome

Для браузеров chromium в Linux:

  • Установите libnss3-tools для вашего дистрибутива.

  • Создайте или убедитесь, что папка $HOME/.pki/nssdb существует на компьютере.

  • Экспортируйте сертификат со следующей командой:

    dotnet dev-certs https
    sudo -E dotnet dev-certs https -ep /usr/local/share/ca-certificates/aspnet/https.crt --format PEM
    

    Путь в предыдущей команде предназначен для Ubuntu. Для других дистрибутивов выберите соответствующий путь или используйте путь для центров сертификации (ЦС).

  • Выполните следующие команды:

    certutil -d sql:$HOME/.pki/nssdb -A -t "P,," -n localhost -i /usr/local/share/ca-certificates/aspnet/https.crt
    
  • Закройте и перезапустите браузер.

Доверие к сертификату с помощью Firefox в Linux

  • Экспортируйте сертификат со следующей командой:

    dotnet dev-certs https
    sudo -E dotnet dev-certs https -ep /usr/local/share/ca-certificates/aspnet/https.crt --format PEM
    

    Путь в предыдущей команде предназначен для Ubuntu. Для других дистрибутивов выберите соответствующий путь или используйте путь для центров сертификации (ЦС).

  • Создайте JSON-файл /usr/lib/firefox/distribution/policies.json с помощью следующей команды:

cat <<EOF | sudo tee /usr/lib/firefox/distribution/policies.json
{
    "policies": {
        "Certificates": {
            "Install": [
                "/usr/local/share/ca-certificates/aspnet/https.crt"
            ]
        }
    }
}
EOF

Примечание. В Ubuntu 21.10 Firefox поставляется в виде snap-пакета, и папка установки — /snap/firefox/current/usr/lib/firefox.

См. инструкцию по настройке доверия сертификату HTTPS, используя браузер Firefox в этой статье о другом способе настройки файла политики с помощью браузера.

Доверять сертификату с помощью Fedora 34

См.

Доверие сертификату на других дистрибутивах

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

Доверять сертификату HTTPS из подсистема Windows для Linux

Следующие инструкции не работают для некоторых дистрибутивов Linux, таких как Ubuntu 20.04. Дополнительные сведения см. в статье о проблеме GitHub dotnet/AspNetCore.Docs #23686.

Подсистема Windows для Linux (WSL) создает самозаверяющий сертификат разработки HTTPS, который по умолчанию не является доверенным в Windows. Самый простой способ доверия Windows к сертификату WSL — настроить WSL для использования того же сертификата, что и Windows:

  • В Windows экспортируйте сертификат разработчика в файл:

    dotnet dev-certs https -ep https.pfx -p $CREDENTIAL_PLACEHOLDER$ --trust
    

    Где $CREDENTIAL_PLACEHOLDER$ находится пароль.

  • В окне WSL импортируйте экспортированный сертификат в экземпляре WSL.

    dotnet dev-certs https --clean --import <<path-to-pfx>> --password $CREDENTIAL_PLACEHOLDER$
    

Предыдущий подход — это однократная операция для каждого сертификата и дистрибутива WSL. Это проще, чем экспортировать сертификат снова и снова. Если вы обновляете или повторно создаете сертификат в Windows, вам может потребоваться снова выполнить приведенные выше команды.

Устранение проблем с сертификатами, таких как ненадежный сертификат

В этом разделе содержатся сведения о том, что сертификат разработки ASP.NET Core HTTPS установлен и доверен, но у вас по-прежнему есть предупреждения браузера о том, что сертификат не является доверенным. Сертификат разработки HTTPS для ASP.NET Core используется Kestrel.

Чтобы восстановить сертификат IIS Express, ознакомьтесь с этой проблемой Stackoverflow .

Все платформы — сертификат не доверенный

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

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

Закройте все открытые экземпляры браузера. Откройте новое окно браузера для приложения. Доверие сертификатов кэшируется браузерами.

dotnet dev-certs https --clean завершается сбоем

Приведенные выше команды решают большинство проблем доверия браузера. Если браузер по-прежнему не доверяет сертификату, следуйте приведенным ниже предложениям для конкретной платформы.

Docker — сертификат не доверенный

  • Удалите папку C:\Users{USER}\AppData\Roaming\ASP.NET\Https .
  • Очистите решение. Удалите папки bin и obj.
  • Перезапустите средство разработки. Например, Visual Studio или Visual Studio Code.

Windows — сертификат не доверенный

  • Проверьте сертификаты в хранилище сертификатов. Должен быть localhost сертификат с понятным именем как ASP.NET Core HTTPS development certificate под Current User > Personal > Certificates , так и Current User > Trusted root certification authorities > Certificates
  • Удалите все найденные сертификаты из персональных и доверенных корневых удостоверяющих центров. Не удаляйте сертификат IIS Express localhost.
  • Выполните следующие команды:
dotnet dev-certs https --clean
dotnet dev-certs https --trust

Закройте все открытые экземпляры браузера. Откройте новое окно браузера для приложения.

OS X — сертификат, не доверенный

  • Откройте доступ к цепочке ключей.
  • Выберите цепочку ключей системы.
  • Проверьте наличие сертификата localhost.
  • Убедитесь, что он содержит + символ на значке, чтобы указать, что он является доверенным для всех пользователей.
  • Удалите сертификат из цепочки ключей системы.
  • Выполните следующие команды:
dotnet dev-certs https --clean
dotnet dev-certs https --trust

Закройте все открытые экземпляры браузера. Откройте новое окно браузера для приложения.

Сведения об устранении неполадок с сертификатами в Visual Studio см. в статье об ошибке HTTPS с помощью IIS Express (dotnet/AspNetCore #16892).

Сертификат Linux не является доверенным

Убедитесь, что сертификат, настроенный для доверия, является сертификатом разработчика HTTPS, который будет использоваться сервером Kestrel .

Проверьте сертификат разработчика Kestrel HTTPS по умолчанию для текущего пользователя в следующем расположении:

ls -la ~/.dotnet/corefx/cryptography/x509stores/my

Файл сертификата разработчика Kestrel HTTPS — это отпечаток SHA1. Когда файл удаляется с помощью dotnet dev-certs https --clean, он создается заново при необходимости с другим отпечатком. Проверьте, совпадает ли отпечаток экспортированного сертификата с помощью следующей команды:

openssl x509 -noout -fingerprint -sha1 -inform pem -in /usr/local/share/ca-certificates/aspnet/https.crt

Если сертификат не соответствует, он может быть одним из следующих вариантов:

  • Старый сертификат.
  • Был экспортирован сертификат разработчика для корневого пользователя. В этом случае экспортируйте сертификат.

Сертификат корневого пользователя можно проверить по адресу:

ls -la /root/.dotnet/corefx/cryptography/x509stores/my

SSL-сертификат IIS Express, используемый в Visual Studio

Чтобы устранить проблемы с сертификатом IIS Express, выберите "Восстановить " в установщике Visual Studio. Дополнительные сведения см. здесь на GitHub.

Групповая политика не позволяет доверять самозаверяющим сертификатам.

В некоторых случаях групповая политика может предотвратить доверие самозаверяемых сертификатов. Дополнительные сведения см. здесь на GitHub.

Дополнительная информация: