All Products
Search
Document Center

Alibaba Cloud Service Mesh:Configure TLS protocol versions on an ASM gateway

Last Updated:Oct 23, 2026

To mitigate security risks from outdated transport layer security (TLS) protocols, you can configure your ASM gateway to enforce modern security standards. By disabling insecure versions such as TLS 1.0 and 1.1 and enabling stronger protocols such as TLS 1.2 and later, you can effectively guard against man-in-the-middle attacks and data breaches, ensuring robust and secure HTTPS connections between your services and clients.

Prerequisites

Background information

Early TLS versions, including TLS v1.0, have known vulnerabilities that can lead to data breaches during transmission. As a security best practice, you should disable outdated TLS versions (v1.0 and v1.1) and enable only TLS 1.2 or later. It is also important to disable weak ciphers within TLS 1.2.

Step 1: Prepare the certificate and private key

This topic uses the domain aliyun.com as an example. Generate a certificate and a private key for the gateway and save them as a Secret. If you already have a certificate and private key for aliyun.com, name the private key aliyun.com.key and the certificate aliyun.com.crt. Otherwise, use openssl to generate them.

  1. Run the following command to create a root certificate and a private key.

    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. Run the following commands to generate a certificate and a private key for the aliyun.com server.

    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. Create a Secret or a certificate based on your ASM instance version.

    • For an ASM instance earlier than 1.17

      Connect to the cluster where your ingress gateway pod is running by using its KubeConfig. Then, run the following command to create a Secret that contains the certificate and private key in the istio-system namespace.

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

      The Secret name cannot start with istio or prometheus and cannot contain the token field.

    • For an ASM instance of version 1.17 or later

      1. Log on to the ASM console. In the left-side navigation pane, choose Service Mesh > Mesh Management.

      2. On the Mesh Management page, click the name of the target instance. In the left-side navigation pane, choose ASM Gateways > Certificate Management.

      3. On the Certificate Management page, click Create. In the Certificate Information panel, configure the parameters and click OK.

        Parameter

        Description

        Name

        Enter a name for the certificate. In this example, use myexample-credential.

        Public Key Certificate

        The content of the aliyun.com.crt file generated in Step 1.2.

        Private Key

        The content of the aliyun.com.key file generated in Step 1.2.

Step 2: Create a gateway rule

  1. Log on to the ASM console. In the left-side navigation pane, choose Service Mesh > Mesh Management.

  2. On the Mesh Management page, click the name of the ASM instance. In the left-side navigation pane, choose ASM Gateways > Gateway. On the page that appears, click Create from YAML.

  3. On the Create page, select the target namespace and a template, and then configure the following YAML.

    This example uses the default namespace. In the YAML configuration, the minProtocolVersion parameter is set to TLSV1_2. This setting disables TLS v1.0 and TLS v1.1.

    apiVersion: networking.istio.io/v1beta1
    kind: Gateway
    metadata:
      name: mysdsgateway
    spec:
      selector:
        istio: ingressgateway
      servers:
        - hosts:
            - '*'
          port:
            name: https
            number: 443
            protocol: HTTPS
          tls:
            credentialName: myexample-credential
            minProtocolVersion: TLSV1_2
            mode: SIMPLE

Step 3: Create a virtual service

  1. On the details page of the ASM instance, choose Traffic Management Center > VirtualService in the left-side navigation pane. On the page that appears, click Create from YAML.

  2. On the Create page, select the target namespace and a template, and then configure the following YAML.

    VirtualService YAML

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: bookinfo-tlsversion-sample
    spec:
      gateways:
        - mysdsgateway-tlsversion-sample
      hosts:
        - '*'
      http:
        - match:
            - uri:
                exact: /productpage
            - uri:
                prefix: /static
            - uri:
                exact: /login
            - uri:
                exact: /logout
            - uri:
                prefix: /api/v1/products
          route:
            - destination:
                host: productpage
                port:
                  number: 9080

Step 4: Verify the TLS version

testssl.sh is a free command-line tool that can check a server's services on any port for supported TLS/SSL ciphers, protocols, and cryptographic flaws. This topic uses testssl.sh to verify the TLS version.

  1. Run the following command to run testssl.sh in a container.

    docker run --rm -ti  registry.cn-hangzhou.aliyuncs.com/acs/testssl.sh https://<gateway_address>/productpage

    Expected output

    Testing protocols via sockets except NPN+ALPN
    
    SSLv2      not offered (OK)
    SSLv3      not offered (OK)
    TLS 1      not offered
    TLS 1.1    not offered
    TLS 1.2    offered (OK)
    TLS 1.3    offered (OK): final
    
    ......
    Running client simulations (HTTP) via sockets
    
    Browser                      Protocol  Cipher Suite Name (OpenSSL)       Forward Secrecy
    ------------------------------------------------------------------------------------------------
    Android 6.0                  TLSv1.2   ECDHE-RSA-AES128-GCM-SHA256       256 bit ECDH (P-256)
    Android 7.0 (native)         TLSv1.2   ECDHE-RSA-AES128-GCM-SHA256       256 bit ECDH (P-256)
    Android 8.1 (native)         TLSv1.2   ECDHE-RSA-AES128-GCM-SHA256       253 bit ECDH (X25519)
    Android 9.0 (native)         TLSv1.3   TLS_AES_128_GCM_SHA256            253 bit ECDH (X25519)
    Android 10.0 (native)        TLSv1.3   TLS_AES_128_GCM_SHA256            253 bit ECDH (X25519)
    Android 11 (native)          TLSv1.3   TLS_AES_128_GCM_SHA256            253 bit ECDH (X25519)
    Android 12 (native)          TLSv1.3   TLS_AES_128_GCM_SHA256            253 bit ECDH (X25519)
    Chrome 79 (Win 10)           TLSv1.3   TLS_AES_128_GCM_SHA256            253 bit ECDH (X25519)
    Chrome 101 (Win 10)          TLSv1.3   TLS_AES_128_GCM_SHA256            253 bit ECDH (X25519)
    Firefox 66 (Win 8.1/10)      TLSv1.3   TLS_AES_128_GCM_SHA256            253 bit ECDH (X25519)
    Firefox 100 (Win 10)         TLSv1.3   TLS_AES_128_GCM_SHA256            253 bit ECDH (X25519)
    IE 6 XP                      No connection
    IE 8 Win 7                   No connection
    IE 8 XP                      No connection
    IE 11 Win 7                  No connection
    IE 11 Win 8.1                No connection
    IE 11 Win Phone 8.1          No connection
    IE 11 Win 10                 TLSv1.2   ECDHE-RSA-AES128-GCM-SHA256       256 bit ECDH (P-256)
    Edge 15 Win 10               TLSv1.2   ECDHE-RSA-AES128-GCM-SHA256       253 bit ECDH (X25519)
    Edge 101 Win 10 21H2         TLSv1.3   TLS_AES_128_GCM_SHA256            253 bit ECDH (X25519)
    Safari 12.1 (iOS 12.2)       TLSv1.3   TLS_CHACHA20_POLY1305_SHA256      253 bit ECDH (X25519)
    Safari 13.0 (macOS 10.14.6)  TLSv1.3   TLS_CHACHA20_POLY1305_SHA256      253 bit ECDH (X25519)
    Safari 15.4 (macOS 12.3.1)   TLSv1.3   TLS_AES_128_GCM_SHA256            253 bit ECDH (X25519)
    Java 7u25                    No connection
    Java 8u161                   TLSv1.2   ECDHE-RSA-AES128-GCM-SHA256       256 bit ECDH (P-256)
    Java 11.0.2 (OpenJDK)        TLSv1.3   TLS_AES_128_GCM_SHA256            256 bit ECDH (P-256)
    Java 17.0.3 (OpenJDK)        TLSv1.3   TLS_AES_256_GCM_SHA384            253 bit ECDH (X25519)
    go 1.17.8                    TLSv1.3   TLS_AES_128_GCM_SHA256            253 bit ECDH (X25519)
    LibreSSL 2.8.3 (Apple)       TLSv1.2   ECDHE-RSA-CHACHA20-POLY1305       253 bit ECDH (X25519)
    OpenSSL 1.0.2e               TLSv1.2   ECDHE-RSA-AES128-GCM-SHA256       256 bit ECDH (P-256)
    OpenSSL 1.1.0l (Debian)      TLSv1.2   ECDHE-RSA-CHACHA20-POLY1305       253 bit ECDH (X25519)
    OpenSSL 1.1.1d (Debian)      TLSv1.3   TLS_AES_256_GCM_SHA384            253 bit ECDH (X25519)
    OpenSSL 3.0.3 (git)          TLSv1.3   TLS_AES_256_GCM_SHA384            253 bit ECDH (X25519)
    Apple Mail (16.0)            TLSv1.2   ECDHE-RSA-AES128-GCM-SHA256       256 bit ECDH (P-256)
    Thunderbird (91.9)           TLSv1.3   TLS_AES_128_GCM_SHA256            253 bit ECDH (X25519)

    The expected output shows that TLS 1.0 and TLS 1.1 are not offered, which indicates that these versions are disabled. TLS 1.2 and TLS 1.3 are offered, which indicates that these versions are supported.

    The client simulation results also show that only clients that support TLS 1.2 and TLS 1.3 can establish a connection.

  2. Optional: To restrict connections to only TLS 1.2, follow these steps.

    1. Modify the gateway rule by using the following YAML configuration. Set both maxProtocolVersion and minProtocolVersion to TLSV1_2.

      apiVersion: networking.istio.io/v1beta1
      kind: Gateway
      metadata:
        name: mysdsgateway
        namespace: default
      spec:
        selector:
          istio: ingressgateway
        servers:
          - hosts:
              - '*'
            port:
              name: https
              number: 443
              protocol: HTTPS
            tls:
              credentialName: myexample-credential
              maxProtocolVersion: TLSV1_2
              minProtocolVersion: TLSV1_2
              mode: SIMPLE
    2. Run the following command to run the verification test.

      docker run --rm -ti  registry.cn-hangzhou.aliyuncs.com/acs/testssl.sh https://<gateway_address>/productpage

      Expected output

       Testing protocols via sockets except NPN+ALPN
      
       SSLv2      not offered (OK)
       SSLv3      not offered (OK)
       TLS 1      not offered
       TLS 1.1    not offered
       TLS 1.2    offered (OK)
       TLS 1.3    not offered and downgraded to a weaker protocol
      
      ......
       Running client simulations (HTTP) via sockets
      
       Browser                      Protocol  Cipher Suite Name (OpenSSL)       Forward Secrecy
      ------------------------------------------------------------------------------------------------
       Android 6.0                  TLSv1.2   ECDHE-RSA-AES128-GCM-SHA256       256 bit ECDH (P-256)
       Android 7.0 (native)         TLSv1.2   ECDHE-RSA-AES128-GCM-SHA256       256 bit ECDH (P-256)
       Android 8.1 (native)         TLSv1.2   ECDHE-RSA-AES128-GCM-SHA256       253 bit ECDH (X25519)
       Android 9.0 (native)         TLSv1.2   ECDHE-RSA-AES128-GCM-SHA256       253 bit ECDH (X25519)
       Android 10.0 (native)        TLSv1.2   ECDHE-RSA-AES128-GCM-SHA256       253 bit ECDH (X25519)
       Android 11 (native)          TLSv1.2   ECDHE-RSA-AES128-GCM-SHA256       253 bit ECDH (X25519)
       Android 12 (native)          TLSv1.2   ECDHE-RSA-AES128-GCM-SHA256       253 bit ECDH (X25519)
       Chrome 79 (Win 10)           TLSv1.2   ECDHE-RSA-AES128-GCM-SHA256       253 bit ECDH (X25519)
       Chrome 101 (Win 10)          TLSv1.2   ECDHE-RSA-AES128-GCM-SHA256       253 bit ECDH (X25519)
       Firefox 66 (Win 8.1/10)      TLSv1.2   ECDHE-RSA-AES128-GCM-SHA256       253 bit ECDH (X25519)
       Firefox 100 (Win 10)         TLSv1.2   ECDHE-RSA-AES128-GCM-SHA256       253 bit ECDH (X25519)
       IE 6 XP                      No connection
       IE 8 Win 7                   No connection
       IE 8 XP                      No connection
       IE 11 Win 7                  No connection
       IE 11 Win 8.1                No connection
       IE 11 Win Phone 8.1          No connection
       IE 11 Win 10                 TLSv1.2   ECDHE-RSA-AES128-GCM-SHA256       256 bit ECDH (P-256)
       Edge 15 Win 10               TLSv1.2   ECDHE-RSA-AES128-GCM-SHA256       253 bit ECDH (X25519)
       Edge 101 Win 10 21H2         TLSv1.2   ECDHE-RSA-AES128-GCM-SHA256       253 bit ECDH (X25519)
       Safari 12.1 (iOS 12.2)       TLSv1.2   ECDHE-RSA-AES128-GCM-SHA256       253 bit ECDH (X25519)
       Safari 13.0 (macOS 10.14.6)  TLSv1.2   ECDHE-RSA-AES128-GCM-SHA256       253 bit ECDH (X25519)
       Safari 15.4 (macOS 12.3.1)   TLSv1.2   ECDHE-RSA-AES128-GCM-SHA256       253 bit ECDH (X25519)
       Java 7u25                    No connection
       Java 8u161                   TLSv1.2   ECDHE-RSA-AES128-GCM-SHA256       256 bit ECDH (P-256)
       Java 11.0.2 (OpenJDK)        TLSv1.2   ECDHE-RSA-AES128-GCM-SHA256       256 bit ECDH (P-256)
       Java 17.0.3 (OpenJDK)        TLSv1.2   ECDHE-RSA-CHACHA20-POLY1305       253 bit ECDH (X25519)
       go 1.17.8                    TLSv1.2   ECDHE-RSA-AES128-GCM-SHA256       253 bit ECDH (X25519)
       LibreSSL 2.8.3 (Apple)       TLSv1.2   ECDHE-RSA-CHACHA20-POLY1305       253 bit ECDH (X25519)
       OpenSSL 1.0.2e               TLSv1.2   ECDHE-RSA-AES128-GCM-SHA256       256 bit ECDH (P-256)
       OpenSSL 1.1.0l (Debian)      TLSv1.2   ECDHE-RSA-CHACHA20-POLY1305       253 bit ECDH (X25519)
       OpenSSL 1.1.1d (Debian)      TLSv1.2   ECDHE-RSA-CHACHA20-POLY1305       253 bit ECDH (X25519)
       OpenSSL 3.0.3 (git)          TLSv1.2   ECDHE-RSA-CHACHA20-POLY1305       253 bit ECDH (X25519)
       Apple Mail (16.0)            TLSv1.2   ECDHE-RSA-AES128-GCM-SHA256       256 bit ECDH (P-256)
       Thunderbird (91.9)           TLSv1.2   ECDHE-RSA-AES128-GCM-SHA256       253 bit ECDH (X25519)

      The expected output shows that TLS 1 and TLS 1.1 are not offered, and TLS 1.3 is not offered and downgraded to a weaker protocol, which indicates that these three versions are disabled, whereas TLS 1.2 is offered, which indicates that only TLS 1.2 is supported.

      The client simulation results also show that only clients that support TLS 1.2 can establish a connection.

  3. Optional: To restrict connections to only TLS 1.3, follow these steps.

    1. Modify the gateway rule by using the following YAML configuration. Set both maxProtocolVersion and minProtocolVersion to TLSV1_3.

      apiVersion: networking.istio.io/v1beta1
      kind: Gateway
      metadata:
        name: mysdsgateway
        namespace: default
      spec:
        selector:
          istio: ingressgateway
        servers:
          - hosts:
              - '*'
            port:
              name: https
              number: 443
              protocol: HTTPS
            tls:
              credentialName: myexample-credential
              maxProtocolVersion: TLSV1_3
              minProtocolVersion: TLSV1_3
              mode: SIMPLE
    2. Run the following command to run the verification test.

      docker run --rm -ti  registry.cn-hangzhou.aliyuncs.com/acs/testssl.sh https://<gateway_address>/productpage

      Expected output

      Testing protocols via sockets except NPN+ALPN
      
      SSLv2      not offered (OK)
      SSLv3      not offered (OK)
      TLS 1      not offered
      TLS 1.1    not offered
      TLS 1.2    not offered
      TLS 1.3    offered (OK): final
      
      ......
      Running client simulations (HTTP) via sockets
      
       Browser                      Protocol  Cipher Suite Name (OpenSSL)       Forward Secrecy
      ------------------------------------------------------------------------------------------------
       Android 6.0                  No connection
       Android 7.0 (native)         No connection
       Android 8.1 (native)         No connection
       Android 9.0 (native)         TLSv1.3   TLS_AES_128_GCM_SHA256            253 bit ECDH (X25519)
       Android 10.0 (native)        TLSv1.3   TLS_AES_128_GCM_SHA256            253 bit ECDH (X25519)
       Android 11 (native)          TLSv1.3   TLS_AES_128_GCM_SHA256            253 bit ECDH (X25519)
       Android 12 (native)          TLSv1.3   TLS_AES_128_GCM_SHA256            253 bit ECDH (X25519)
       Chrome 79 (Win 10)           TLSv1.3   TLS_AES_128_GCM_SHA256            253 bit ECDH (X25519)
       Chrome 101 (Win 10)          TLSv1.3   TLS_AES_128_GCM_SHA256            253 bit ECDH (X25519)
       Firefox 66 (Win 8.1/10)      TLSv1.3   TLS_AES_128_GCM_SHA256            253 bit ECDH (X25519)
       Firefox 100 (Win 10)         TLSv1.3   TLS_AES_128_GCM_SHA256            253 bit ECDH (X25519)
       IE 6 XP                      No connection
       IE 8 Win 7                   No connection
       IE 8 XP                      No connection
       IE 11 Win 7                  No connection
       IE 11 Win 8.1                No connection
       IE 11 Win Phone 8.1          No connection
       IE 11 Win 10                 No connection
       Edge 15 Win 10               No connection
       Edge 101 Win 10 21H2         TLSv1.3   TLS_AES_128_GCM_SHA256            253 bit ECDH (X25519)
       Safari 12.1 (iOS 12.2)       TLSv1.3   TLS_CHACHA20_POLY1305_SHA256      253 bit ECDH (X25519)
       Safari 13.0 (macOS 10.14.6)  TLSv1.3   TLS_CHACHA20_POLY1305_SHA256      253 bit ECDH (X25519)
       Safari 15.4 (macOS 12.3.1)   TLSv1.3   TLS_AES_128_GCM_SHA256            253 bit ECDH (X25519)
       Java 7u25                    No connection
       Java 8u161                   No connection
       Java 11.0.2 (OpenJDK)        TLSv1.3   TLS_AES_128_GCM_SHA256            256 bit ECDH (P-256)
       Java 17.0.3 (OpenJDK)        TLSv1.3   TLS_AES_256_GCM_SHA384            253 bit ECDH (X25519)
       go 1.17.8                    TLSv1.3   TLS_AES_128_GCM_SHA256            253 bit ECDH (X25519)
       LibreSSL 2.8.3 (Apple)       No connection
       OpenSSL 1.0.2e               No connection
       OpenSSL 1.1.0l (Debian)      No connection
       OpenSSL 1.1.1d (Debian)      TLSv1.3   TLS_AES_256_GCM_SHA384            253 bit ECDH (X25519)
       OpenSSL 3.0.3 (git)          TLSv1.3   TLS_AES_256_GCM_SHA384            253 bit ECDH (X25519)
       Apple Mail (16.0)            No connection
       Thunderbird (91.9)           TLSv1.3   TLS_AES_128_GCM_SHA256            253 bit ECDH (X25519)

      As shown in the expected output, the TLS 1, TLS 1.1, and TLS 1.2 versions are not offered, which indicates that these three versions are disabled. The TLS 1.3 version is offered, which indicates that only the TLS 1.3 version is supported.

      The client simulation results also show that only clients that support TLS 1.3 can establish a connection.