概述
云原生网关作为代理服务接收下游服务(DownStream)请求,并转发到上游服务(Upstream);对于上游服务来说,云原生网关收敛了外部的请求,统一经过网关转发到上游。从安全角度考虑,上游服务可以添加认证鉴权规则实现对网关的身份认证和访问鉴权,确保上游服务安全性;其中一种实现方式就是在上游服务配置TLS策略,要求网关转发请求时提供客户端证书,实现对网关的身份认证,具体流程如下:
云原生网关支持配置证书,用于实现请求后端服务时服务端对网关的证书认证,本文说明具体配置流程。
前提条件
- 部署后端HTTPS服务,并配置要求请求客户端提供证书;
- 已开通云原生网关实例;
部署后端服务
我们采用云容器引擎部署后端服务,镜像采用我们的demo应用(已配置证书,并要求客户端请求时提供证书),部署完成后在云容器引擎控制台可以看到容器启动:
还需要部署关联到工作负载的Service,用于暴露工作负载,如下:
使用云原生网关配置路由转发
首先进入云原生网关控制台服务来源菜单下,添加云容器引擎服务来源,选择我们部署了后端服务的云容器引擎集群,添加完成后如下所示:
进入 服务列表-> 创建服务 功能,选择从容器创建后端服务,选择我们部署的命名空间和服务,服务协议选择HTTPS(暂时先关闭mTLS选项),如下:
创建完成后,服务如下:
进入 路由配置-> 创建路由 页面,配置路由转发规则(匹配路径/api/1/reviews,请求转发到上面创建的服务)如下:
结果验证
通过云原生网关访问接口http://192.168.4.96:27151/api/1/reviews
curl http://192.168.4.96:27151/api/1/reviews -sv
* Trying 192.168.4.96:27151...
* Connected to 192.168.4.96 (192.168.4.96) port 27151 (#0)
> GET /api/1/reviews HTTP/1.1
> Host: 192.168.4.96:27151
> User-Agent: curl/7.71.1
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 502 Bad Gateway
< Date: Tue, 30 Jan 2024 08:07:10 GMT
< Content-Type: text/html; charset=utf-8
< Content-Length: 154
< Connection: keep-alive
<
<html>
<head><title>502 Bad Gateway</title></head>
<body>
<center><h1>502 Bad Gateway</h1></center>
<hr><center>openresty</center>
</body>
</html>
* Connection #0 to host 192.168.4.96 left intact
可以看到请求报错了,后台查看debug日志可以看到错误信息如下(SSL握手报错):
sslv3 alert bad certificate:SSL alert number 42) while SSL handshaking to upstream
mTLS证书配置&验证
进入服务列表菜单,编辑刚才创建的服务,开启服务mTLS认证并上传相关证书,如下:
保存后再次请求接口,可以看到返回了正确的结果:
curl http://192.168.4.96:27151/api/1/reviews -sv
* Trying 192.168.4.96:27151...
* Connected to 192.168.4.96 (192.168.4.96) port 27151 (#0)
> GET /api/1/reviews HTTP/1.1
> Host: 192.168.4.96:27151
> User-Agent: curl/7.71.1
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200
< Content-Type: application/json
< Transfer-Encoding: chunked
< Connection: keep-alive
< Date: Tue, 30 Jan 2024 08:13:57 GMT
<
* Connection #0 to host 192.168.4.96 left intact
[{"id":1,"productId":1,"reviewer":"Reviewer1","text":"This is the 1st reviewer"}]