繁体   English   中英

用于 .NET 框架到 .NET 核心服务器的 gRPC SSL 通信

[英]gRPC SSL communication for .NET Framework to .NET Core Server

我可以将 C# 完整 .NET 框架客户端与 C# .NET 核心客户端一起使用吗?

你能带我举一些例子吗? 如果可以做到或无法做到,我找不到任何地方。

Detail: I made an example using .NET Framework client with Grpc C# Github as the reference and .NET Core client with this example from Grpc dotnet as a the reference. 我能够建立一个不安全的沟通渠道

new Channel("127.0.0.1", 5000, ChannelCredentials.Insecure)

以及ASP.NET核心服务器中5000打开的Non-Https端口。

当我尝试与

var channel = new Channel("127.0.0.1", 5001, new SslCredentials());

到 ASP.NET Core ServerI 中的 Https 端口 5000

如何使用安全通道进行通信。 我想使用相同的 pfx + 密码组合。

在这里查看我的问题和答案 我创建了一个可能有用的基本示例: https://github.com/angelagyang/GRPCProtobufExample

您可以通过创建KeyCertificatePair来配置客户端证书以传递到SslCredentials 您将需要三个 PEM 编码的字符串:

  1. PEM 编码的客户端证书链
  2. PEM 编码的私钥
  3. PEM 编码的服务器 SSL 证书。

这是一个示例设置:

var keyCertPair = new KeyCertificatePair(clientsslcert.pem, privatekey.pem); 
var channelCreds = new SslCredentials(serversslcert.pem, keyCertPair);

出于测试目的,我发现这些测试 PEM 很有帮助 我使用OpenSSL将 PFX 转换为 PEM 格式。 此外, 这篇文章更多地讨论了不同的 PEM 字符串以及为什么客户端需要显式信任服务器。

我发布这个答案是为了让下一个人寻找解决方案。 在我在这里这里工作之后,我已经在类似的用例问题中发布了我的解决方案

- 以下是从我自己的答案中复制的。

是否超过SSL,需要在ASP.NET核心服务器中开启Http2。 所以在appsettings.json中,这样做。

"Kestrel": {
    "EndpointDefaults": {
      "Protocols": "Http2"
    }

不安全的 .NET 框架客户端 + ASP.NET 核心服务器

  • ASP.NET核心服务器
    1. 删除StartUp class ConfigureServices(IApplicationBuilder app)中的app.UseHttpsRedirection()app.UseHsts() ) ;
    2. 在开发过程中公开不安全的端口,通常是 80 或 5000。
    3. 使用以下代码在 .NET 框架客户端中创建不安全通道。
var channel = new Channel("localhost", 5001, ChannelCredentials.Insecure);

安全 SSL 连接 .NET 框架客户端 + ASP.NET 核心服务器

通过在客户端中使用相同的服务器证书 in.pem 格式,我让它与 SSL 端口一起使用。

SslCredentials secureCredentials = new SslCredentials(File.ReadAllText("certificate.pem"));
var channel = new Channel("localhost", 5001, secureCredentials);

一点解释。 VS 2019 中的 ASP.NETCore 模板使用开发证书,其中 pfx 文件位于%AppData%\ASP.NET\Https\ProjectName.pfx和密码 = %AppData%\Microsoft\UserSecrets\{UserSecretsId}\secrets.json {:Kestrel:Certificates:Development:Password} Value您可以从ProjectName.csproj获取UserSecretsId id。 对于每个 ASP.NET 核心项目,这将有所不同。

我使用以下命令将 pfx + 密码组合转换为certificate.pem文件。

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

这将提示输入 pfx 密码。 使用上述secrets.json中的密码。

为要生成的certificate.pem提供一些密码(至少 4 个字母)。

复制此cerificate.pem供 gRPC .NET 框架客户端访问和使用

SslCredentials secureCredentials = new SslCredentials(File.ReadAllText("<DiskLocationTo the Folder>/certificate.pem"))
var channel = new Channel("localhost", 5001, secureCredentials);

请注意,我使用的端口 5001 是我的 ASP.NET 核心应用程序的 SSL 端口。

生产场景

使用来自证书签名机构的有效证书,并在 ASP.NET 核心服务器和 .NET 框架客户端中分别使用相同的证书作为pfxpem

我对这个答案很幸运。 像 OP 一样,我还没有让它远程工作。 请记住,IIS 还不支持 gRPC,因此您还需要找到替代托管方法。

暂无
暂无

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

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