Как заставить клиента gRPC взаимодействовать с сервером gRPC на другом компьютере? Оба в Aspnet Core 3.0. Возможная проблема с SSL

Итак, по названию вы знаете, что я пытаюсь построить.

У меня уже есть один сервер gRPC и 3 клиента, которые разговаривают вместе на одной машине. Сервер доступен по адресу http://localhot:5001. Все работает гладко, но если я запускаю клиентов на другом компьютере, они не могут получить доступ к серверу. Итак, я установил IIS и поместил туда сервер, чтобы он обслуживался извне с доменом beta.server.com. Я изменил файл hosts на клиентском компьютере, чтобы перейти на IP-адрес компьютера (192.168.5.49), на котором сервер работает в IIS.

Когда я пытаюсь получить доступ с помощью браузера по http, я получаю сообщение о том, что я могу подключиться только с помощью клиента gRPC. По https говорит NET :: ERR_CERT_COMMON_NAME_INVALID. Может в этом проблема ... (выяснил после написания остального).

Пытаясь подключиться с помощью клиента gRPC к http (http://beta.server.com), я получаю ошибка о том, что http / 1.1 не поддерживается, что верно, эта служба работает только на http2.

При попытке подключиться к IP-адресу сервера с https (https://beta.server.com) я получаю ошибка из-за того, что не удалось установить ssl-соединение. Следующее:

PS C:\Users\Farm\Desktop\GrpcSierConsole\Viewer> dotnet run
Entered task
Unhandled exception. System.AggregateException: One or more errors occurred. (Status(StatusCode=Internal, Detail="Error starting gRPC call: The SSL connection could not be established, see inner exception."))
 ---> Grpc.Core.RpcException: Status(StatusCode=Internal, Detail="Error starting gRPC call: The SSL connection could not be established, see inner exception.")
   at Grpc.Net.Client.Internal.HttpContentClientStreamReader`2.MoveNextCore(CancellationToken cancellationToken)
   at Grpc.Core.AsyncStreamReaderExtensions.ReadAllAsync[T](IAsyncStreamReader`1 streamReader, CancellationToken cancellationToken)+MoveNext()
   at Grpc.Core.AsyncStreamReaderExtensions.ReadAllAsync[T](IAsyncStreamReader`1 streamReader, CancellationToken cancellationToken)+System.Threading.Tasks.Sources.IValueTaskSource<System.Boolean>.GetResult()
   at Viewer.Program.<>c.<<Main>b__0_0>d.MoveNext() in C:\Users\Farm\Desktop\GrpcSierConsole\viewer\Program.cs:line 24
--- End of stack trace from previous location where exception was thrown ---
   at Viewer.Program.<>c.<<Main>b__0_0>d.MoveNext() in C:\Users\Farm\Desktop\GrpcSierConsole\viewer\Program.cs:line 24
   --- End of inner exception stack trace ---
   at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
   at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
   at System.Threading.Tasks.Task.Wait()
   at Viewer.Program.Main() in C:\Users\Farm\Desktop\GrpcSierConsole\viewer\Program.cs:line 29

Ошибка находится в строке 29 файла program.cs на сервере. У меня есть следующий код: Строка 29 - это webBuilder.UseStartup ():

//Additional configuration is required to successfully run gRPC on macOS.
        // For instructions on how to configure Kestrel and gRPC clients on macOS, visit https://go.microsoft.com/fwlink/?linkid=2099682
        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });

Я пытался использовать сертификат localhost visualstudio и самозаверяющий сертификат в IIS как на клиентском компьютере, так и на сервере, на котором запущен IIS.

Также я использовал эту строку в клиенте, чтобы доверять всем сертификатам:

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

Я получил от: Как игнорировать проверку сертификата при ssl

Не знаю, что еще делать. Кто-нибудь может помочь?

############### UPDATE

Я добавил этот код клиенту

var httpClientHandler = new HttpClientHandler();
// Return `true` to allow certificates that are untrusted/invalid
httpClientHandler.ServerCertificateCustomValidationCallback = 
    HttpClientHandler.DangerousAcceptAnyServerCertificateValidator;
var httpClient = new HttpClient(httpClientHandler);

var channel = GrpcChannel.ForAddress("https://localhost:5001",
    new GrpcChannelOptions { HttpClient = httpClient });
 var client = new QueueManagement.QueueManagementClient(channel);
...

Теперь у меня нет ошибки SSL, кроме этой:

PS C:\Users\Farm\Desktop\GrpcSierConsole\Viewer> dotnet run
Entered task
Unhandled exception. System.AggregateException: One or more errors occurred. (Status(StatusCode=Internal, Detail="Error starting gRPC call: An error occurred while sending the request."))
 ---> Grpc.Core.RpcException: Status(StatusCode=Internal, Detail="Error starting gRPC call: An error occurred while sending the request.")
   at Grpc.Net.Client.Internal.HttpContentClientStreamReader`2.MoveNextCore(CancellationToken cancellationToken)
   at Grpc.Core.AsyncStreamReaderExtensions.ReadAllAsync[T](IAsyncStreamReader`1 streamReader, CancellationToken cancellationToken)+MoveNext()
   at Grpc.Core.AsyncStreamReaderExtensions.ReadAllAsync[T](IAsyncStreamReader`1 streamReader, CancellationToken cancellationToken)+System.Threading.Tasks.Sources.IValueTaskSource<System.Boolean>.GetResult()
   at Viewer.Program.<>c.<<Main>b__0_0>d.MoveNext() in C:\Users\Farm\Desktop\GrpcSierConsole\Viewer\Program.cs:line 32
--- End of stack trace from previous location where exception was thrown ---
   at Viewer.Program.<>c.<<Main>b__0_0>d.MoveNext() in C:\Users\Farm\Desktop\GrpcSierConsole\Viewer\Program.cs:line 32
   --- End of inner exception stack trace ---
   at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
   at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
   at System.Threading.Tasks.Task.Wait()
   at Viewer.Program.Main() in C:\Users\Farm\Desktop\GrpcSierConsole\Viewer\Program.cs:line 37

И в строке 37 у меня есть task.wait (), потому что он выполняется внутри задачи.

var channel = GrpcChannel.ForAddress("https://beta.server.com",
    new GrpcChannelOptions { HttpClient = httpClient });
                var client = new QueueManagement.QueueManagementClient(channel);

                var request = client.QueueNumberChanged(new SendQueueId { QueueId = "2" });
                await foreach (var response in request.ResponseStream.ReadAllAsync())
                {
                    Console.WriteLine($"Senha {response.Number} -> fila 2");
                }
            });
            t.Wait();

person Ricardo Araújo    schedule 18.12.2019    source источник


Ответы (1)


После большого исследования и обмена множеством сообщений в официальном репозитории GitHub от Microsoft для документации пустельги .Net Core я нашел его.

Это можно сделать с этими настройками в appsettings.json.

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "Kestrel": {
    "EndpointDefaults": {
      "Protocols": "Http2"
    },
    "EndPoints": {
      "Https": {
        "Url": "https://*:5002",
        "Certificate": {
          "Path": "c:\\test.pfx",
          "Password": "password1234"
        }
      }
    }
  },
}
person Ricardo Araújo    schedule 07.01.2020
comment
Что делать, если он не размещен в «Пустельге»? Мне нужно, чтобы он работал из приложения Xamarin. Любое решение? - person Yuri S; 03.05.2020