Проблемы с запуском / настройкой консольного приложения (ASP.net core 2.1, Kestrel) с публичным сертификатом на веб-сервере Windows
В прошлом я разрабатывал различные веб-сервисы (приложения VB ASP.net web-api) с использованием https для производства. Я выполнил разработку с помощью http, а затем настроил https на производственных серверах. Чтобы настроить порт на производственном сервере для https и сертификата, у меня есть:
- Импортировал публичный сертификат в хранилище сертификатов на сервере Windows, настроил определенный порт для https с помощью netsh. Например:
netsh http add urlacl url = https://+:22224/ user = all
- привязать сертификат (по отпечатку пальца) к порту. Например:
netsh http add sslcert ipport = 0.0.0.0: 22224 certhash = 31cf73308a768100d4d32fe6e77638593e68ab57 appid = {a33a711f-c587-44e5-96bc-dca8a7f3fc3c}
- Настройте приложение для прослушивания определенного порта, посредством чего я прочитал 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 г.):
Этот вопрос Stackru: настройка ASP.NET Core 2.0 Kestrel для HTTPS
Это полезная статья, в которой рассказывается о создании сертификата, доверии к нему на разных компьютерах и настройке.Net Project (v2.0).
Что я в основном сделал:
- Сохраните сертификат (в этом примере для разработки на локальном хосте) в папке сертификатов:
- 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
- запустите cmd
- войти в благодарность
dotnet dev-certs https --clean
- наконец введите команду
dotnet dev-certs https -t
- получить сообщение "Сертификат разработчика HTTPS был успешно сгенерирован".
- запустить основной проект.net
Для среды разработки я использую ниже appsettings.json
Здесь я не использую https, я использовал http.
{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*",
"Kestrel": {
"EndPoints": {
"http": { "Url": "http://localhost:5000" }
}
}
}