Ошибка SSL connection could not be established при публикации Blazor Server с SignalR на HTTPS
Я использую Hub SignalR для обновления страницы в приложении на Blazor Server. При локальной публикации http
всё работает корректно: приложение получает данные с API, обрабатывает их и обновляет объект.
Однако, при публикации на сервере с https
, я сталкиваюсь с ошибкой:
System.Net.Http.HttpRequestException: 'The SSL connection could not be established, see inner exception.'
Я добавила сертификат для обеспечения безопасного соединения между API и Blazor, также пыталась игнорировать проверку сертификата при SubscribeToApi
:
httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => { return true; };
Но сама ошибка сохраняется и возникает на уровне Blazor:
try
{
hubConnection = new HubConnectionBuilder()
.WithUrl(Navigation.ToAbsoluteUri("/someHookEndPoint"))
.Build();
}
catch (Exception)
{
//System.Net.Http.HttpRequestException: 'The SSL connection could not be established, see inner exception.'
}
Что нужно сделать, чтобы исправить эту проблему и безопасно подключиться к хабу?
Ответы (1 шт):
Для безопасного подключения в боевой среде необходимо использовать действительный SSL-сертификат, например, от Let's Encrypt или другого доверенного центра сертификации (CA). Важно привязать этот сертификат к вашему сайту на уровне IIS.
Почему сертификат важен для Blazor Server "внутри самого себя"
Даже если Blazor Server и клиент работают как единое приложение, при взаимодействии через SignalR клиентская и серверная части приложения используют протокол https
. Это требует валидации сертификата, чтобы защитить данные, передаваемые между клиентом и сервером, и предотвратить ошибки подключения.
Временное решение для тестовой среды https
Если сертификат используется только для тестовой или локальной разработки, можно игнорировать проверку сертификат, добавив следующие параметры в настройки (options
) HubConnectionBuilder
:
hubConnection = new HubConnectionBuilder()
.WithUrl("https://yourdomain.com/someHookEndPoint", options =>
{
options.WebSocketConfiguration = conf =>
{
conf.RemoteCertificateValidationCallback = (message, cert, chain, errors) => { return true; };
};
options.HttpMessageHandlerFactory = handler => new HttpClientHandler
{
ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => { return true; }
};
})
.Build();
Важно: Игнорирование проверки сертификатов не рекомендуется для производственной среды, так как это снижает безопасность соединения. Для боевого сервера всегда используйте сертификат, выданный доверенным CA, чтобы обеспечить защищенное соединение.