配置HTTPS证书

更新时间:
复制为 MD 格式

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

前提条件

  • 拥有可信的数字证书。可通过以下三种途径获取数字证书:

    • 从阿里云数字证书中心购买证书。具体操作请参见购买正式证书

    • 从其他CA机构购买的证书。

    • 本地生成自签名证书。

配置方式介绍

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

对比项

K8s Secret方式

MSE控制台方式

适用场景

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

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

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

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

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

优先级

跨命名空间

不支持。

支持。

更新证书

替换K8s Secret内容。

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

安装MSE Ingress Controller

前提条件

MSE Ingress Controller 支持在ACK 托管版,ACK ServerlessACS 容器计算服务产品中安装。

安装步骤

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

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,单击组件管理

  3. 组件管理页面的搜索框中输入mse搜索,在MSE Ingress Controller组件卡片中单击安装

  4. 安装组件 MSE Ingress Controller对话框中进行参数配置,然后单击确认

    说明

    支持新建或者使用已有MSE云原生网关实例。

    如果在安装组件的过程中出现前置检查失败,可以MSE Ingress Controller授予权限

  5. 组件安装成功之后,将默认创建名称为mse-ingress-premium-{clusterid}MseIngressConfig资源和名称为mse-ingress-premium-{clusterid}的网关实例。

    可前往工作负载 > 自定义资源,选择资源对象浏览器页签,在API中搜索mse。单击MseIngressConfig操作列的YAML编辑,查询MseIngressConfig的状态。等待3~5分钟后确保phase状态为Listening则表示云原生网关创建成功,处于运行状态,并自动监听集群中IngressClassmseIngress资源。如果在YAML编辑页面中未能看到MSE实例的status,需确认集群是否已正确创建节点池。

    MseIngressConfig会按照Pending > Running > Listening的状态依次变化。各状态说明如下:

    • Pending:表示云原生网关正在创建中,需等待3分钟。

    • Running:表示云原生网关创建成功,并处于运行状态。

    • Listening:表示云原生处于运行状态,并监听集群中Ingress资源。

    • Failed:表示云原生网关处于非法状态,可以查看Status字段中Message进一步明确原因。

    重要
    • 新建模式下,安装MSE Ingress Controller将默认创建一个MseIngressConfig资源,该资源的生命周期与MSE云原生网关实例绑定。删除MseIngressConfig资源将删除对应的MSE云原生网关实例,请勿随意删除MseIngressConfig资源。

    • 在安装MSE Ingress Controller之前,如果集群中已经存在了名称为mseIngressClass资源,则安装MSE Ingress Controller时不会自动创建MseIngressConfig资源和MSE云原生网关实例。

部署后端服务

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

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

  3. 无状态页面,单击使用YAML创建资源。使用如下YAML部署一个名为httpbinDeployment,以及一个名为httpbinService。

    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证书。

  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.crttls.key复制到对应的输入框中,然后单击创建

      image.png

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

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

    2. 路由页面,单击创建 Ingress,在创建 Ingress对话框配置路由。

      配置项

      说明

      示例值

      网关类型

      选择MSE Ingress。关于三种网关的差异,请参见Nginx Ingress、ALB IngressMSE 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,请执行如下操作。

        1. 保密字典右侧,单击创建

        2. 创建 Secret对话框,自定义保密字典的名称CertKey,然后单击确定

        3. 保密字典的下拉框,选择已创建的Secret。

      单击+ 新增TLS配置,可配置多条TLS。

      • 域名:demo.alb.ingress.top

      • 保密字典:tls-test

      image

    3. 其他配置保持默认,配置完成,在创建Ingress页面的左下角,单击确定。

  3. 测试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. 准备域名证书,并上传证书至阿里云数字证书中心。具体操作,请参见上传、同步和共享SSL证书。如果证书已托管在阿里云数字证书中心,可忽略此步骤。

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

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

    2. 在左侧导航栏,选择云原生网关 > 网关列表,单击目标网关实例ID

    3. 在左侧导航栏,单击路由管理,然后选择域名页签。

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

  3. 创建服务。

    1. MSE实例路由管理页面选择服务页签,单击创建服务

    2. 服务来源选择容器服务命名空间根据实际情况选择,在服务列表中勾选先前步骤创建的httpbin服务,单击确定

  4. 创建路由。

    1. MSE实例路由管理页面选择路由页签,单击创建路由

    2. 域名选择步骤2中添加的域名,后端服务选择步骤3中创建的服务,单击保存并发布

  5. 测试HTTPS流量。使用如下命令测试流量,请将x.x.x.x替换为真实网关IP。可以前往网关实例基本概览 > 接入点处查看网关IP地址。

    说明

    如果使用的是自签证书且域名未在DNS服务商备案,需要通过--resolve手动解析域名到网关IP,通过-k跳过证书合法性校验。

    将<Your-DomainName>替换为实际的域名。

    curl -v -k https://<Your-DomainName>/version --resolve "<Your-DomainName>:443:x.x.x.x"

    预期输出如下所示:

    * Connected to ********** (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=*********; O=**********
    *  start date: Jan 17 06:47:23 2024 GMT
    *  expire date: Jan 16 06:47:23 2025 GMT
    *  issuer: CN=**********; O=**********
    *  SSL certificate verify result: self signed certificate (18), continuing anyway.
    > GET /version HTTP/1.1
    > Host: **********
    > 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