【发布时间】:2023-03-26 07:44:02
【问题描述】:
我在 .NET Core 服务器上使用 protobuf-net.Grpc 并尝试从 .NET Framework (4.7.2.) gRPC 客户端进行调用。一个完整的例子在这里:https://github.com/angelagyang/GRPCProtobufExample
这是我客户的 sn-p:
var channelCreds = new SslCredentials(GetRootCertificates());
var channel = new Channel("localhost", 5001, channelCreds);
var greeter = channel.CreateGrpcService<IGreeterService>();
使用此配置,我在调用服务器时收到错误StatusCode="Unknown", Detail="Stream removed"...。如果我在服务器上设置ClientCertificateMode = ClientCertificateMode.NoCertificate,我就可以连接到服务器。 但是,我希望服务器到require a client certificate and validate the certificate via thumbprint。
例如,在 .NET Core 中,我可以使用 Grpc.Net.Client 来配置我的频道,如下所示:
var handler = new HttpClientHandler();
handler.ClientCertificates.Add(certificate);
var channel2 = GrpcChannel.ForAddress("https://localhost:5001", new GrpcChannelOptions
{
HttpHandler = handler
});
有没有办法像这样在 .NET Framework 中配置带有证书的客户端?我对 gRPC/.NET 还是很陌生,如果有任何建议,我将不胜感激!
【问题讨论】:
-
我找到了一个与您的示例相似但有一些差异的示例,也许它可以提供帮助:grpc.io/docs/guides/auth(查找文本
C#) -
非常有趣的问题。明天我会试着做一些挖掘工作。
-
GRPC 是 HTTP/2。 Peter 的链接只是在连接开始时使用 TCP 完成的 SSL/TLS 安全性,并不是整个解决方案。 OP 发布顶部的链接不会一直有效。当客户端和服务器在同一台机器上时,它将不起作用,因为它们都使用 localhost。如果机器将环回 IP 127.0.0.1 作为本地主机,该代码也将不起作用。建立 TCP 连接的建议是服务器始终使用 IPAddress.Any 作为端点。客户端应该连接到服务器的 IP 或使用 DNS.GetHost 然后使用地址数组的索引 1。
标签: c# .net .net-core grpc protobuf-net