gRPC 服务器 .net 框架 - 如何配置使用 TLS 证书

gRPC server .net framework - how to configure to use a TLS certificate

我是 gRPC 的新手,正在探索我的 .net 框架服务器中的通信选项。

由于服务器项目的年龄和规模,可能需要一些时间才能将它们移植到 .net 5+,但我想允许更新的 .net 5+ 客户端连接,所以想要用最新的东西替换现有的服务器 WCF。

我的 WCF 一直使用 Windows 身份验证进行加密,由于跨域问题我迫不及待地想要摆脱它,所以想使用 TLS。

我发现很难找到有关如何执行此操作的示例,尤其是在 .net 框架中,因为大多数示例都是 .net 核心。

这是一些典型的(大概)示例代码:

     static async Task Main()
        {
            const int port = 10042;
            
            var server = new Grpc.Core.Server
            {
                Ports = { new ServerPort("localhost", 10042, ServerCredentials.Insecure) }
            };
            server.Services.AddCodeFirst<ICalculator>(new Calculator());
            server.Services.AddCodeFirst<ITimeService>(new TimeService());
            server.Start();

            Console.WriteLine("server listening on port " + port);
            Console.ReadKey();

            await server.ShutdownAsync();
     }

忽略 AddCodeFirst 这些是其他一些实验,但是每个示例似乎都使用 ServerCredentials.Insecure,并且他们都说不要在生产中使用它(我不想这样做),但是令人沮丧的是,他们没有展示如何使用 TLS 证书。我该怎么做?

此外,对于 .net framework clients,典型代码是

Channel channel = new Channel("localhost", 10042, ChannelCredentials.Insecure);

唯一的选择似乎是Insecure

最后还有,对于服务器,可以使用自签名证书吗?

要将 TLS 与自签名证书一起使用,您需要传递 SslServerCredentials(keyCertPair, caRoots, clientCertRequestType) 的实例而不是 ServerCredentials.Insecure 的实例,如本例所示 参见 https://github.com/jtattermusch/grpc-authentication-kubernetes-examples/blob/979345cca801b71eba9f8ffc67e13bf57c33a211/greeter-server/Program.cs#L43 from an older gRPC authentication talk https://github.com/jtattermusch/grpc-authentication-kubernetes-examples

在客户端,您需要传递相应的 CA 根(另见同一示例)。