Wie verbinde ich Grpc (netstandard 2.0) mit Grpc.Asp.NetCore Server (.NET 5.0) unter Verwendung von HTTPS und meinem eigenen Zertifikat? [Duplikat]

Nov 21 2020

Ich bekomme diese Ausnahme auf dem Client:

Grpc.Core.RpcException: 'Status (StatusCode = "Nicht verfügbar", Detail = "Verbindung zu allen Adressen konnte nicht hergestellt werden", DebugException = "Grpc.Core.Internal.CoreErrorDetailException: {" created ":" @ 1606620349.107000000 "," description " : "Unterkanal konnte nicht ausgewählt werden", "Datei": "T: \ src \ github \ grpc \ workspace_csharp_ext_windows_x86 \ src \ core \ ext \ filter \ client_channel \ client_channel.cc", "file_line": 4166, "referenced_errors": [ {"created": "@ 1606620349.107000000", "description": "Verbindung zu allen Adressen fehlgeschlagen", "file": "T: \ src \ github \ grpc \ workspace_csharp_ext_windows_x86 \ src \ core \ ext \ filter \ client_channel \ lb_policy \ pick_first \ pick_first.cc "," file_line ": 398," grpc_status ": 14}]}") '

Client-Kanal:

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

Serverkonfiguration:

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

Wenn ich gerade entferne

listenOptions.UseHttps...

auf dem Server und verwenden

ChannelCredentials.Insecure

auf dem Client funktioniert es.

Wie können diese beiden mit HTTPS und meinem eigenen Zertifikat kommunizieren? Nur ein einfaches Beispiel für Client und Server, die mit diesen neuesten Versionen von Bibliotheken arbeiten.

Ich bekomme einen Anruf bei

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

im Dienst, aber ich weiß nicht was, wenn irgendetwas Nützliches ich damit machen kann? Es schlägt bei einem Handschlag fehl.

Antworten

WalterVehoeven Nov 22 2020 at 09:44

Ich schreibe die Lösung hier, nachdem die Kommentare die Lösung enthielten, als wer die Kommentare liest ...

Das Problem ist, dass der .net 5.0-Client schneller ist und keine Verbindung herstellen kann, da der Server nicht bereit ist, Verbindungen zu akzeptieren. Wenn Sie Client und Server entwickeln, sollten Sie zwei Lösungen mit den gemeinsam genutzten Projekten verwenden, damit Sie beide gleichzeitig mit zwei Instanzen von Visual Studio debuggen können. Sie können dieselbe Lösung mit mehreren VS-Instanzen öffnen, es treten jedoch unterschiedliche Probleme auf, z. B. im Zwischenfenster und im Ausgabefenster.