Ошибка SSL-сертификата .netcore с клиентом WPF и SignalR на IIS - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть следующий сценарий:

  1. API в. NET Core 3.1 - Hub ( SyncHub.cs ) и контроллер ( WebHookController.cs ), который уведомляет клиентов при достижении POST
  2. Приложение WPF в. NET Core 3.1 - Клиент

Локально все работает нормально. Я могу подключиться к концентратору и также получать уведомления.

Когда я публикую sh API для IIS (удаленный сервер), я больше не могу подключиться к концентратору с локального компьютера.

Я получаю следующую ошибку:

Система. Net .Http.HttpRequestException: Не удалось установить соединение SSL, см. Внутреннее исключение. ---> System.Security.Authentication.AuthenticationException: удаленный сертификат является недействительным в соответствии с процедурой проверки. в System. Net .Security.SslStream.StartSendAuthResetSignal (сообщение ProtocolToken, AsyncProtocolRequest asyncRequest, исключение ExceptionDispatchInfo) в System. SslStream.StartSendBlob (Byte [], входящий, счетчик Int32, AsyncProtocolRequest asyncRequest) в System. Net .Security.SslStream.ProcessReceivedBlob (буфер Byte [], число Int32, AsyncProtocolRequest asyncRequest * .Sec .Sec .Sec .Sec. 10 .Sec .Sec. 10. StartReadFrame (буфер Byte [], readBytes Int32, asyncProtocolRequest asyncRequest) в System. Net .Security.SslStream.StartReceiveBlob (буфер Byte [], asyncProtocolRequest asyncRequest) в System. Net. AsyncProtocolRequest asyncRequest) в System. Net .Security.SslStream.StartSendBlob (Byte [] входящий, число Int32, AsyncProtocolRequest asyncRequest) в System. Net .Securit y.SslStream.ProcessReceivedBlob (буфер Byte [], число Int32, AsyncProtocolRequest asyncRequest) в System. Net .Security.SslStream.StartReadFrame (буфер Byte [], int32 readBytes, AsyncProtocolRequest asyncReecest * .6767). SslStream.PartialFrameCallback (AsyncProtocolRequest asyncRequest) --- Конец трассировки стека из предыдущего расположения, где было сгенерировано исключение --- в System. Net .Security.SslStream.ThrowIfExceptional () в System. Net .Security.SslStream.InternalEndProcess (LazyAsyncResult lazyResult) в System. Net .Security.SslStream.EndProcessAuthentication (результат IAsyncResult) в System. Net .Security.SslStream.EndAuthenticateAsClient (IAsyncResult asynSt. 1073 * .b__65_1 (iar IAsyncResult) в System.Threading.Tasks.TaskFactory 1.FromAsyncCoreLogic(IAsyncResult iar, Func 2 endFunction, обещание Action 1 endAction, Task 1, Boolean требуетSynchronization) --- Конец трассировки стека из предыдущего местоположения, в котором было сгенерировано исключение --- в система. Net .Http.ConnectHelpe r.EstablishSslConnectionAsyncCore (Поток потока, SslClientAuthenticationOptions sslOptions, CancellationToken cancellationToken) --- Конец внутренней трассировки стека исключений --- в System. Net .Http.HttpConnectionPool.ConnectAsyn c (запрос HttpRequestMessage, логическое значение allowHttp2, CancellationToken cancellationToken) в системе. Net .Http.HttpConnectionPool.CreateHestp11ConnectionHokenTokenToken (запрос на отмену ответа) .Http.HttpConnectionPool.GetHttpConnectionAsyn c (запрос HttpRequestMessage, CancellationToken cancellationToken) в System. Net .Http.HttpConnectionPool.SendWithRetryAsyn c (запрос на отмену возврата, запрос на возврат. RedirectHandler.SendAsyn c (запрос HttpRequestMessage, CancellationTo ken cancellationToken) в System. Net .http. DiagnosticsHandler.SendAsyn c (запрос HttpRequestMessage, CancellationToken cancellationToken) в Microsoft.AspNetCore.Http.Connections.Client.Internal.AccessTokenHttpMessageHandler.SendAsyn c запрос на отмену возврата. Internal.LoggingHttpMessageHandler.SendAsyn c (запрос HttpRequestMessage, CancellationToken cancellationToken) в System. Net .Http.HttpClient.FinishSendAsyncUnbuffered (Task`1 sendTask, HttpReceSecenceSecenceSecanceSecest .Client.HttpConnection.NegotiateAsyn c (URL-адрес Uri, HttpClient httpClient, регистратор ILogger, CancellationToken cancellationToken) Microsoft.AspNetCore.Http.Connections.Client.HttpConnection: Отладка: Пропуск * 10 * удален, подключение 10 уже отключено.

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

Ниже приведен код моего приложения.

Startup.cs

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers();

        services.AddSignalR(hubOptions => { hubOptions.EnableDetailedErrors = true; });
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseHttpsRedirection();

        app.UseRouting();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
            endpoints.MapHub<SyncHub>("/signalr");
        });
    }
}

SyncHub.cs

public class SyncHub : Hub
{
    public override Task OnConnectedAsync()
    {
        Clients.Caller.SendAsync("Connected", Context.ConnectionId);

        return base.OnConnectedAsync();
    }
}

WebHookController.cs

    // POST: /webhook
    [HttpPost]
    public async Task<IActionResult> Post([FromBody] JsonElement body)
    {
        try
        {
            var eventType = body.GetProperty("eventType").ToString();

            _logger.LogInformation($"[HttpPost]: The current event type is '{eventType}'");

            switch (eventType)
            {
                case "build.complete":
                    await _hubContext.Clients.All.SendAsync("ReceiveMessage", $"Hi from WebHook");

                    _logger.LogInformation("[BuildComplete]: Build succeeded. Clients were notified.");

                    return Ok();
                default:
                    return BadRequest();
            }
        }
        catch (Exception ex)
        {
            _logger.LogError($"[HttpPost] Exception: {ex}");

            return BadRequest();
        }
    }

Приложение WPF

            var connection = new HubConnectionBuilder()
            .WithUrl(viewModel.Endpoint)
            .ConfigureLogging(logging => {
                // Log to the Output Window
                logging.AddDebug();

                // This will set ALL logging to Debug level
                logging.SetMinimumLevel(LogLevel.Debug);
            })
            .Build();

        connection.On<string>("ReceiveMessage", (message) =>
        {
            Dispatcher.CurrentDispatcher.Invoke(() =>
            {
                using (var db = new SettingsDbContext())
                {
                    // TODO: Do stuff
                }
            });
        });

        connection.On<string>("Connected", (connectionId) => { viewModel.ConnectionState = "Connected"; });

        try
        {
            connection.StartAsync();
        }
        catch (Exception ex)
        {
            Debugger.Break();

            // TODO: Handle error
        }

Program.cs

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder
                    .ConfigureLogging(logging =>
                    {
                        logging.ClearProviders();
                        logging.AddConsole();
                    })
                    .UseContentRoot(Directory.GetCurrentDirectory())
                    .UseIISIntegration()
                    .UseStartup<Startup>();
            });
}
...