首页 > 解决方案 > 如何使用 HTTPS 和我自己的证书将 Grpc(netstandard 2.0)与 Grpc.Asp.NetCore 服务器(.NET 5.0)连接起来?

问题描述

我在客户端收到此异常:

Grpc.Core.RpcException: 'Status(StatusCode="Unavailable", Detail="无法连接到所有地址", DebugException="Grpc.Core.Internal.CoreErrorDetailException: {"created":"@1606620349.107000000","description" :"未能选择子频道","文件":"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) => {     };

在服务中,但我不知道如果有什么有用的,我可以用它做什么?握手失败。

标签: .net-coregrpc.net-standard-2.0.net-5

解决方案


在评论包含解决方案后,我在此处编写解决方案,因为谁阅读了评论...

问题是 .net 5.0 客户端速度更快,并且客户端无法连接,因为服务器尚未准备好接受连接。在开发客户端和服务器时,最好使用共享项目的 2 个解决方案,以便您可以使用 2 个 Visual Studio 实例同时调试两者。您可以使用多个 VS 实例打开相同的解决方案,但是您将开始遇到不同的问题,例如在中间窗口和输出窗口中。


推荐阅读