Comment connecter Grpc (netstandard 2.0) au serveur Grpc.Asp.NetCore (.NET 5.0) en utilisant HTTPS et mon propre certificat? [dupliquer]

Nov 21 2020

J'obtiens cette exception sur le client:

Grpc.Core.RpcException: 'Status (StatusCode = "Unavailable", Detail = "impossible de se connecter à toutes les adresses", DebugException = "Grpc.Core.Internal.CoreErrorDetailException: {" created ":" @ 1606620349.107000000 "," description " : "Impossible de sélectionner le sous-canal", "fichier": "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": "n'a pas réussi à se connecter à toutes les adresses", "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}]}") '

Canal client:

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

Configuration du serveur:

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

Quand je viens de supprimer

listenOptions.UseHttps...

sur le serveur et utiliser

ChannelCredentials.Insecure

sur le client, cela fonctionne.

Comment faire communiquer ces deux avec HTTPS et mon propre certificat? Juste un exemple simple de client et de serveur qui fonctionnent sur ces dernières versions de bibliothèques.

Je reçois un appel pour

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

en service mais je ne sais pas quoi, si quelque chose d'utile puis-je en faire? Il échoue sur une poignée de main.

Réponses

WalterVehoeven Nov 22 2020 at 09:44

J'écris la solution ici après que les commentaires contenaient la solution comme qui lit les commentaires ...

Le problème est que le client .net 5.0 est plus rapide et que le client ne peut pas se connecter car le serveur n'est pas prêt à accepter les connexions. Lors du développement du client et du serveur, il est préférable d'avoir 2 solutions avec les projets partagés afin de pouvoir déboguer les deux en même temps en utilisant 2 instances de Visual Studio. Vous pouvez ouvrir la même solution avec plusieurs instances de VS, mais vous commencerez à rencontrer des problèmes différents, par exemple dans la fenêtre intermédiaire et la fenêtre de sortie.