首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用安全的gRPC核心服务器连接.NET框架中的.NET客户端?

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

Stack Overflow用户
提问于 2020-07-08 20:19:07
回答 2查看 5.5K关注 0票数 6

我在.NET核心服务器上使用protobuf-net.Grpc,并尝试从.NET框架(4.7.2)进行调用。gRPC客户端。下面是一个完整的示例:https://github.com/angelagyang/GRPCProtobufExample

下面是我客户的一个片段:

代码语言:javascript
复制
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核心中,我可以使用Grpc.Net.Client来配置信道,如下所示:

代码语言:javascript
复制
var handler = new HttpClientHandler();
handler.ClientCertificates.Add(certificate);
var channel2 = GrpcChannel.ForAddress("https://localhost:5001", new GrpcChannelOptions
{
      HttpHandler = handler
});

是否有任何方法在.NET框架中配置具有证书的客户端?--我对gRPC/.NET非常陌生,希望得到任何建议!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-09 23:06:04

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

您可以通过创建要传递到KeyCertificatePairSslCredentials来配置客户端证书。您需要PEM编码的证书链和PEM编码的私钥。

代码语言:javascript
复制
var keyCertPair = new KeyCertificatePair(File.ReadAllText($"{rootDir}/cert.pem"), File.ReadAllText($"{rootDir}/cert.key")); 
var channelCreds = new SslCredentials(GetRootCertificates(), keyCertPair);

出于测试目的,我在这里使用了自签名证书:书签

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

票数 4
EN

Stack Overflow用户

发布于 2020-07-24 21:42:57

从我尝试并使其工作的过程来看,您可以跳过必须同时阅读cert.pemcert.key的工作。此外,只有当服务器系统托管在一个熟悉的可信网站(如google.commsdn.com或类似的网站和本地主机)中时,才能工作。更详细的答案可以找到这里这里

如果我们打算在SSL中使用我们自己的主机DNS,那么在pfx中生成一个分配给您DNS的服务器证书,并将其转换为客户端应用程序的pem是您要走的路。使用openssl这样的工具将有助于转换证书编码。

代码语言:javascript
复制
openssl pkcs12 -in "<DiskLocationOfPfx>\ProjectName.pfx" -out "<TargetLocation>\certifcate.pem" -clcerts

一旦将服务器证书转换为pem,就可以使用

代码语言:javascript
复制
var channelCreds = new SslCredentials(File.ReadAllText($"{rootDir}/cert.pem"));
var channel = new Channel("www.youdns.com", 5001, secureCredentials);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62803003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档