无论是否通过 SSL,您都需要在 ASP.NET Core 服务器中开启 Http2。所以在 appsettings.json 中,这样做。
"Kestrel": {
"EndpointDefaults": {
"Protocols": "Http2"
}
不安全的 .NET Framework 客户端 + ASP.NET Core 服务器
- ASP.NET 核心服务器
- 删除
StartUp类ConfigureServices(IApplicationBuilder app)中的app.UseHttpsRedirection()和app.UseHsts();
- 在开发过程中公开不安全的端口,通常为 80 或 5000。
- 使用以下代码在 .NET Framework 客户端中创建不安全通道。
var channel = new Channel("localhost", 5000, ChannelCredentials.Insecure);
安全 SSL 连接 .NET Framework 客户端 + ASP.NET Core 服务器
我通过在客户端中使用相同的服务器证书以 .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
您可以从ProjectName.csproj 获取UserSecretsId id。这对于每个 ASP.NET Core 项目都是不同的。
我们只需要将证书的公钥作为 certificate.pem 文件即可通过 gRPC 进行安全通信。使用以下命令从 pfx 中提取公钥
openssl pkcs12 -in "<DiskLocationOfPfx>\ProjectName.pfx" -nokeys -out "<TargetLocation>\certifcate.pem"
复制此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 Core 应用程序的 SSL 端口。
适用于生产场景
使用来自证书签名机构的有效证书,并在 ASP.NET Core Server 和 .NET Framework 客户端中分别使用与 pfx 和 pem 相同的证书。
使用自签名证书
对于在我们自己的微服务之间进行通信的大多数微服务来说,使用自签名证书是一种有效的选择。我们可能不需要权威签署的证书。我们在使用自签名证书时可能面临的一个问题是,证书可能会颁发给某个目标 DNS 名称,而我们的 gRPC 服务器可能正在其他地方运行,并且无法建立安全连接。
使用 gRPC Target Name override keys 覆盖 ssl 目标名称验证。
List<ChannelOption> channelOptions = new List<ChannelOption>()
{
new ChannelOption("grpc.ssl_target_name_override", <DNS to which our certificate is issued to>),
};
SslCredentials secureCredentials = new SslCredentials(File.ReadAllText("certificate.pem"));
var channel = new Channel("localhost", 5001, secureCredentials, channelOptions);