概述
云原生網關作為代理服務接收下游服務(DownStream)請求,并轉發到上游服務(Upstream);對于上游服務來說,云原生網關收斂了外部的請求,統一經過網關轉發到上游。從安全角度考慮,上游服務可以添加認證鑒權規則實現對網關的身份認證和訪問鑒權,確保上游服務安全性;其中一種實現方式就是在上游服務配置TLS策略,要求網關轉發請求時提供客戶端證書,實現對網關的身份認證,具體流程如下:

云原生網關支持配置證書,用于實現請求后端服務時服務端對網關的證書認證,本文說明具體配置流程。
前提條件
- 部署后端HTTPS服務,并配置要求請求客戶端提供證書;
- 已開通云原生網關實例;
部署后端服務
我們采用云容器引擎部署后端服務,鏡像采用我們的demo應用(已配置證書,并要求客戶端請求時提供證書),部署完成后在云容器引擎控制臺可以看到容器啟動:

還需要部署關聯到工作負載的Service,用于暴露工作負載,如下:

使用云原生網關配置路由轉發
首先進入云原生網關控制臺服務來源菜單下,添加云容器引擎服務來源,選擇我們部署了后端服務的云容器引擎集群,添加完成后如下所示:

進入 服務列表-> 創建服務 功能,選擇從容器創建后端服務,選擇我們部署的命名空間和服務,服務協議選擇HTTPS(暫時先關閉mTLS選項),如下:

創建完成后,服務如下:

進入 路由配置-> 創建路由 頁面,配置路由轉發規則(匹配路徑/api/1/reviews,請求轉發到上面創建的服務)如下:

結果驗證
通過云原生網關訪問接口//192.168.4.96:27151/api/1/reviews
curl //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 //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"}]