通過配置HTTPS證書,可以為部署在MSE Ingress網關上的業務實現傳輸層安全協議(TLS/SSL)加密,這是保護現代Web應用和API服務數據安全的關鍵措施之一。通過使用HTTPS證書,可以確保與網關進行通信的客戶端和服務器之間的數據傳輸是經過加密保護的,有效防止未經授權的第三方竊取或篡改敏感信息,并提供強大的防御措施來抵御中間人攻擊。
前提條件
通過MSE Ingress完成服務對外暴露。具體操作,請參見通過MSE Ingress訪問容器服務 ACK、通過MSE Ingress訪問容器服務 ACK Serverlsess。
擁有可信的數字證書。您可以從以下三個途徑獲取數字證書:
從阿里云數字證書中心購買證書。具體操作,請參見購買SSL證書。
從其他CA機構購買的證書。
本地生成自簽名證書。
配置方式介紹
MSE Ingress支持兩種方式配置HTTPS證書:K8s Secret方式和MSE控制臺方式。
對比項 | K8s Secret方式 | MSE控制臺方式 |
適用場景 |
|
|
優先級 | 低 | 高 |
跨命名空間 | 不支持。 | 支持。 |
更新證書 | 替換K8s Secret內容。 | MSE控制臺更換證書,或者在阿里云數字證書中心控制臺通過部署方式替換證書。 |
部署后端服務
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
單擊使用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證書。
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
單擊創建。在創建面板,設置名稱為tls-test,選擇類型為TLS證書,將創建好的tls.crt和tls.key復制到對應的輸入框中,然后單擊創建。
創建MSE Ingress并為域名foo.bar.com配置HTTPS證書。
在左側導航欄,選擇網絡 > 路由。
在路由頁面,單擊創建 Ingress。
在創建 Ingress對話框中,選擇網關類型為MSE云原生網關,并配置后端關聯的服務、注解和證書等信息,然后單擊確定。
其中Ingress Class為mse,配置路由為前綴匹配,路徑為
/
,轉發請求到服務httpbin,域名的證書通過引用K8s Secret進行配置。
測試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。
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在路由頁面,單擊創建 Ingress。
在創建 Ingress對話框中,選擇網關類型為MSE云原生網關,并配置后端關聯的服務、注解和證書等信息,然后單擊確定。
其中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