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.
-
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 -
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 -
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.crtImportanteEl nombre del Secret no debe comenzar con
istioni conprometheus, y no puede contener el campotoken. -
Para instancias de ASM v1.17 y posteriores
Inicie sesión en la consola de ASM. En el panel de navegación izquierdo, seleccione .
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 .
-
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.crtgenerado en sub-step 2.Private Key
El contenido del archivo
aliyun.com.keygenerado 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;
}
}
}
-
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 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.
-
Cree un archivo llamado myexampleapp.yaml con el siguiente contenido. Luego, ejecute el comando
kubectl apply -f myexampleapp.yamlpara crear el servicio de backend del nombre de dominio a.aliyun.com.
Paso 3: Definir el servicio de backend para b.aliyun.com
El servicio de backend de este ejemplo utiliza httpbin.
-
Cree un archivo llamado httpbin.example.yaml y copie en él el siguiente contenido.
-
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
Inicie sesión en la consola de ASM. En el panel de navegación izquierdo, seleccione .
En la página Mesh Management, haga clic en el nombre de la instancia de ASM. En el panel de navegación izquierdo, seleccione . En la página que aparece, haga clic en Create from YAML.
-
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.
Una vez creado el recurso, la nueva puerta de enlace aparece en la página Gateway.
Paso 5: Crear VirtualServices
Inicie sesión en la consola de ASM. En el panel de navegación izquierdo, seleccione .
En la página Mesh Management, haga clic en el nombre de la instancia de ASM. En el panel de navegación izquierdo, seleccione . En la página que aparece, haga clic en Create from YAML.
-
En la página Create, seleccione los Namespaces de destino y cualquier Scenario Template. Luego, introduzca el siguiente YAML y haga clic en Create.
Repita este paso para crear un VirtualService para b.aliyun.com.
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 . 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/helloResultado 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/418Resultado 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.
-
Cree un certificado cuyo emisor sea myexample.
-
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 -
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 Obtain the kubeconfig file of the cluster and use kubectl to connect to the cluster.
-
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
-
-
Ejecute el siguiente comando en el clúster para eliminar el Secret del certificado anterior.
kubectl delete secret istio-ingressgateway-certs -n istio-system -
Actualice el recurso Gateway.
Inicie sesión en la consola de ASM. En el panel de navegación izquierdo, seleccione .
En la página Mesh Management, haga clic en el nombre de la instancia de ASM. En el panel de navegación izquierdo, seleccione .
En la página Gateway, busque el recurso Gateway de destino y haga clic en View YAML en la columna Actions.
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.
-
Compruebe que el certificado de la puerta de enlace se haya actualizado.
-
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 -
Ejecute el siguiente comando para mostrar y buscar el certificado new-istio-ingressgateway-certs.
cat ingressgateway_dump.yaml | grep new-istio-ingressgateway-certs -A 3Resultado 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.
-
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 Guarde el contenido decodificado como el archivo test.com.crt.
-
Ejecute el siguiente comando en la herramienta OpenSSL para consultar la organización del certificado.
openssl x509 -in test.com.crt -text -nooutResultado 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 organizationComo se observa, la organización cambió correctamente a
myexample, lo que indica que el certificado de la puerta de enlace se actualizó correctamente.
-