Ошибка 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 шт):

Автор решения: Dev18

Для безопасного подключения в боевой среде необходимо использовать действительный 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, чтобы обеспечить защищенное соединение.


Код ответа взяла отсюда

→ Ссылка