温馨提示:本文翻译自stackoverflow.com,查看原文请点击:c# - How can I connect a gRPC client in .NET framework with a secure .NET Core server?
.net .net-core c# grpc protobuf-net

c# - 如何将.NET Framework中的gRPC客户端与安全的.NET Core服务器连接?

发布于 2021-04-17 14:36:38

我在.NET Core服务器上使用protobuf-net.Grpc,并尝试从.NET Framework(4.7.2。)gRPC客户端进行调用。完整的示例在这里:https : //github.com/angelagyang/GRPCProtobufExample

这是我的客户的摘要:

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在服务器上进行设置,则可以连接到服务器。但是,我希望服务器需要客户端证书,并通过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的新手,希望你能提出任何建议!

查看更多

提问者
Angela Yang
被浏览
0
Angela Yang 2020-07-10 07:06

解决并更新了原始示例:https : //github.com/angelagyang/GRPCProtobufExample

你可以通过创建KeyCertificatePair传入来配置客户端证书SslCredentials你将需要PEM编码的证书链和PEM编码的私钥。

var keyCertPair = new KeyCertificatePair(File.ReadAllText($"{rootDir}/cert.pem"), File.ReadAllText($"{rootDir}/cert.key")); 
var channelCreds = new SslCredentials(GetRootCertificates(), keyCertPair);

为了进行测试,我在这里使用了自签名证书:https : //github.com/grpc/grpc/tree/master/src/core/tsi/test_creds

调试时,设置GRPC_VERBOSITY = DEBUGGRPC_DEBUG = ALL这可以帮助清除模糊的错误消息。例如,我意识到我用来配置HTTPS的服务器证书不包含localhost。