管理HTTPS监听的SSL证书

本文旨在协助您有效地管理HTTPS监听的SSL证书,特别是在证书即将到期或已过期等情况下,确保证书的顺利更换。

前提条件

SSL证书管理场景

名词解释

  • 默认证书:仅支持更换,不支持添加或删除。每个监听下的默认证书是唯一的。

  • 扩展证书:支持添加和删除。每个监听下可以有多张扩展证书,具体可添加的证书配额,请参见使用限制

  • 监听证书列表:登录应用型负载均衡ALB控制台可查看监听证书。

  • 新增证书:未包含在当前监听的证书列表中的证书。

管理SSL证书

说明

ALB Ingress Controller v2.18.0-aliyun.1 版本起支持在AlbConfig中通过defaultCertificate字段指定默认证书。详情请参见ALB Ingress Controller变更记录

管理证书场景

自动发现证书

Secret证书

AlbConfig指定证书

新增证书更新为默认证书

方案一(推荐)

通过defaultCertificate指定默认证书

方案一(推荐)

通过defaultCertificate指定默认证书

使用kubectl edit命令更新证书ID。

方案二

登录应用型负载均衡ALB控制台更换默认证书。

方案二
  1. 更新Ingress关联的Secret资源。

  2. 登录应用型负载均衡ALB控制台确认更新后的默认证书符合预期。如需调整,可按照扩展证书更新为默认证书场景操作。

扩展证书更新为默认证书

方案一(推荐)

通过defaultCertificate指定默认证书

方案一(推荐)

通过defaultCertificate指定默认证书

方案一(推荐)

通过defaultCertificate指定默认证书

方案二
  1. 登录应用型负载均衡ALB控制台

  2. 删除扩展证书。

    此操作属于高危操作,请在业务低峰期进行,注意规避风险
  3. 更换默认证书。

方案二
  1. 登录应用型负载均衡ALB控制台

  2. 删除扩展证书。

    此操作属于高危操作,请在业务低峰期进行,注意规避风险
  3. 更换默认证书。

方案二
  1. 登录应用型负载均衡ALB控制台

  2. 删除扩展证书。

    此操作属于高危操作,请在业务低峰期进行,注意规避风险
  3. 更换默认证书。

新增证书更新为扩展证书

主动触发调谐。

更新Ingress关联的Secret资源。

使用kubectl edit命令更新证书ID。

关于自动发现证书、Secret证书和AlbConfig指定证书。三种管理证书详情请参见配置HTTPS证书以实现加密通信

ALB控制台更换默认证书

注意事项

若您希望新增一张不在当前监听证书列表中的证书用于替换当前默认证书,请先核实所需的新证书是否已在阿里云数字证书中心可用。若该证书尚未存在,您可以通过证书中心购买或上传新的SSL证书。更多信息,请参见购买正式证书上传和共享SSL证书

典型场景

  • 当前默认证书已经过期,需要使用新增证书替换已过期的默认证书。

  • 当前默认证书尚未过期,但已决定不再使用当前的默认证书,您可以使用新增证书替换未过期的默认证书。

  • ALB控制台删除扩展证书的操作完成后,将该扩展证书设置为新的默认证书。

操作步骤

  1. 登录应用型负载均衡ALB控制台,在顶部菜单栏处,选择实例所属的地域。

  2. 实例页面,找到目标实例,单击实例ID,在实例详情页签,关闭配置修改保护

    重要

    在关闭配置修改保护后,若通过应用型负载均衡ALB控制台进行监听配置更改,只有在本场景下,默认证书配置才会在下次调谐后被回写至ACK集群。除默认证书配置外,其他的配置更改不会被回写至集群内,这意味着在下一次调谐时,这些未回写的配置将存在被集群调谐时的配置所覆盖的风险。因此,请谨慎进行其他操作。下次调谐后,您可以在集群中执行kubectl describe albconfig [$Albconfig_Name]命令,并查看status字段的内容,以验证默认证书配置的回写是否成功。

  3. 单击监听页签,单击目标监听ID,进入监听详情页面,然后单击监听证书页签。

  4. 服务器证书页签,找到监听默认服务器证书,在操作列单击更换

  5. 在弹出的对话框中,选择您的新增证书,然后单击确定

    该操作完成后,您已成功将当前监听的默认证书更新为新增证书。

    • 若原默认证书仍需保留使用,请在当前服务器证书页面,单击添加扩展证书,将其作为扩展证书重新添加至监听配置。

    • 若确定原默认证书不再需要,并且未被其他实例或监听所引用,请在当前服务器证书页面,单击目标证书操作列的删除,将原默认证书进行清理。如果不进行清理,那么在下一次配置调谐过程中,未过期的原默认证书会作为扩展证书被自动关联到当前的监听。

  6. 开启配置修改保护。

ALB控制台删除扩展证书

此操作涉及先行删除扩展证书再设定为默认证书的步骤。在此过程中(通常持续数秒),若监听证书列表内无其他与该扩展证书绑定域名相同的证书,基于该域名的转发策略将暂时无法找到合适的证书,可能影响相关业务的正常运行。因此,建议您在确保对业务无影响后,再谨慎进行相关操作。

注意事项

在开始删除扩展证书之前,请查看您的监听证书列表。如果当前默认证书与扩展证书的配置与您的预期一致,则无需执行删除扩展证书和更换默认证书的操作。

建议您在执行操作之前,提前在证书中心上传一张与待移除扩展证书绑定域名相同的临时证书,删除扩展证书前,在服务器证书页签单击添加扩展证书,在弹出的对话框中选择您上传的临时证书,确认临时证书状态显示为已关联后,再移除扩展证书,并在更换默认证书结束后删除该临时证书。

典型场景

  • 若当前默认证书已经过期,您可以先删除扩展证书,然后配置ALB控制台更换默认证书将该证书更新为默认证书。

  • 若当前默认证书尚未过期,但您决定不再使用当前的默认证书,您可以删除扩展证书后,配合ALB控制台更换默认证书将该证书更新为默认证书。您可以根据需求决定是否将原默认证书作为扩展证书重新添加至监听配置。

  • ALB Ingress Controller调谐时自动选择的默认证书并非您所期望的证书,您可以删除扩展证书后,配合ALB控制台更换默认证书将该证书更新为默认证书,再将原默认证书作为扩展证书重新添加至监听配置。

操作步骤

  1. 登录应用型负载均衡ALB控制台,在顶部菜单栏处,选择实例所属的地域。

  2. 实例页面,找到目标实例,单击实例ID,在实例详情页签,在实例详情页签,关闭配置修改保护

    重要

    在关闭配置修改保护后,若通过应用型负载均衡ALB控制台进行监听配置更改,只有在配合ALB控制台更换默认证书更新默认证书时,相应证书配置才会在下次调谐后被回写至ACK集群。除证书配置外,其他的配置更改不会被回写至集群内,这意味着在下一次调谐时,这些未回写的配置将存在被集群调谐时的配置所覆盖的风险。因此,请谨慎进行其他操作。下次调谐后,您可以在集群中执行kubectl describe albconfig [$Albconfig_Name]命令,并查看status字段的内容,以验证证书配置的回写是否成功。

  3. 单击监听页签,单击目标监听ID,进入监听详情页面,然后单击监听证书页签。

  4. 服务器证书页签,找到期望删除的扩展证书,在操作列单击删除,然后根据页面提示完成操作。

  5. 开启配置修改保护。

将新增证书更新为扩展证书

主动触发调谐

典型场景

如果您采用的是自动发现证书的管理方式,当您在证书中心购买或上传了新的SSL证书,ALB Ingress Controller组件将不会立即识别到这一变化。只有在执行调谐操作时,ALB Ingress Controller组件才会在证书中心查询、获取证书,并在此过程中发现新的证书。因此,如果您希望新更新的证书能够在ALB Ingress中快速生效,您需要主动发起调谐过程。

说明

当您的证书管理方式为自动发现证书时,请注意Ingress配置文件中spec.rules[].host字段的值需要与spec.tls[].hosts[]字段列出的域名一一对应,这样各个域名才能关联到对应的证书。

操作步骤

  1. 如需触发调谐并更新证书,您可以修改ALB Ingress的相关配置。请根据实际业务需要,从ALB Ingress配置词典中选择配置进行修改。

    如果您不确定当前业务的具体配置需求,建议在IngressYAML文件中添加非关键注解(例如:key_test: value_test),来促使ALB Ingress Controller执行调谐操作。如下所示。

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: demo-https
      namespace: default
      annotations:
        key_test: value_test    # 添加一个无意义注解用于触发调谐。
    spec:
      ingressClassName: alb
      rules:
      - host: demo.alb.ingress.top
        http:
          paths:
          - backend:
              service:
                name: demo-service-https
                port:
                  number: 443
            path: /
            pathType: Prefix
      tls:
      - hosts:
        - demo.alb.ingress.top
  2. 执行以下命令,更新Ingress。

    kubectl apply -f demo.yaml
  3. 执行以下命令,验证是否调谐成功。

    kubectl describe ingress demo-https -n default
  4. (可选)在IngressYAML中删除无意义的Annotation,并执行步骤2中的命令更新Ingress。

更新Ingress关联的Secret资源

典型场景

  • 如果您需要更新当前ALB Ingress中已经生效的Secret资源,那么您可以直接编辑现有Secret资源的YAML配置文件,并将更新后的YAML文件应用至Kubernetes集群,这个操作会自动触发ALB Ingress Controller组件进行调谐,无需额外的人工操作。具体操作,请参见配置HTTPS证书以实现加密通信

  • 如果您需要向当前ALB Ingress添加新的Secret证书,您需要先创建新的Secret资源,然后再修改ALB Ingress资源的配置文件,将新的Secret资源名称添加至TLS对应的secretName字段中。

    1. 创建新的Secret资源。具体操作,请参见配置HTTPS证书以实现加密通信

    2. 将新创建的Secret资源添加至ALB Ingress资源的配置文件。

      IngressYAML中添加新增Secret资源对应的域名及secretName。代码示例如下。

      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: demo-https
        namespace: default
      spec:
        ingressClassName: alb
        rules:
        - host: demo.alb.ingress.top
          http:
            paths:
            - backend:
                service:
                  name: demo-service-https
                  port:
                    number: 443
              path: /
              pathType: Prefix
        - host: newsecret.alb.ingress.top  # 新增域名对应新的Secret资源。
          http:
            paths:
            - backend:
                service:
                  name: demo-service-https
                  port:
                    number: 443
              path: /
              pathType: Prefix
        tls:
        - hosts:
          - demo.alb.ingress.top
          secretName: secret-tls
        - hosts:    
          - newsecret.alb.ingress.top  # 添加新增Secret资源对应的域名。
          secretName: newsecret    # 添加新增Secret资源对应的secretName。

      执行以下命令,更新Ingress。

      kubectl apply -f demo.yaml # 将demo.yaml、替换成您自己的YAML文件。

使用kubectl edit命令更新证书ID

典型场景

当您采用AlbConfig指定证书的管理方式时,如果您在证书中心购买或上传了新的SSL证书,或在证书中心修改老的证书引起证书ID变化后,您可以按照以下操作更新AlbConfig。

操作步骤

  1. 获取证书ID。

    • 登录数字证书管理服务控制台

    • 在左侧导航栏,选择证书管理 > SSL证书管理

    • SSL证书管理页面,单击上传证书页签,在目标证书操作列下点击更多,然后在证书详情面板中获取证书ID

  2. 通过kubectl edit命令进行增量更新。

    1. 执行以下命令,查看AlbConfig名称。

      kubectl -n kube-system get AlbConfig
    2. 执行以下命令,更新对应的AlbConfig。

      kubectl -n <NameSpace> edit AlbConfig <AlbConfig_Name>

      将获取的证书ID更新至YAML。

        #...
        spec:
          config:
            #...
          listeners:
          - caEnabled: false
            certificates:
            #...
            - CertificateId: 756****-cn-hangzhou # 新增证书ID。
              IsDefault: false
            port: 443
            protocol: HTTPS
            #...

AlbConfig中通过defaultCertificate手动指定默认证书

注意事项

  • IsDefault 字段:仅支持在创建时指定默认证书,后续除非必要,系统不会自动变更。若需主动更换默认证书,请使用 defaultCertificate 字段配置。

    listeners:
      - port: 443
        protocol: HTTPS
        certificates:
          - CertificateId: abcdefg-hangzhou
            IsDefault: true
  • defaultCertificate 优先级:defaultCertificate 的优先级高于 certificates.IsDefault,即配置了 defaultCertificate 后,certificates.IsDefault 自动失效。

    ... ...
    listeners:
      - port: 443
        protocol: HTTPS
        defaultCertificate:
          kind: CertIdentifier
          certificateId: 75****-hangzhou
        certificates:
          - CertificateId: 75****-hangzhou
            IsDefault: true
  • 证书匹配优先级:当同一监听端口上同时配置了扩展证书和默认证书时,优先匹配扩展证书,未命中时兜底使用默认证书。

  • ALB Ingress Controller需升级到v2.18.0-aliyun.1或以上版本。详情请参见升级ALB Ingress Controller组件

操作步骤

ALB Ingress Controller v2.18.0-aliyun.1 版本起支持在AlbConfig中通过defaultCertificate字段指定默认证书。详情请参见ALB Ingress Controller变更记录

说明

defaultCertificate.kind 仅支持 CertIdentifier 和 Secret 两种取值。

使用证书 ID(CertIdentifier)方式

当 defaultCertificate.kind 设置为 CertIdentifier 时,需填写对应的证书 ID(certificateId)。示例如下:

apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
  name: alb
spec:
  config:
    addressType: Intranet
    name: alb-test
  listeners:
    - port: 80
      protocol: HTTP
    - port: 443
      protocol: HTTPS     
      defaultCertificate: 
      -  kind: CertIdentifier
         certificateId: 123****-cn-hangzhou    ## 指定目标证书ID。

使用 Secret 方式

当 defaultCertificate.kind 设置为 Secret 时,需指定对应的 secretName 和 secretNamespace,以引用Secret 作为默认证书。示例如下:

apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
  name: alb
spec:
  config:
    addressType: Intranet
    name: xiaosha-alb-test
  listeners:
  - port: 80
    protocol: HTTP
  - port: 443
    protocol: HTTPS                 
    defaultCertificate:
      kind: Secret
      secretName: test-secret       ## 指定目标的secretName。
      secretNamespace: test         ## 指定目标的secretNamespace。

补充说明

  • 当您在证书中心修改证书后(例如,证书续费、追加域名、更换域名后),请注意操作前后证书ID是否改变,若证书ID改变,需要根据您所选择的证书管理方式在ALB Ingress同步触发更新。

  • 如果您同时使用了多种证书配置方式,在更新证书时请注意证书管理方式的兼容性。详细信息,请参见证书管理方式兼容性说明

常见问题

为什么会在调谐过程中出现错误提示:Specified parameter array contains too many items, up to 15 items, Certificates is not valid?

ALB Ingress Controller组件的v2.11.0-aliyun.1版本开始,新增了对证书分页的支持。如果在调谐过程中出现错误提示:Specified parameter array contains too many items, up to 15 items, Certificates is not valid,这表明您当前使用的ALB Ingress Controller组件版本尚未支持证书分页功能,并且您的使用场景中单次调谐尝试关联的证书数量超过了15张的限制。为解决此问题,建议您将ALB Ingress Controller组件升级至最新版本。关于组件的版本信息,请参见ALB Ingress Controller。关于如何升级组件,请参见管理ALB Ingress Controller组件

相关文档