Не удалось установить SSL-соединение между WebApp и WebApi (Asp Core 3.1) - PullRequest
1 голос
/ 26 мая 2020

Я написал веб-приложение ASP. NET Core 3.1 MVC. Это интерфейс, вызывающий серверную часть веб-API.

Приложение отлично работает при разработке и постановке.

Я не могу заставить его работать в производственной среде: веб-API выглядит нормально, я могу вызовите его из браузера или почтальона.

Но я не могу связаться с ним из своего веб-приложения. Это ошибка из журнала при попытке выполнить вызов:

информация: System. Net .Http.HttpClient.IApiClient.ClientHandler [100]
Отправка HTTP-запроса GET https://webapi. ****. It / inetApi / api / links

сбой: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware [1]

Произошло необработанное исключение при выполнении запроса.

System. Net .Http.HttpRequestException: не удалось установить SSL-соединение, см. внутреннее исключение.

System.IO.IOException: невозможно прочитать данные из транспортное соединение: существующее соединение было принудительно закрыто удаленным хостом ..

System. Net .Sockets.SocketException (10054): существующее соединение было принудительно закрыто удаленным хостом.

--- Конец внутренней трассировки стека исключений ---

Обе машины для промежуточной обработки и производства - это Windows машины server 2019 с веб-сервером IIS10. где и веб-API, и веб-приложение запускается как приложения:

Web-t.****.it/inetApi
Web-t.****.it/inetW

Производственная виртуальная машина имеет два веб-сайта, один должен быть для внутренних веб-приложений, а другой - для API:

webapi.****.it/inetApi
intranet.****.it/inetW

Мы создали эту виртуальную машину из царапина, она новая, на ней нет других приложений или веб-сайтов.

Я уже пытался переместить приложение веб-API на тот же веб-сайт веб-приложения, чтобы проверить, может ли это быть проблемой, но это не так.

Я пытался заставить веб-приложение использовать TLS в качестве протокола безопасности, используя это в моем startup.cs:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

Но это только меняет ошибку:

информация: System. Net .Http.HttpClient.IApiClient.ClientHandler [100]
Отправка HTTP-запроса GET https://webapi. ****. It / inetApi / api / links

сбой: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware [1]

Произошло необработанное исключение при выполнении запроса.

Система. Net .Http.HttpRequestException: произошла ошибка при отправке запроса.

Sys tem. Net .Http.WinHttpException (80072EFF, 12030): ошибка 12030 при вызове WINHTTP_CALLBACK_STATUS_REQUEST_ERROR, «Соединение с сервером было аварийно прервано».

в System.Threading.Tasks.RendezvousAwaesult ( )
в системе. Net .Http.WinHttpHandler.StartRequestAsyn c (состояние WinHttpRequestState)
--- Конец трассировки стека внутреннего исключения ---

Итак, я попробовал для вызова производственного веб-API из веб-приложения при постановке или разработке, и он работает.

Затем я попытался использовать веб-приложение на производстве с промежуточным веб-API ... и оно тоже работает!

Это сводит меня с ума.

Как будто все в продакшене работает индивидуально, но не вместе.

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

Есть идеи?

1 Ответ

1 голос
/ 27 мая 2020

Согласно Рекомендациям по безопасности транспорта, по возможности не указывать версию SSL при установке SSL-соединения. Просто позвольте ОС выбрать версию протокола SSL.
https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls
Возможно, что-то не так с процессом проверки сертификата SSL, установленного на стороне сервера. Как вы знаете, для связи SSL требуются доверительные отношения между клиентской и серверной сторонами, поэтому я хотел бы знать, как вы указываете сертификат для своего проекта WebAPI. установили ли вы доверительные отношения между клиентской и серверной сторонами? а именно установить сервисный сертификат на стороне клиента. Чтобы объяснить, как он работает должным образом в среде разработки и промежуточной среды, запрос Http Get ничего не представляет, попробуйте запрос Http Post.
Кроме того, протокол SSL требует поддержки Do tNet framework / OS , попробуйте установить старшую версию Do tNet framework.
Не стесняйтесь, дайте мне знать, если вы получите что-то новое позже.

...