Caddy proxy asp.net core 3 kestrel grpc webapp

Caddy proxy asp.net core 3 kestrel grpc webapp

开发环境

Caddy Server

caddy_v1.0.0_windows_amd64

.net core 3

dotnet-sdk-3.0.100-preview4-011223-win-x64

openssl

Win64OpenSSL-1_1_0j.exe

system win 10 pro

结构流程

  • grpc on kestrel server https://localhost:50051
  • grpc client request call grpc on caddy proxy https://localhost:8080
  • CaddyServer //https://localhost:8080

grpc client(H2-TLS 协议) 访问 –> CaddyServer –> 反向代理(H2-TLS 协议) –> grpc on kestrel server

这里主要记录 部署过程 grpc 项目 使用 标准 模板 helloworld

grpc on kestrel server 配置

运行 vs2019 pre 2 内置的模板创建 一个 .net core grpc 项目
项目创建完成后 你就有一个 跑在 kestrel 上的 grpc server了

CaddyServer Http/2 反代协议 需要 kestrel 跑在 TLS https 下 如果kestrel 跑在http 下 Caddy会自动降级 http1 处理反代协议,所以 我们需要先把 本地 dotnet dev cert 证书 导入kestrel 我们先把

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
//webBuilder.UseUrls("https://localhost:50051")
webBuilder.ConfigureKestrel(options =>
{
options.Limits.MinRequestBodyDataRate = null;
options.Listen(IPAddress.Any, 50051, listenOptions =>
{
listenOptions.Protocols = Microsoft.AspNetCore.Server.Kestrel.Core.HttpProtocols.Http2;

//我们使用ASP.NET核心开发证书
listenOptions.UseHttps();

//或者我们可以使用.pfx格式的自己的证书 X509Certificate2
//listenOptions.UseHttps(cert);
});
});
webBuilder.UseSerilog();
webBuilder.UseStartup<startup>();</startup>

});

这里 grpc kestrel server 已经配置完成 可以通过 vs 拉起 黑屏运行了

CaddyServer 配置

Caddyfile 配置
主要就是加载 pem 证书 配置比较简单 直接贴 Caddyfile 了

https://localhost:8080

tls  ../localhostpubliccert.pem ../localhostprivatekey.pem

proxy / https://localhost:50051 {

}

grpc client 实现

grpc client 需要修改的是 默认Channel 使用了 非 TLS 安全传输访问通道 我们需要 修改成 加载证书的版本

//Channel channel = new Channel(“localhost:50051”, ChannelCredentials.Insecure);

string rootpath = AppDomain.CurrentDomain.BaseDirectory;
var filepath = Path.Combine(rootpath, "localhostdevcert.pem");
string pem = File.ReadAllText(filepath);

SslCredentials secureCredentials = new SslCredentials(pem);
Channel secureChannel = new Channel("localhost", 8080, secureCredentials);

var client = new Greeter.GreeterClient(secureChannel);

openssl 转换 localhsot 开发证书 格式

  • 开发证书安装
    dotnet dev-certs https –trust
  • 通过 MMC 导出 开发证书 保存成 .pfx 二进制的证书文件  
  • .pfx 转换 成 pem 格式的证书

安装 openssl 工具 转换 证书的格式 CaddyServer 需要 pem 格式的证书

证书和私钥

openssl pkcs12 -in d:\localhostdevcert.pfx -out d:\localhostdevcert.pem -nodes

私钥

openssl pkcs12 -in d:\localhostdevcert.pfx -nocerts -out d:\localhostprivatekey.pem -nodes

证书

openssl pkcs12 -in d:\localhostdevcert.pfx -nokeys -out d:\localhostpubliccert.pem -nodes

demo 源码

github rep

ps 引用参考

开发证书

Protocols in ASP .NET Core: HTTPS and HTTP/2