配置HTTPS证书

通过配置HTTPS证书,可以为部署在MSE Ingress网关上的业务实现传输层安全协议(TLS/SSL)加密,这是保护现代Web应用和API服务数据安全的关键措施之一。通过使用HTTPS证书,可以确保与网关进行通信的客户端和服务器之间的数据传输是经过加密保护的,有效防止未经授权的第三方窃取或篡改敏感信息,并提供强大的防御措施来抵御中间人攻击。

前提条件

配置方式介绍

MSE Ingress支持两种方式配置HTTPS证书:K8s Secret方式和MSE控制台方式。

重要

对于同一域名,MSE控制台方式优先级高于K8s Secret方式。

对比项

K8s Secret方式

MSE控制台方式

适用场景

  • 通过声明式配置的方式统一管理证书。

  • 结合CI/CD流水线或Cert-Manager工具自动化管理证书。

  • 通过阿里云数字证书中心控制台统一管理证书。

  • 证书同时作用于多个云产品上,例如WAF、SLB等产品。

  • 有批量部署、更换证书的诉求。

优先级

低。

高。

跨命名空间

不支持。

支持。

更新证书

替换K8s Secret内容。

MSE控制台更换证书,或者在阿里云数字证书中心控制台通过部署方式替换证书。

部署后端服务

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态

  3. 单击使用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

K8s Secret方式

您可以通过Ingress原生语义引用K8s Secret的方式为域名配置HTTPS证书。

  1. 准备域名证书。本文以自签名证书为例。

    说明

    生产场景中,您需要替换为业务真实的密钥和证书,可以从阿里云数字证书中心控制台中下载域名的密钥和证书。

    1. 执行如下命令,生成一个证书文件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"
    2. 创建Secret存放TLS证书。

      1. 登录容器服务管理控制台,在左侧导航栏选择集群

      2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择配置管理 > 保密字典

      3. 单击创建。在创建面板,设置名称为tls-test,选择类型TLS证书,将创建好的tls.crt和tls.key复制到对应的输入框中,然后单击创建

      image.png

  2. 部署后端服务

  3. 创建MSE Ingress并为域名foo.bar.com配置HTTPS证书。

    1. 在左侧导航栏,选择网络 > 路由

    2. 路由页面,单击创建 Ingress

    3. 创建 Ingress对话框中,选择网关类型MSE云原生网关,并配置后端关联的服务注解证书等信息,然后单击确定

      其中Ingress Classmse,配置路由为前缀匹配,路径为/,转发请求到服务httpbin,域名的证书通过引用K8s Secret进行配置。

      16621a99be546fbf7a3f98d7013cfeda

  4. 测试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中同时为同一个域名配置证书,那么优先使用控制台配置的证书。

  1. 准备域名证书。本文以自签名证书为例。

    说明

    生产场景中,您需要替换为业务真实的密钥和证书,可以从阿里云数字证书中心控制台中下载域名的密钥和证书。

    1. 执行如下命令,生成一个证书文件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证书。如果您的证书已托管在阿里云数字证书中心,则进行下一步。

  2. 部署后端服务

  3. 创建域名并配置证书。

    1. 登录MSE网关管理控制台,并在顶部菜单栏选择地域。

    2. 在左侧导航栏,选择云原生网关 > 网关列表,单击目标网关名称。

    3. 在左侧导航栏,单击域名管理

    4. 单击创建域名。添加域名foo.bar.com,协议设置为HTTPS,选择对应的证书。

      image.png

  4. 创建MSE Ingress。

    1. 登录容器服务管理控制台,在左侧导航栏选择集群

    2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择网络 > 路由

    3. 路由页面,单击创建 Ingress

    4. 创建 Ingress对话框中,选择网关类型MSE云原生网关,并配置后端关联的服务注解证书等信息,然后单击确定

      其中Ingress Classmse,配置路由为前缀匹配,路径为/,转发请求到服务httpbin

      说明

      此处无需配置TLS证书。

      image.png

  5. 测试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