Проблемы с запуском / настройкой консольного приложения (ASP.net core 2.1, Kestrel) с публичным сертификатом на веб-сервере Windows

В прошлом я разрабатывал различные веб-сервисы (приложения VB ASP.net web-api) с использованием https для производства. Я выполнил разработку с помощью http, а затем настроил https на производственных серверах. Чтобы настроить порт на производственном сервере для https и сертификата, у меня есть:

  1. Импортировал публичный сертификат в хранилище сертификатов на сервере Windows, настроил определенный порт для https с помощью netsh. Например:

netsh http add urlacl url = https://+:22224/ user = all

  1. привязать сертификат (по отпечатку пальца) к порту. Например:

netsh http add sslcert ipport = 0.0.0.0: 22224 certhash = 31cf73308a768100d4d32fe6e77638593e68ab57 appid = {a33a711f-c587-44e5-96bc-dca8a7f3fc3c}

  1. Настройте приложение для прослушивания определенного порта, посредством чего я прочитал URL-адрес из файла конфигурации при запуске - например, https://IP:Port и применил его к (vb.net) HttpSelfHostConfiguration()

Это работает без проблем, и я могу настроить приложения так, как мне нужно (например, настроить порт в файле конфигурации для http для выполнения тестов на сервере интрасети, настроить другой порт в файле конфигурации для производственной среды с помощью https).

Теперь я хочу сделать то же самое с приложением asp.net core 2.1.6, и похоже, что оно работает не так.
Общий сертификат (comodo) устанавливается в хранилище сертификатов веб-сервера Windows.
Порт 22224 настроен с netsh для https.
Сертификат привязан к порту с помощью netsh (сертификат отображается правильно с помощью netsh http show sslcert ipport=0.0.0.0:22224
В Program.cs я добавляю порт для прослушивания с помощью UseUrls:

 public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>() //;
            .UseUrls(GV.cURL, "http://localhost:5000"); 
    }

где GV.curl содержит https://ip:22224/ во время выполнения

Приложение работает нормально (через Интернет), если я настрою его на http- порт (например, http://ip:22222/).
Если я установлю (настроенный) порт https ( https://ip:22224/), приложение не запустится и выдаст сообщение об ошибке:
Невозможно настроить конечную точку HTTPS. Не указан сертификат сервера, и сертификат разработчика по умолчанию не найден.

Информация, которую я обнаружил в Интернете, сбивает с толку, и кажется, что эта тема является "движущейся целью" (часто меняются базовая обработка ядра asp.net xx).
Мои выводы на данный момент:
В сообщении об ошибке указано " Сертификат сервера не указан " указывает, что сертификат должен быть настроен в приложении?

Я нашел пример для указания сертификата в CreateWebHostBuilder с параметрами.useKestrel:

.UseKestrel(options =>
        {
            options.Listen(IPAddress.Loopback, 5000);
            options.Listen(IPAddress.Loopback, 5001, listenOptions =>
            {
                listenOptions.UseHttps("certificate.pfx", "topsecret");
            });

Примечание: в моем случае мне придется изменить 5001 на 22224.

Вопросы:

  • Действительно ли мне нужно настроить (уже привязанный к порту) публичный сертификат также в приложении asp.net core 2.1?

  • Если да, каков наилучший способ сделать это (хороший пример, приведенный выше)?

1 ответ

После многих проб и ошибок я нашел соответствующую информацию, которая работает для меня.
Примечание: я работаю с ASP.net core 2.1.6 (если вы работаете со старой версией, это может не сработать для вас...

Вам не нужно делать какие-либо настройки с netsh, но вы должны настроить сертификат (включая пароль).
Вам далее не нужно менять program.cs...
Конфигурации могут быть полностью выполнены в appsettings.json (включен в корень проекта)
Итак... в проекте (отладка на моем компьютере) я работаю со стандартным appsettings.json (с http):

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*"
}

На сервере интрасети я использую другой appsettings.json (все еще с http):

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*"
,
    "Kestrel": {
      "EndPoints": {
        "Http1": { "Url": "http://localhost:5000" },
        "Http2": { "Url": "http://172.16.1.120:22222" }
        }
      }
    }

Таким образом, приложение может быть протестировано в локальной сети через IP-адрес сервера интрасети, а также непосредственно на сервере интрасети (порт локального хоста 5000).

На интернет- сервере я использую другой appsettings.json (для локального хоста с http, для IP-адреса сервера с https и certficate):

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*"
,
    "Kestrel": {
        "EndPoints": {
            "Http": {
                "Url": "http://localhost:5000"
            },
            "HttpsInlineCertFile": {
                "Url": "https://192.168.3.3:22224",
                "Certificate": {
                    "Path": "./certificate.pfx",
                    "Password": "NotReally",
                    "AllowInvalid": "true"
                }
            }
        }
    }
}

Таким образом, приложение можно протестировать с помощью http непосредственно на сервере интрасети, а также с помощью https и сертификата через Интернет.

Погрузочно - разгрузочные работы:
На серверах у меня есть корневой каталог для приложения.
Прямо под корнем я сохранил копии разных файлов "на машину" (включая appsettings.json)
Чтобы опубликовать новую версию, я публикую на своем компьютере разработчика, а затем скопирую каталог \publish\ на серверы (в корневом каталоге) и перезаписываю сохраненные файлы.
Чтобы иметь правильную конфигурацию, я создал простой .cmd, который копирует (специфичные для сервера) файлы конфигурации из корневого каталога в подкаталог \publish\, который я запускаю после новой публикации...

Примечания к https и сертификату:
Сертификат должен храниться в папке \publish\.
Поскольку (мой) общедоступный сертификат contoso защищает несколько доменов, https работает правильно, только если приложение вызывается через домен (в противном случае показываются полезные "незащищенные" сообщения).
Чтобы протестировать приложение с помощью https, я открыл порт 22224 на окнах и "настоящий" брандмауэр.
DNS указывает на публичный IP нашего интернет-сервера.
Для тестирования я звоню в приложение с https://www.domain.xx:22224/

И... это работает...

Я использую Dockerized для моего ASP.Net Core App v2.2 и использовал следующие руководства для его работы (это должно работать с v2.1, январь 2017 г.):

Что я в основном сделал:

  • Сохраните сертификат (в этом примере для разработки на локальном хосте) в папке сертификатов:
  • appsettings.json:
    "Kestrel": {
      "applicationUrl": "https://localhost:5051;http://localhost:5050",
      "Certificates": {
        "Default": {
          "Path": "certificates/localhost.pfx",
          "Password": "MySecret",
          "AllowInvalid": "true"
        }
      }
    }
  • Установите URL приложения
    • через launchsettings.json (только локальная разработка)
    "kamapp-backend": {
      "commandName": "Project",
      "launchBrowser": true,
      "applicationUrl": "https://localhost:5051;http://localhost:5050",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
  • через среду ASPNETCORE_URLS="http://+:5050;https://+:5051" например ASPNETCORE_URLS="http://+:5050;https://+:5051" dotnet run

    • Вам не нужно кодировать какие-либо настройки, просто используйте файлы конфигурации.

Принудительное HTTPS: app.UseHsts(); в вашем Startup.cs

Это также, кажется, работает без "AllowInvalid": "true" но пока не понимаю почему. Может быть, кто-то может ответить.

Я решаю эту проблему, просто запускаю два комментария в cmd

  1. запустите cmd
  2. войти в благодарность dotnet dev-certs https --clean
  3. наконец введите команду dotnet dev-certs https -t
  4. получить сообщение "Сертификат разработчика HTTPS был успешно сгенерирован".
  5. запустить основной проект.net

Для среды разработки я использую ниже appsettings.json

Здесь я не использую https, я использовал http.

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*",
  "Kestrel": {
    "EndPoints": {
      "http": { "Url": "http://localhost:5000" }
    }
  }
}
Другие вопросы по тегам