Todos los productos
Search
Centro de documentos

Alibaba Cloud Service Mesh:Habilitar HTTPS en una puerta de enlace de ASM

Última actualización: Sep 12, 2026

Puede habilitar HTTPS en una puerta de enlace de ASM para proporcionar acceso cifrado a los clientes externos. Las puertas de enlace de ASM admiten la carga dinámica de certificados, lo que permite configurar claves privadas, certificados de servidor y certificados raíz en tiempo real. Este método evita reiniciar la puerta de enlace o depender de montajes de volúmenes de Secret, lo que reduce la complejidad operativa y elimina el riesgo de interrupciones del servicio. Las puertas de enlace de ASM pueden supervisar y gestionar varios pares de certificados y claves privadas. Esto proporciona una comunicación flexible y segura para distintos hosts, además de mejorar la seguridad en la transmisión de datos.

Requisitos previos

Contexto

Istio admite la carga dinámica de certificados. La clave privada, el certificado de servidor y el certificado raíz necesarios para Transport Layer Security (TLS) se configuran dinámicamente sin necesidad de reiniciar la puerta de enlace. Una puerta de enlace de ASM supervisa los Secrets en su namespace y los carga de forma dinámica mediante el recurso personalizado (CR) Gateway. El uso de HTTPS en una puerta de enlace de ASM ofrece las siguientes ventajas:

  • La puerta de enlace de entrada puede agregar, eliminar o actualizar dinámicamente los certificados, las claves privadas o los certificados raíz correspondientes sin reiniciarse.

  • No se requieren montajes de volúmenes de Secret. Después de crear un Secret de Kubernetes, la puerta de enlace de ASM lo detecta y envía su certificado, clave privada o certificado raíz a la puerta de enlace de entrada.

  • Una puerta de enlace de ASM puede supervisar varios pares de certificados y claves privadas. Solo necesita crear Secrets para varios hosts y actualizar la configuración de Gateway.

Paso 1: Preparar los certificados y las claves privadas

Al usar un nombre de dominio, es posible que necesite un registro ICP (Internet Content Provider) para garantizar su acceso público. En este tema se usa aliyun.com como ejemplo para generar un certificado y una clave privada, y luego guardarlos como un Secret.

Si ya cuenta con un certificado y una clave privada para aliyun.com, cambie el nombre de la clave a aliyun.com.key y el del certificado a aliyun.com.crt. De lo contrario, utilice openssl para generar un certificado y una clave.

  1. Ejecute el siguiente comando para crear un certificado raíz y una clave privada.

    openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -subj '/O=myexample Inc./CN=aliyun.com' -keyout aliyun.root.key -out aliyun.root.crt 
  2. Ejecute los siguientes comandos para generar un certificado de servidor y una clave privada para aliyun.com.

    openssl req -out aliyun.com.csr -newkey rsa:2048 -nodes -keyout aliyun.com.key -subj "/CN=aliyun.com/O=myexample organization"
    openssl x509 -req -days 365 -CA aliyun.root.crt -CAkey aliyun.root.key -set_serial 0 -in aliyun.com.csr -out aliyun.com.crt
  3. Cree un Secret o un certificado según la versión de su instancia de ASM.

    • Para instancias de ASM anteriores a la v1.17

      Con el kubeconfig del clúster de la puerta de enlace de entrada, ejecute el siguiente comando para crear un Secret que contenga el certificado y la clave privada en el namespace istio-system.

      kubectl create -n istio-system secret tls myexample-credential --key=aliyun.com.key --cert=aliyun.com.crt
      Importante

      El nombre del Secret no debe comenzar con istio ni con prometheus, y no puede contener el campo token.

    • Para instancias de ASM v1.17 y posteriores

      1. Inicie sesión en la consola de ASM. En el panel de navegación izquierdo, seleccione Service Mesh > Mesh Management.

      2. En la página Mesh Management, haga clic en el nombre de la instancia de ASM de destino. En el panel de navegación izquierdo, seleccione ASM Gateways > Certificate Management.

      3. En la página Certificate Management, haga clic en Create. En el panel Certificate Information, establezca los siguientes parámetros y haga clic en OK.

        Parámetro

        Descripción

        Name

        Introduzca un nombre para el certificado. En este ejemplo se utiliza myexample-credential.

        Public Key Certificate

        El contenido del archivo aliyun.com.crt generado en sub-step 2.

        Private Key

        El contenido del archivo aliyun.com.key generado en sub-step 2.

Paso 2: Definir el servicio de backend para a.aliyun.com

El servicio de backend de este ejemplo utiliza NGINX. Para el servicio de backend a.aliyun.com, las solicitudes a la ruta /hello devuelven la cadena Welcome to a.aliyun.com! con un código de estado 200. A continuación se muestra el contenido del archivo myexample-nginx.conf.

events {
}
http {
  log_format main '$remote_addr - $remote_user [$time_local]  $status '
  '"$request" $body_bytes_sent "$http_referer" '
  '"$http_user_agent" "$http_x_forwarded_for"';
  access_log /var/log/nginx/access.log main;
  error_log  /var/log/nginx/error.log;
  server {
    listen 80;
    location /hello {
        return 200 'Welcome to a.aliyun.com!';
        add_header Content-Type text/plain;
    }
  }
}
  1. Con el kubeconfig del clúster de la puerta de enlace de entrada, ejecute el siguiente comando para crear un ConfigMap de Kubernetes con la configuración del servidor NGINX.

    kubectl create configmap myexample-nginx-configmap --from-file=nginx.conf=./myexample-nginx.conf
  2. Habilite la inyección automática del proxy sidecar en el namespace default. Para obtener más información, consulte Enable automatic sidecar proxy injection.

  3. Cree un archivo llamado myexampleapp.yaml con el siguiente contenido. Luego, ejecute el comando kubectl apply -f myexampleapp.yaml para crear el servicio de backend del nombre de dominio a.aliyun.com.

    Ver YAML

    apiVersion: v1
    kind: Service
    metadata:
      name: myexampleapp
      labels:
        app: myexampleapp
    spec:
      ports:
      - port: 80
        protocol: TCP
      selector:
        app: myexampleapp
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: myexampleapp
    spec:
      selector:
        matchLabels:
          app: myexampleapp
      replicas: 1
      template:
        metadata:
          labels:
            app: myexampleapp
        spec:
          containers:
          - name: nginx
            image: nginx
            ports:
            - containerPort: 80
            volumeMounts:
            - name: nginx-config
              mountPath: /etc/nginx
              readOnly: true
          volumes:
          - name: nginx-config
            configMap:
              name: myexample-nginx-configmap

Paso 3: Definir el servicio de backend para b.aliyun.com

El servicio de backend de este ejemplo utiliza httpbin.

  1. Cree un archivo llamado httpbin.example.yaml y copie en él el siguiente contenido.

    Ver YAML

    apiVersion: v1
    kind: Service
    metadata:
      name: httpbin
      labels:
        app: httpbin
    spec:
      ports:
      - name: http
        port: 8000
      selector:
        app: httpbin
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: httpbin
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: httpbin
          version: v1
      template:
        metadata:
          labels:
            app: httpbin
            version: v1
        spec:
          containers:
          - image: docker.io/citizenstig/httpbin
            imagePullPolicy: IfNotPresent
            name: httpbin
            ports:
            - containerPort: 80
  2. Con el kubeconfig del clúster donde reside el pod de la puerta de enlace de entrada, ejecute el siguiente comando para crear el servicio de backend del nombre de dominio b.aliyun.com.

    kubectl apply -f httpbin.example.yaml

Paso 4: Crear un recurso Gateway

  1. Inicie sesión en la consola de ASM. En el panel de navegación izquierdo, seleccione Service Mesh > Mesh Management.

  2. En la página Mesh Management, haga clic en el nombre de la instancia de ASM. En el panel de navegación izquierdo, seleccione ASM Gateways > Gateway. En la página que aparece, haga clic en Create from YAML.

  3. En la página Create, seleccione el namespace de destino (en este ejemplo, default) y cualquier Scenario Template. Luego, introduzca el siguiente YAML y haga clic en Create.

    Ver YAML

    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: mysdsgateway
    spec:
      selector:
        istio: ingressgateway # use istio default ingress gateway
      servers:
      - port:
          number: 443
          name: https
          protocol: HTTPS
        tls:
          mode: SIMPLE
          credentialName: myexample-credential # must be the same as secret
        hosts:
        - '*.aliyun.com'
                                    

    Una vez creado el recurso, la nueva puerta de enlace aparece en la página Gateway.

Paso 5: Crear VirtualServices

  1. Inicie sesión en la consola de ASM. En el panel de navegación izquierdo, seleccione Service Mesh > Mesh Management.

  2. En la página Mesh Management, haga clic en el nombre de la instancia de ASM. En el panel de navegación izquierdo, seleccione Traffic Management Center > VirtualService. En la página que aparece, haga clic en Create from YAML.

  3. En la página Create, seleccione los Namespaces de destino y cualquier Scenario Template. Luego, introduzca el siguiente YAML y haga clic en Create.

    Ver YAML

    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: mysdsgateway-myexamplevs
    spec:
      hosts:
      - "a.aliyun.com"
      gateways:
      - mysdsgateway
      http:
      - match:
        - uri:
            exact: /hello
        route:
        - destination:
            host: myexampleapp.default.svc.cluster.local
            port:
              number: 80      

    Repita este paso para crear un VirtualService para b.aliyun.com.

    Ver YAML

    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: mysdsgateway-httpbinvs
    spec:
      hosts:
      - "b.aliyun.com"
      gateways:
      - mysdsgateway
      http:
      - match:
        - uri:
            prefix: /status
        - uri:
            prefix: /delay
        route:
        - destination:
            port:
              number: 8000
            host: httpbin.default.svc.cluster.local        

    Una vez creados los servicios virtuales, estos aparecen en la página VirtualService.

Comprobar los resultados

Obtener la dirección del servicio de la puerta de enlace de entrada

  • Método 1: Consulte la dirección en ASM console. Inicie sesión en la consola de ASM, seleccione la instancia de Service Mesh de destino y, en el panel de navegación izquierdo, seleccione ASM Gateways > Ingress Gateway. En la página Ingress Gateway, consulte la información necesaria.

  • Método 2: Consulte la dirección en ACK console. Para obtener más información, consulte View the service information about an ingress gateway.

Acceder a la puerta de enlace de entrada desde la línea de comandos

  • Ejecute el siguiente comando para acceder al servicio a.aliyun.com mediante HTTPS.

    curl -k -H Host:a.aliyun.com --resolve a.aliyun.com:443:{REPLACE_WITH_THE_INGRESS_GATEWAY_IP_ADDRESS}  https://a.aliyun.com/hello

    Resultado esperado:

    Welcome to a.aliyun.com!
  • Ejecute el siguiente comando para acceder al servicio b.aliyun.com mediante HTTPS.

    curl -k -H Host:b.aliyun.com --resolve b.aliyun.com:443:{REPLACE_WITH_THE_INGRESS_GATEWAY_IP_ADDRESS}  https://b.aliyun.com/status/418  

    Resultado esperado:

        -=[ teapot ]=-
           _...._
         .'  _ _ `.
        | ."` ^ `". _,
        \_;`"---"`|//
          |       ;/
          \_     _/
            `"""`

Operaciones relacionadas

Actualizar el certificado de la puerta de enlace

Para actualizar el certificado montado en una puerta de enlace, cree un nuevo Secret en el plano de datos y cambie el valor del campo credentialName en el recurso Gateway por el nombre del nuevo Secret. La puerta de enlace monta automáticamente el nuevo Secret. En este ejemplo se muestra cómo crear un Secret llamado new-istio-ingressgateway-certs para el servidor example.com.

  1. Cree un certificado cuyo emisor sea myexample.

    1. En la herramienta OpenSSL, ejecute el siguiente comando para crear un certificado raíz y una clave privada.

      openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -subj '/O=myexample Inc./CN=example.com' -keyout example.root.key -out example.root.crt
    2. Ejecute los siguientes comandos para generar un certificado de servidor y una clave privada para el servidor example.com.

      openssl req -out example.com.csr -newkey rsa:2048 -nodes -keyout example.com.key -subj "/CN=example.com/O=myexample organization"
      openssl x509 -req -days 365 -CA example.root.crt -CAkey example.root.key -set_serial 0 -in example.com.csr -out example.com.crt
    3. Obtain the kubeconfig file of the cluster and use kubectl to connect to the cluster.

    4. Ejecute el siguiente comando para crear un Secret llamado new-istio-ingressgateway-certs.

      kubectl create -n istio-system secret tls new-istio-ingressgateway-certs --key example.com.key --cert example.com.crt
  2. Ejecute el siguiente comando en el clúster para eliminar el Secret del certificado anterior.

    kubectl delete secret  istio-ingressgateway-certs -n istio-system
  3. Actualice el recurso Gateway.

    1. Inicie sesión en la consola de ASM. En el panel de navegación izquierdo, seleccione Service Mesh > Mesh Management.

    2. En la página Mesh Management, haga clic en el nombre de la instancia de ASM. En el panel de navegación izquierdo, seleccione ASM Gateways > Gateway.

    3. En la página Gateway, busque el recurso Gateway de destino y haga clic en View YAML en la columna Actions.

    4. En el cuadro de diálogo edit, cambie el valor de credentialName por el nombre del nuevo Secret del certificado, new-istio-ingressgateway-certs, y haga clic en OK.

  4. Compruebe que el certificado de la puerta de enlace se haya actualizado.

    1. Ejecute el siguiente comando para consultar la información actual del certificado en el clúster.

      kubectl exec istio-ingressgateway-xxxx -n istio-system -- curl localhost:15000/config_dump  > ingressgateway_dump.yaml
    2. Ejecute el siguiente comando para mostrar y buscar el certificado new-istio-ingressgateway-certs.

      cat ingressgateway_dump.yaml | grep new-istio-ingressgateway-certs -A 3

      Resultado esperado:

      "name": "kubernetes://new-istio-ingressgateway-certs",
      "tls_certificate": {
        "certificate_chain": {
          "inline_bytes": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0t...xxx...LS0tLS1FTkQgQ0VSVElGSUNBVEUt"
        }
      }

      Copie el contenido posterior al parámetro inline_bytes para obtener el certificado codificado en Base64.

    3. Ejecute el siguiente comando en su herramienta de línea de comandos local para decodificar el certificado desde Base64.

      echo <Base64-encoded-certificate-content> | base64 --decode
    4. Guarde el contenido decodificado como el archivo test.com.crt.

    5. Ejecute el siguiente comando en la herramienta OpenSSL para consultar la organización del certificado.

      openssl x509 -in test.com.crt -text -noout

      Resultado esperado:

      Certificate:
          Data:
              Version: 1 (0x0)
              Serial Number: 0 (0x0)
              Signature Algorithm: sha256WithRSAEncryption
              Issuer: O = myexample Inc., CN = example.com
              Validity
                  Not Before: Mar 17 03:20:27 2022 GMT
                  Not After : Mar 17 03:20:27 2023 GMT
              Subject: CN = example.com, O = myexample organization

      Como se observa, la organización cambió correctamente a myexample, lo que indica que el certificado de la puerta de enlace se actualizó correctamente.