.net core 使用grpc Https总结
最近想把网站的一个服务独立出来专门提供数据用,交互用grpc,服务发现用consul,运行环境用docker 。
现在问题来了,首先,grpc传输使用http2协议,http2协议需要https,在内网情况下我们可能不想用https,那么grpc也是可以使用http的,参考:Http2UnencryptedSupport ,通过配置服务端监听协议为http2,同时配置客户端,则可以使用http协议调用grpc。
服务端的appsettings可以添加如下配置监听协议:
"Kestrel": { "EndpointDefaults": { "Protocols": "Http2" } }
客户端在Programs添加如下代码:
AppContext.SetSwitch( "System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
接下来的问题是,我的grpc服务希望通过consul来发现,但是consul的心跳检测是不支持http2的。也就是说,我的grpc服务必须同时接受http/http2的协议访问。.net core能不能支持呢?
其实是可以的,参考:ListenOptions.Protocols 。也就是把上面的 "Protocols": "Http2" 改成 "Protocols": "Http1AndHttp2" 。但是文章里面又说了Http1AndHttp2使用条件:"HTTP/2 要求客户端在 TLS 应用层协议协商 (ALPN) 握手过程中选择 HTTP/2;否则,连接默认为 HTTP/1.1。"
也就是说使用grpc访问服务时使用的是http地址的话,是用不了http2协议的。。。
那怎么办呢?我的考虑是
1.不使用consul了,直接访问grpc服务,这不符合我的需求
2,只能上https了。使用https又有两种方式,首先是用dev的证书,也就是地址是localhost的证书,这个.net core自己就能签名,由于我的服务是运行在docker中,那就意味着localhost的话我所有的服务都需要在dockerker里同一个network下面,这个很好解决,证书也容易获取。
最后我选择的是另一种方式,那就是自签名证书。在windows下安装openssl,并自签名一个链式三级证书: CA证书>中间证书>服务证书。 最后的服务证书指向的是grpc服务的ip地址。windows 下openssl的安装参考:这里 。链式证书的生成参考:这里。
不需要三级证书这么麻烦的话其实可以直接生成服务证书作为根证书。
接下来说一下部署到docker上要注意的:
服务端的话,.netcore的证书需要 pfx格式,所以openssl生成的证书还要转换成pfx,然后配置到docker中:参考
我是使用docker-compose部署的,所以需要在yml中添加环境变量:
environment: - "ASPNETCORE_Kestrel__Certificates__Default__Path=/https/your.pfx" - "ASPNETCORE_Kestrel__Certificates__Default__Password=yourpassword" - "ASPNETCORE_URLS=https://+;http://+"
grpc客户端需要信任刚刚生成的证书,客户端是跑在windows,那么双击证书安装就可以了,想要查看windows下的证书,可以打开命令行,输入mmc命令。如果是在docker,那么还需要把证书拷进去更新,我的客户端dockerfile添加了这两段命令:
COPY "your.crt" "/usr/local/share/ca-certificates" RUN update-ca-certificates
意思是把证书拷到ca-certificates目录下,并执行 更新命令。
最后,再说下我的一个经验:自签名的证书在chrome下是不信任的,网上有教程可以添加信任。这一点 ie做得比较好,添加信任证书后IE是可以直接打开签名的https网站且没有警告的。
还有一个是客户端环境没有添加信任自签名证书的话.net core程序是会报错的,大意就是证书不信任。但是我在测试吊中间销证书时发现.netcore 还是能正常访问已经被吊销证书的网站,而用IE打开的话IE会提示证书已经被吊销,这个问题暂时不知道如何处理。
如何吊销证书可以看:openssl生成证书链多级证书、证书吊销列表(CRL)