HTTPS 및 자체 인증서를 사용하여 Grpc (netstandard 2.0)를 Grpc.Asp.NetCore 서버 (.NET 5.0)와 연결하는 방법은 무엇입니까? [복제]

Nov 21 2020

클라이언트에서이 예외가 발생합니다.

Grpc.Core.RpcException : 'Status (StatusCode = "Unavailable", Detail = "failed to connect to all addresses", DebugException = "Grpc.Core.Internal.CoreErrorDetailException : {"created ":"@ 1606620349.107000000 ","description " : "하위 채널을 선택하지 못했습니다.", "file": "T : \ src \ github \ grpc \ workspace_csharp_ext_windows_x86 \ src \ core \ ext \ filters \ client_channel \ client_channel.cc", "file_line": 4166, "referenced_errors": [ { "created": "@ 1606620349.107000000", "description": "모든 주소에 연결하지 못했습니다.", "file": "T : \ src \ github \ grpc \ workspace_csharp_ext_windows_x86 \ src \ core \ ext \ filters \ client_channel \ lb_policy \ pick_first \ pick_first.cc ","file_line ": 398,"grpc_status ": 14}]}") '

클라이언트 채널 :

        private Channel GetChannel()
    {
        return new Channel(
            _settings.FileServiceUri
            , CertificatePEM == null ? ChannelCredentials.Insecure :
                new SslCredentials(
                    CertificatePEM
                    , new KeyCertificatePair(CertificatePEM, File.ReadAllText("Syrilium.FileUpdater.cer.key"))
                )
            , new[] {
                new ChannelOption(ChannelOptions.MaxReceiveMessageLength,int.MaxValue),
                new ChannelOption(ChannelOptions.MaxSendMessageLength,int.MaxValue),
                }
            );
    }

서버 구성 :

        public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .UseServiceProviderFactory(new AutofacServiceProviderFactory())

            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.ConfigureKestrel(kestrelOptions =>
                {
                    var sslCertificate = LoadSSLCertificate();
                    kestrelOptions.ListenAnyIP(/*IPAddress.Parse("127.0.0.1"),*/ 5001
                       , listenOptions =>
                       {
                           listenOptions.UseHttps(
                             sslCertificate,
                              httpsOptions =>
                              {
                                  //httpsOptions.SslProtocols = SslProtocols.Tls12;
                                  httpsOptions.ClientCertificateMode = ClientCertificateMode.AllowCertificate;
                                  httpsOptions.ClientCertificateValidation = (certificate, chain, errors) =>
                                  {
                                      return true /*certificate.Thumbprint.Equals(_clientThumbprint, StringComparison.OrdinalIgnoreCase)*/;
                                  };
                              }
                             );
                           listenOptions.Protocols = HttpProtocols.Http2;
                       }
                       );

                });

                webBuilder.UseStartup<Startup>();
            });

내가 그냥 제거하면

listenOptions.UseHttps...

서버에서 사용

ChannelCredentials.Insecure

클라이언트에서 작동합니다.

이 두 가지가 HTTPS 및 내 인증서로 통신하도록하는 방법 이러한 최신 버전의 라이브러리에서 작동하는 클라이언트와 서버의 간단한 예입니다.

나는 전화를 받는다

   httpsOptions.OnAuthenticate = (ctx, auth) => {     };

서비스 중이지만 유용한 정보가 있다면 무엇을 할 수 있는지 모르겠습니다. 악수에서 실패합니다.

답변

WalterVehoeven Nov 22 2020 at 09:44

댓글에 누가 댓글을 읽는지에 대한 솔루션이 포함 된 후 여기에 솔루션을 작성합니다.

문제는 .net 5.0 클라이언트가 더 빠르고 서버가 연결을 수락 할 준비가되지 않았기 때문에 클라이언트가 연결할 수 없다는 것입니다. 클라이언트 및 서버를 개발할 때 공유 프로젝트로 2 개의 솔루션을 사용하는 것이 가장 좋으므로 Visual Studio의 2 개 인스턴스를 사용하여 동시에 둘 다 디버깅 할 수 있습니다. YOu는 여러 VS 인스턴스로 동일한 솔루션을 열 수 있지만 예를 들어 중간 창 및 출력 창에서 다른 문제가 발생하기 시작합니다.