无论是否使用SSL,您都需要在ASP.NET Core服务器上启用Http2。因此,在appsettings.json中进行以下操作。
"Kestrel": {
"EndpointDefaults": {
"Protocols": "Http2"
}
不安全的.NET Framework客户端+ASP.NET Core服务器
- ASP.NET Core服务器
- 在
StartUp
类的ConfigureServices(IApplicationBuilder app)
方法中删除app.UseHttpsRedirection()
和app.UseHsts()
;
- 在开发期间公开不安全的端口,通常为80或5000。
- 使用以下代码在.NET Framework客户端中创建不安全通道。
var channel = new Channel("localhost", 5000, ChannelCredentials.Insecure);
安全的SSL连接:.NET框架客户端+ASP.NET Core服务器
我已经使用相同的服务器证书(以.pem格式)在客户端上实现了SSL端口连接。
SslCredentials secureCredentials = new SslCredentials(File.ReadAllText("certificate.pem"));
var channel = new Channel("localhost", 5001, secureCredentials);
一些解释。VS2019中的ASP.NET Core模板使用位于
%AppData%\ASP.NET\Https\ProjectName.pfx
的pfx文件带有开发证书。
证书的密码可在
%AppData%\Microsoft\UserSecrets\{UserSecretsId}\secrets.json
中找到。
您可以从
ProjectName.csproj
获取
UserSecretsId
id,每个ASP.NET Core项目都不同。
我们只需要证书公钥作为
certificate.pem
文件以安全地通过gRPC进行通信。请使用以下命令从pfx中提取publickey。
openssl pkcs12 -in "<DiskLocationOfPfx>\ProjectName.pfx" -nokeys -out "<TargetLocation>\certifcate.pem"
复制此{{certificate.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服务器和.NET Framework客户端中的pfx和pem。
使用自签名证书是大多数在我们自己的微服务之间通信的微服务的有效选项。我们可能不需要一个授权签名的证书。使用自签名证书可能面临的一个问题是,证书可能被颁发给某个目标DNS名称,而我们的gRPC服务器可能正在其他位置运行,无法建立安全连接。
使用
gRPC目标名称覆盖键来覆盖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);
GrpcGreeterClient
示例项目方面有没有什么进展? - IronMan