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 addresss"、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

クライアントでは、それは機能します。

これら2つをHTTPSと自分の証明書と通信させるにはどうすればよいですか?これらの最新バージョンのライブラリで動作するクライアントとサーバーの両方の簡単な例です。

電話がかかってきます

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

サービス中ですが、私はそれで何か役に立つことがあるかどうかわかりませんか?ハンドシェイクで失敗します。

回答

WalterVehoeven Nov 22 2020 at 09:44

コメントに誰がコメントを読むかという解決策が含まれた後、ここに解決策を書きます...

問題は、.net 5.0クライアントの方が高速であり、サーバーが接続を受け入れる準備ができていないため、クライアントが接続できないことです。クライアントとサーバーを開発するときは、共有プロジェクトで2つのソリューションを使用するのが最適です。これにより、VisualStudioの2つのインスタンスを使用して両方を同時にデバッグできます。VSの複数のインスタンスで同じソリューションを開くことができますが、たとえば中間ウィンドウと出力ウィンドウでさまざまな問題が発生し始めます。