.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 编码的字符串:
- PEM 编码的客户端证书链
- PEM 编码私钥
- 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核心服务器
- 删除
app.UseHttpsRedirection()
和 app.UseHsts()
在 StartUp
class ConfigureServices(IApplicationBuilder app)
;
- 在开发过程中公开不安全的端口,通常为 80 或 5000。
- 使用下面的代码在 .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 客户端中分别使用与 pfx
和 pem
相同的证书。
我可以将 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,因此您还需要寻找其他托管方法。
查看
您可以通过创建 KeyCertificatePair
传递到 SslCredentials
来配置客户端证书。您将需要三个 PEM 编码的字符串:
- PEM 编码的客户端证书链
- PEM 编码私钥
- 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核心服务器
- 删除
app.UseHttpsRedirection()
和app.UseHsts()
在StartUp
classConfigureServices(IApplicationBuilder app)
; - 在开发过程中公开不安全的端口,通常为 80 或 5000。
- 使用下面的代码在 .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 客户端中分别使用与 pfx
和 pem
相同的证书。