当前位置: 首页 > 知识库问答 >
问题:

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

邢冷勋
2023-03-14

我用的是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在删除"...。如果我在服务器上设置ClientCerateMode=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 Framework中配置带有证书的客户端吗?我对gRPC/很陌生。NET并将感谢任何建议!

共有2个答案

冯星剑
2023-03-14

从我尝试和工作,您可以跳过必须同时阅读cert.pemcert.key的努力。此外,只有当服务器系统托管在众所周知的受信任网站(如 google.com 或 msdn.com 或像它和localhost这样的网站中时GetRootCertificate()才能工作。更详细的答案可以在这里和这里找到

如果我们打算将我们自己的主机DNS与SSL一起使用,那么在分配给您的DNS的pfx中生成服务器证书并将其转换为客户端应用程序的pem是您的选择。使用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);
贾越
2023-03-14

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

您可以通过创建密钥证书对来配置客户端证书以传递到 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。

 类似资料:
  • 你能给我举几个这样做的例子吗?我找不到任何地方,如果这可以做到或不能做到。 详细信息:我用。NET Framework客户机做了一个例子,以Grpc C#Github为参考,以。NET核心客户机做了一个例子,以Grpc dotnet的这个例子为参考。我能够与…建立一个不安全的通信渠道 到ASP.NET核心服务器中的Https端口5000 如何使用安全通道进行通信。我想使用相同的pfx+密码组合。

  • 我创建了一个DotNet Core 3.1 gRPC服务器。 是否可以在DotNet Frametwork 4.8客户端中使用此服务器? 我引用了这些包: 谷歌。Protobuf Grpc。核心 Grpc.Core.Api 我的测试代码如下所示: 我复制了问候语。来自服务器的proto。。。 但是它在上面的代码中找不到Greeter。 这样做有可能吗? 更新。。。。。。。 我设法将Protos放在

  • 我对gRpc很陌生,已经开始探索它们的基础知识(在C语言中)。我想获得有关如何发送心跳以检查客户端/服务器是否仍处于连接状态以及在断开连接时采取恢复措施的指导。任何示例或参考任何文档/文章都将有助于我开始学习。谢谢

  • 遵循以下文档:https://docs.microsoft.com/fr-fr/aspnet/core/grpc/authn-and-authz?view=aspnetcore-3.0#承载令牌身份验证,我尝试配置我的GRPC客户端以自动注入JWT令牌。 但它被Grpc.Core中的一个例外“提供的通道凭据不允许组合”窒息 这是什么意思?我应该如何提供HTTP授权标头?

  • 无法连接到本链接中提到的greeter grpc服务-https://docs . Microsoft . com/en-us/aspnet/core/tutorials/grpc/grpc-start?欢迎客户端的view=aspnetcore-3.0,它是使用grpc.core库(< code>Grpc)从. net framework应用程序编写的。核心2.24.0和< code>Grpc。

  • 将grpc定义的服务视为: 并利用客户端连接到此服务类似于: 如果我们要在一个单独的线程中生成调用,那么处理终止一个永远运行、我们不想再使用的grpc连接的正确方法是什么?是否有任何连接或流控制方法可以调用?