在ASM网关中使用数字证书管理服务提供的SSL证书

数字证书管理服务(Certificate Management Service)是阿里云提供的证书颁发和管理平台,您可以直接在数字证书管理服务控制台上将证书部署到您的数据面集群,此证书同样可以在ASM网关上使用。本文介绍如何在ASM网关中使用数字证书管理服务提供的SSL证书。

前提条件

步骤一:为数字证书管理服务授予指定权限

数字证书管理服务会使用AliyunCASDefaultRole访问并操作ACK集群,需要提前为该角色进行授权。

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

  2. 选择RAM 角色页签,在输入框中输入AliyunCASDefaultRole,单击管理权限

    若提示AliyunCASDefaultRole 不存在,请先为数字证书管理服务创建RAM角色并授权
  3. 权限管理弹框中单击+ 添加权限,在集群列的下拉框中选择要操作的集群名称,在命名空间列的下拉框中选择istio-system,在权限管理列的下拉框中选择受限用户。

  4. 单击提交授权

步骤二:部署证书到ACK集群

本文使用的证书域名为test.com,您可以根据实际需要进行修改。

  1. 部署证书。

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

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

    3. SSL证书管理页面,单击对应的证书页签,并在证书列表的操作列,单击部署

      通过私有CA服务签发的证书会同步至上传证书页签,您可以在该页签进行操作。

    4. 创建任务页面的选择资源引导页,选择或调整对应的云产品和资源(支持选择一个或多个云产品及对应资源),单击预览并提交

      • 系统会根据您选择的SSL证书智能匹配已经配置过SSL证书的云产品资源,您可以在智能匹配提示对话框,单击确定,系统会将匹配到的云产品资源添加到已选择资源区域,随后您可以根据需求对已选择的云产品资源进行调整。

        image

      • 系统会自动识别并拉取所有云产品中的资源,如果您在对应的云产品中未找到目标资源,请您确认以下事项:

        • 资源总数区域确认资源是否已完成同步,如果资源正在同步中(如图示灰色状态),请您耐心等待资源同步完成。资源同步时间取决于您的当前云产品的资源数。

          image

        • 如果云产品资源同步完成后仍然没有找到对应资源,请您确认是否满足证书部署前提条件

    5. 任务预览面板,确认部署的证书实例和云产品资源信息,如无问题,单击提交

      预览页面会显示对应云产品匹配的证书个数和消耗的部署次数。证书匹配个数为0表示您选择的证书与云产品资源不匹配,会导致部署失败,请您仔细核对选择的证书。

  2. 获取Secret信息。

    kubectl -n istio-system get secret -l alibabacloud.com/ssl-certificate-identifier=${SSL证书的CertIdentifier}

    预期输出:

    NAME                TYPE                DATA   AGE
    cas-cert-305xxx76   kubernetes.io/tls   2      10m

步骤三:更新网关规则

更新部署httpbin应用时创建的网关规则,增加host和上一步创建的Secret。

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: httpbin
  namespace: default
spec:
  selector:
    istio: ingressgateway
  servers:
    - hosts:
        - '*'
      port:
        name: test
        number: 80
        protocol: HTTP
    - hosts:
        - 'test.com'
      port:
        name: https
        number: 443
        protocol: HTTPS
      tls:
        mode: SIMPLE
        credentialName: ${上一步获取到的Secret名称}
EOF

步骤四:测试访问

  1. 获取网关IP。

    export GATEWAY_IP=$(kubectl get service istio-ingressgateway -n istio-system -o jsonpath='{.status.loadBalancer.ingress[0].ip}' )
  2. 发起测试请求。

    curl -vk --resolve test.com:443:${GATEWAY_IP} https://test.com/status/418

    预期输出:

    * Added test.com:443:47.xx.xxx.146 to DNS cache
    * Hostname test.com was found in DNS cache
    *   Trying 47.xx.xxx.146...
    * TCP_NODELAY set
    * Connected to test.com (47.xx.xxx.146) port 443 (#0)
    * ALPN, offering h2
    * ALPN, offering http/1.1
    * successfully set certificate verify locations:
    *   CAfile: /etc/pki/tls/certs/ca-bundle.crt
      CApath: none
    ...
    * SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
    * ALPN, server accepted to use h2
    * Server certificate:
    *  subject: CN=test.com; O=myexample organization
    *  start date: Jul 28 09:19:32 2025 GMT
    *  expire date: Jul 28 09:19:32 2026 GMT
    *  issuer: O=myexample Inc.; CN=test.com
    *  SSL certificate verify result: unable to get local issuer certificate (20), continuing anyway.
    * Using HTTP2, server supports multi-use
    * Connection state changed (HTTP/2 confirmed)
    * Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
    ...
    > GET /status/418 HTTP/2
    > Host: test.com
    > User-Agent: curl/7.61.1
    > Accept: */*
    > 
    ...
    < HTTP/2 418 
    < server: istio-envoy
    < date: Tue, 29 Jul 2025 08:45:10 GMT
    < x-more-info: http://tools.ietf.org/html/rfc2324
    < access-control-allow-origin: *
    < access-control-allow-credentials: true
    < content-length: 135
    < x-envoy-upstream-service-time: 5
    < 
    
        -=[ teapot ]=-
    
           _...._
         .'  _ _ `.
        | ."` ^ `". _,
        \_;`"---"`|//
          |       ;/
          \_     _/
            `"""`
    * Connection #0 to host test.com left intact

    可以看到,请求返回的信息包括了TLS相关信息以及正常的418响应。