.NET Framework 到 .NET Core 服务器的 gRPC SSL 通信

gRPC SSL communication for .NET Framework to .NET Core Server

我可以将 C# Full .NET Framework Client 与具有安全通道的 C# .NET Core 客户端一起使用吗?

你能给我举一些这样做的例子吗?我找不到任何地方可以完成或不能完成。

详情: 我使用 .NET Framework 客户端和 Grpc C# Github 作为参考,并使用 .NET Core 客户端和来自 Grpc dotnet 的这个示例作为参考。 我能够与

建立不安全的通信渠道

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

并且 ASP.NET 核心服务器中的 5000 打开了非 Https 端口。

当我尝试连接

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

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

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

this answer 运气不错。像 OP 一样,我还没有让它远程工作。请记住,IIS 尚不支持 gRPC,因此您还需要寻找其他托管方法。

查看 . I created a basic sample that may be helpful: 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);

出于测试目的,我发现 these test PEMs helpful. I used OpenSSL to convert PFX to PEM format. Additionally, this post 详细讨论了不同的 PEM 字符串以及客户端需要明确信任服务器的原因。

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

-- 以下是我自己的回答。

无论是否通过 SSL,您都需要在 ASP.NET 核心服务器中打开 Http2。所以在 appsettings.json 中,执​​行此操作。

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

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

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

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

我通过在客户端使用 .pem 格式的相同服务器证书来使用 SSL 端口。

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

一点解释。 ASP.NETVS 2019 中的核心模板使用了开发证书 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 Framework 客户端访问和使用

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 Framework 客户端中分别使用与 pfxpem 相同的证书。