通過配置HTTPS認證,可以為部署在MSE Ingress網關上的業務實現傳輸層安全性通訊協定(TLS/SSL)加密,這是保護現代Web應用和API服務資料安全的關鍵措施之一。通過使用HTTPS認證,可以確保與網關進行通訊的用戶端和伺服器之間的資料轉送是經過加密保護的,有效防止未經授權的第三方竊取或篡改敏感資訊,並提供強大的防禦措施來抵禦中間人攻擊。
前提條件
通過MSE Ingress完成服務對外暴露。具體操作,請參見通過MSE Ingress訪問Container Service ACK、通過MSE Ingress訪問Container Service ACK Serverlsess。
擁有可信的數位憑證。您可以從以下三個途徑擷取數位憑證:
從阿里雲數位憑證中心購買認證。具體操作,請參見購買正式認證。
從其他CA機構購買的認證。
本地產生自我簽署憑證。
配置方式介紹
MSE Ingress支援兩種方式配置HTTPS認證:K8s Secret方式和MSE控制台方式。
對比項 | K8s Secret方式 | MSE控制台方式 |
適用情境 |
|
|
優先順序 | 低 | 高 |
跨命名空間 | 不支援。 | 支援。 |
更新認證 | 替換K8s Secret內容。 | MSE控制台更換認證,或者在阿里雲數位憑證中心控制台通過部署方式替換認證。 |
部署後端服務
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在無狀態頁面,單擊使用YAML建立資源。使用如下YAML部署一個名為httpbin的Deployment,以及一個名為httpbin的Service。
apiVersion: apps/v1 kind: Deployment metadata: name: httpbin namespace: default spec: replicas: 1 selector: matchLabels: app: httpbin template: metadata: labels: app: httpbin version: v1 spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/mse-ingress/go-httpbin args: - "--version=v1" imagePullPolicy: Always name: httpbin --- apiVersion: v1 kind: Service metadata: name: httpbin namespace: default spec: ports: - port: 8080 protocol: TCP selector: app: httpbin
配置HTTPS認證
K8s Secret方式
您可以通過Ingress原生語義引用K8s Secret的方式為網域名稱配置HTTPS認證。
準備網域名稱認證。本文以自我簽署憑證為例。
說明生產情境中,您需要替換為業務真實的密鑰和認證,可以從阿里雲數位憑證中心控制台中下載網域名稱的密鑰和認證。
執行如下命令,產生一個認證檔案tls.crt和一個私密金鑰檔案tls.key。
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=foo.bar.com/O=foo.bar.com"建立Secret存放TLS認證。
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
單擊建立。在建立面板,設定名稱為tls-test,選擇類型為TLS認證,將建立好的tls.crt和tls.key複製到對應的輸入框中,然後單擊建立。

建立MSE Ingress並為網域名稱foo.bar.com配置HTTPS認證。
在左側導覽列,選擇網路 > 路由。
在路由頁面,單擊建立 Ingress,在建立 Ingress對話方塊配置路由。
配置項
說明
樣本值
網關類型
選擇MSE Ingress。關於三種網關的差異,請參見Nginx Ingress、ALB Ingress和MSE Ingress對比。
MSE Ingress
名稱
自訂路由名稱。
test
Ingress Class
選擇相關的資源類。
mse
規則
單擊+ 添加規則可新增多個路由規則。
網域名稱:自訂網域名。
路徑映射:配置如下配置項。
路徑:指定服務訪問的URL路徑。
匹配規則:
首碼匹配(Prefix):匹配請求URL路徑的首碼部分。
完整匹配(Exact):完全符合請求URL路徑。
預設(ImplementationSpecific):由Ingress控制器實現的具體邏輯決定。
更多詳情請參見ALB Ingress服務進階用法。
服務名稱:選擇目標服務,即K8s內的Service。
連接埠:選擇服務需要暴露的連接埠。
Ingress支援同一個網域名稱下配置多條路徑。單擊+ 添加路徑新增路徑。
網域名稱:foo.bar.com
路徑映射:
路徑:/
匹配規則:首碼匹配(Prefix)
服務名稱:httpbin
連接埠:8080
TLS配置
開啟TLS配置開關,配置安全的路由服務。
網域名稱:自訂網域名。
保密字典:根據需要選擇對應的保密字典。
說明
值為空白時,為自動探索形式配置認證。
如果您需要建立Secret,請執行如下操作。
在保密字典右側,單擊建立。
在建立 Secret對話方塊,自訂保密字典的名稱、Cert、Key,然後單擊確定。
在保密字典的下拉框,選擇已建立的Secret。
單擊+ 新增TLS配置,可配置多條TLS。
網域名稱:demo.alb.ingress.top
保密字典:tls-test

其他配置保持預設,配置完成,在建立Ingress頁面的左下角,單擊確定。
測試HTTPS流量。通過如下命令測試流量,請將x.x.x.x替換為您的真實網關IP。您可以在Ingress列表頁看到網關IP地址。
說明由於本文樣本使用的是自簽認證,且網域名稱未在DNS服務商備案,所以需要通過
--resolve手動解析網域名稱到網關IP,通過-k跳過認證合法性校正。curl -v -k https://foo.bar.com/version --resolve "foo.bar.com:443:x.x.x.x"預期輸出如下所示:
* Connected to foo.bar.com (X.X.X.X) port 443 (#0) * ALPN, offering h2 * ALPN, offering http/1.1 * successfully set certificate verify locations: * CAfile: /etc/ssl/cert.pem CApath: none * TLSv1.2 (OUT), TLS handshake, Client hello (1): * TLSv1.2 (IN), TLS handshake, Server hello (2): * TLSv1.2 (IN), TLS handshake, Certificate (11): * TLSv1.2 (IN), TLS handshake, Server key exchange (12): * TLSv1.2 (IN), TLS handshake, Server finished (14): * TLSv1.2 (OUT), TLS handshake, Client key exchange (16): * TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1): * TLSv1.2 (OUT), TLS handshake, Finished (20): * TLSv1.2 (IN), TLS change cipher, Change cipher spec (1): * TLSv1.2 (IN), TLS handshake, Finished (20): * SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256 * ALPN, server accepted to use http/1.1 * Server certificate: * subject: CN=foo.bar.com; O=foo.bar.com * start date: Jan 17 06:47:23 2024 GMT * expire date: Jan 16 06:47:23 2025 GMT * issuer: CN=foo.bar.com; O=foo.bar.com * SSL certificate verify result: self signed certificate (18), continuing anyway. > GET /version HTTP/1.1 > Host: foo.bar.com > User-Agent: curl/7.64.1 > Accept: */* > < HTTP/1.1 200 OK < date: Wed, 17 Jan 2024 07:49:39 GMT < content-length: 53 < content-type: text/plain; charset=utf-8 < req-cost-time: 3 < req-arrive-time: 1705477779046 < resp-start-time: 1705477779049 < x-envoy-upstream-service-time: 2 < server: istio-envoy < version: v1 hostname: httpbin-xxxxxx
MSE控制台方式
您可以直接在MSE控制台為網域名稱配置認證,通過該方式您不再需要在Ingress上引用K8s Secret,只需配置路由規則即可。
對於同一網域名稱,MSE控制台方式優先順序高於K8s Secret方式。如果您在MSE控制台和K8s Ingress中同時為同一個網域名稱配置認證,那麼優先使用控制台配置的認證。
準備網域名稱認證。本文以自我簽署憑證為例。
說明生產情境中,您需要替換為業務真實的密鑰和認證,可以從阿里雲數位憑證中心控制台中下載網域名稱的密鑰和認證。
執行如下命令,產生一個認證檔案tls.crt和一個私密金鑰檔案tls.key。
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=foo.bar.com/O=foo.bar.com"b. 上傳自我簽署憑證至阿里雲數位憑證中心。具體操作,請參見上傳和共用SSL認證。如果您的認證已託管在阿里雲數位憑證中心,則進行下一步。
建立網域名稱並配置認證。
登入MSE網關管理主控台,並在頂部功能表列選擇地區。
在左側導覽列,選擇云原生网关 > 网关列表,單擊目標網關名稱。
在左側導覽列,單擊路由管理,然後選擇網域名稱頁簽。
單擊建立網域名稱。添加網域名稱foo.bar.com,協議設定為HTTPS,選擇對應的認證。

建立MSE Ingress。
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在路由頁面,單擊建立 Ingress。
在建立 Ingress對話方塊中,選擇網關類型為MSE Ingress,並配置後端關聯的服務名稱、註解等資訊,然後單擊確定。
其中Ingress Class為mse,配置路由為首碼匹配,路徑為
/,轉寄請求到服務httpbin。說明此處無需配置TLS認證。

測試HTTPS流量。使用如下命令測試流量,請將x.x.x.x替換為您的真實網關IP。您可以在Ingress列表頁看到網關IP地址。
說明由於本文樣本使用的是自簽認證,且網域名稱未在DNS服務商備案,所以需要通過
--resolve手動解析網域名稱到網關IP,通過-k跳過認證合法性校正。curl -v -k https://foo.bar.com/version --resolve "foo.bar.com:443:x.x.x.x"預期輸出如下所示:
* Connected to foo.bar.com (X.X.X.X) port 443 (#0) * ALPN, offering h2 * ALPN, offering http/1.1 * successfully set certificate verify locations: * CAfile: /etc/ssl/cert.pem CApath: none * TLSv1.2 (OUT), TLS handshake, Client hello (1): * TLSv1.2 (IN), TLS handshake, Server hello (2): * TLSv1.2 (IN), TLS handshake, Certificate (11): * TLSv1.2 (IN), TLS handshake, Server key exchange (12): * TLSv1.2 (IN), TLS handshake, Server finished (14): * TLSv1.2 (OUT), TLS handshake, Client key exchange (16): * TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1): * TLSv1.2 (OUT), TLS handshake, Finished (20): * TLSv1.2 (IN), TLS change cipher, Change cipher spec (1): * TLSv1.2 (IN), TLS handshake, Finished (20): * SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256 * ALPN, server accepted to use http/1.1 * Server certificate: * subject: CN=foo.bar.com; O=foo.bar.com * start date: Jan 17 06:47:23 2024 GMT * expire date: Jan 16 06:47:23 2025 GMT * issuer: CN=foo.bar.com; O=foo.bar.com * SSL certificate verify result: self signed certificate (18), continuing anyway. > GET /version HTTP/1.1 > Host: foo.bar.com > User-Agent: curl/7.64.1 > Accept: */* > < HTTP/1.1 200 OK < date: Wed, 17 Jan 2024 08:16:27 GMT < content-length: 46 < content-type: text/plain; charset=utf-8 < req-cost-time: 5 < req-arrive-time: 1705479387567 < resp-start-time: 1705479387573 < x-envoy-upstream-service-time: 4 < server: istio-envoy < version: v1 hostname: httpbin-xxxxxx