Jak połączyć Grpc (netstandard 2.0) z serwerem Grpc.Asp.NetCore (.NET 5.0) przy użyciu protokołu HTTPS i własnego certyfikatu? [duplikować]

Nov 21 2020

Mam ten wyjątek od klienta:

Grpc.Core.RpcException: 'Status (StatusCode = "Unavailable", Detail = "nie udało się połączyć ze wszystkimi adresami", DebugException = "Grpc.Core.Internal.CoreErrorDetailException: {" created ":" @ 1606620349.107000000 "," description " : "Nie udało się wybrać podkanału", "plik": "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": "nie udało się połączyć ze wszystkimi adresami", "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}]}") '

Kanał klienta:

        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),
                }
            );
    }

Konfiguracja serwera:

        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>();
            });

Kiedy po prostu usuwam

listenOptions.UseHttps...

na serwerze i użyj

ChannelCredentials.Insecure

na kliencie to działa.

Jak sprawić, by te dwie osoby komunikowały się za pomocą protokołu HTTPS i mojego własnego certyfikatu? Prosty przykład klienta i serwera, które działają na najnowszych wersjach bibliotek.

Mam telefon do

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

w serwisie, ale nie wiem co, jeśli coś pożytecznego mogę z tym zrobić? Nie udaje się przy uścisku dłoni.

Odpowiedzi

WalterVehoeven Nov 22 2020 at 09:44

Piszę tutaj rozwiązanie po komentarzach zawierających rozwiązanie jak kto czyta komentarze ...

Problem polega na tym, że klient .net 5.0 jest szybszy i klient nie może się połączyć, ponieważ serwer nie jest gotowy do przyjmowania połączeń. Podczas opracowywania klienta i serwera najlepiej jest mieć 2 rozwiązania ze współdzielonymi projektami, aby można było debugować oba w tym samym czasie przy użyciu 2 wystąpień programu Visual Studio. Możesz otworzyć to samo rozwiązanie w kilku wystąpieniach VS, jednak zaczniesz napotykać różne problemy, na przykład w oknie pośrednim i oknie wyjściowym.