繁体   English   中英

如何将 .NET 框架中的 gRPC 客户端与安全的 .NET 核心服务器连接?

[英]How can I connect a gRPC client in .NET framework with a secure .NET Core server?

我在 .NET 核心服务器上使用 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 ,我就能够连接到服务器。 但是,我希望服务器需要客户端证书并通过指纹验证证书

例如,在 .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 框架中配置带有证书的客户端? 我对 gRPC/.NET 很陌生,如果有任何建议,我将不胜感激!

解决并更新了原始示例: 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。

根据我的尝试和工作,您可以跳过阅读cert.pemcert.key的工作。 此外, GetRootCertificate()仅在服务器系统托管在众所周知的受信任网站(如google.commsdn.com或它和 localhost 之类的网站)中才能工作。 更详细的答案可以在这里这里找到

If we intend to use our own host DNS with SSL, Generating a Server certificate in pfx assigned to your DNS and converting it to pem for the client app is your way to go. 使用 openssl 之类的工具将有助于转换证书编码。

openssl pkcs12 -in "<DiskLocationOfPfx>\ProjectName.pfx" -out "<TargetLocation>\certifcate.pem" -clcerts

将服务器证书转换为 pem 后,您可以使用

var channelCreds = new SslCredentials(File.ReadAllText($"{rootDir}/cert.pem"));
var channel = new Channel("www.youdns.com", 5001, secureCredentials);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM