Activez HTTPS sur une passerelle ASM pour offrir un accès chiffré aux clients externes. Les passerelles ASM prennent en charge le chargement dynamique des certificats, ce qui permet de configurer en temps réel les clés privées, les certificats serveur et les certificats racine. Cette méthode évite le redémarrage de la passerelle ou la dépendance aux montages de volumes Secret, réduisant ainsi la complexité opérationnelle et éliminant les risques d'interruption de service. Les passerelles ASM peuvent surveiller et gérer plusieurs paires de certificats et de clés privées, offrant une communication flexible et sécurisée pour différents hôtes et renforçant la sécurité de la transmission des données.
Prérequis
Contexte
Istio prend en charge le chargement dynamique des certificats. La clé privée, le certificat serveur et le certificat racine requis pour la sécurité de la couche de transport (TLS) peuvent être configurés dynamiquement sans redémarrer la passerelle. Une passerelle ASM surveille les Secrets dans son namespace et les charge dynamiquement via la ressource personnalisée (CR) Gateway. L'utilisation de HTTPS sur une passerelle ASM offre les avantages suivants :
La passerelle d'entrée peut ajouter, supprimer ou mettre à jour dynamiquement les certificats, les clés privées ou les certificats racine correspondants requis, sans redémarrage.
Aucun montage de volume Secret n'est nécessaire. Après la création d'un Kubernetes Secret, la passerelle ASM le détecte et envoie son certificat, sa clé privée ou son certificat racine à la passerelle d'entrée.
Une passerelle ASM peut surveiller plusieurs paires de certificats et de clés privées. Il vous suffit de créer des Secrets pour plusieurs hôtes et de mettre à jour la configuration de la Gateway.
Étape 1 : Préparer les certificats et les clés privées
Lors de l'utilisation d'un nom de domaine, un dépôt ICP (Internet Content Provider) peut être nécessaire pour garantir son accessibilité publique. Cette rubrique utilise aliyun.com comme exemple pour générer un certificat et une clé privée, puis les enregistrer en tant que Secret.
Si vous disposez déjà d'un certificat et d'une clé privée pour aliyun.com, renommez la clé en aliyun.com.key et le certificat en aliyun.com.crt. Sinon, utilisez openssl pour générer un certificat et une clé.
-
Exécutez la commande suivante pour créer un certificat racine et une clé privée.
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 -
Exécutez les commandes suivantes pour générer un certificat serveur et une clé privée pour 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 -
Créez un Secret ou un certificat en fonction de la version de votre instance ASM.
-
Pour les instances ASM antérieures à la v1.17
À l'aide du kubeconfig du cluster de la passerelle d'entrée, exécutez la commande suivante pour créer un Secret contenant le certificat et la clé privée dans le namespace istio-system.
kubectl create -n istio-system secret tls myexample-credential --key=aliyun.com.key --cert=aliyun.com.crtImportantLe nom du Secret ne doit pas commencer par
istioni parprometheuset ne peut pas contenir le champtoken. -
Pour les instances ASM v1.17 et ultérieures
Connectez-vous à la console ASM. Dans le volet de navigation de gauche, sélectionnez .
Sur la page Mesh Management, cliquez sur le nom de l'instance ASM cible. Dans le volet de navigation de gauche, sélectionnez .
-
Sur la page Certificate Management, cliquez sur Create. Dans le panneau Certificate Information, définissez les paramètres suivants et cliquez sur OK.
Parameter
Description
Name
Saisissez un nom pour le certificat. Dans cet exemple, myexample-credential est utilisé.
Public Key Certificate
Le contenu du fichier
aliyun.com.crtgénéré à l'étape 2.Private Key
Le contenu du fichier
aliyun.com.keygénéré à l'étape 2.
-
Étape 2 : Définir le service backend pour a.aliyun.com
Le service backend de cet exemple utilise NGINX. Pour le service backend a.aliyun.com, les requêtes vers le chemin /hello renvoient la chaîne Welcome to a.aliyun.com! avec un code d'état 200. Voici le contenu du fichier 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;
}
}
}
-
À l'aide du kubeconfig du cluster de la passerelle d'entrée, exécutez la commande suivante pour créer un Kubernetes ConfigMap pour la configuration du serveur NGINX.
kubectl create configmap myexample-nginx-configmap --from-file=nginx.conf=./myexample-nginx.conf Activez l'injection automatique du proxy sidecar pour le namespace par défaut. Pour plus d'informations, consultez la section Activer l'injection automatique du proxy sidecar.
-
Créez un fichier nommé myexampleapp.yaml avec le contenu suivant. Ensuite, exécutez la commande
kubectl apply -f myexampleapp.yamlpour créer le service backend pour le nom de domaine a.aliyun.com.
Étape 3 : Définir le service backend pour b.aliyun.com
Le service backend de cet exemple utilise httpbin.
-
Créez un fichier nommé httpbin.example.yaml et copiez-y le contenu suivant.
-
À l'aide du kubeconfig du cluster où réside le pod de la passerelle d'entrée, exécutez la commande suivante pour créer le service backend pour le nom de domaine b.aliyun.com.
kubectl apply -f httpbin.example.yaml
Étape 4 : Créer une ressource Gateway
Connectez-vous à la console ASM. Dans le volet de navigation de gauche, sélectionnez .
Sur la page Mesh Management, cliquez sur le nom de l'instance ASM. Dans le volet de navigation de gauche, sélectionnez . Sur la page qui s'affiche, cliquez sur Create from YAML.
-
Sur la page Create, sélectionnez le namespace cible (dans cet exemple, default) et n'importe quel Scenario Template. Ensuite, saisissez le YAML suivant et cliquez sur Create.
Après la création de la ressource, la nouvelle passerelle apparaît sur la page Gateway.
Étape 5 : Créer des VirtualServices
Connectez-vous à la console ASM. Dans le volet de navigation de gauche, sélectionnez .
Sur la page Mesh Management, cliquez sur le nom de l'instance ASM. Dans le volet de navigation de gauche, sélectionnez . Sur la page qui s'affiche, cliquez sur Create from YAML.
-
Sur la page Create, sélectionnez les Namespaces cibles et n'importe quel Scenario Template. Ensuite, saisissez le YAML suivant et cliquez sur Create.
Répétez cette étape pour créer un VirtualService pour b.aliyun.com.
Après la création des services virtuels, ils apparaissent sur la page VirtualService.
Vérifier les résultats
Obtenir l'adresse du service de la passerelle d'entrée
Méthode 1 : Consultez l'adresse dans la console ASM. Connectez-vous à la console ASM, sélectionnez l'instance Service Mesh cible, puis sélectionnez dans le volet de navigation de gauche. Sur la page Ingress Gateway, consultez les informations requises.
Méthode 2 : Consultez l'adresse dans la console ACK. Pour plus d'informations, consultez la section Afficher les informations de service d'une passerelle d'entrée.
Accéder à la passerelle d'entrée via la ligne de commande
-
Exécutez la commande suivante pour accéder au service a.aliyun.com via HTTPS.
curl -k -H Host:a.aliyun.com --resolve a.aliyun.com:443:{REPLACE_WITH_THE_INGRESS_GATEWAY_IP_ADDRESS} https://a.aliyun.com/helloRésultat attendu :
Welcome to a.aliyun.com! -
Exécutez la commande suivante pour accéder au service b.aliyun.com via 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/418Résultat attendu :
-=[ teapot ]=- _...._ .' _ _ `. | ."` ^ `". _, \_;`"---"`|// | ;/ \_ _/ `"""`
Opérations connexes
Mettre à jour le certificat de la passerelle
Pour mettre à jour le certificat monté sur une passerelle, créez un nouveau Secret dans le plan de données, puis modifiez la valeur du champ credentialName dans la ressource Gateway avec le nom du nouveau Secret. La passerelle monte automatiquement le nouveau Secret. Cet exemple montre comment créer un Secret nommé new-istio-ingressgateway-certs pour le serveur example.com.
-
Créez un certificat dont l'émetteur est myexample.
-
Dans l'outil OpenSSL, exécutez la commande suivante pour créer un certificat racine et une clé privée.
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 -
Exécutez les commandes suivantes pour générer un certificat serveur et une clé privée pour le serveur 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 Obtenez le fichier kubeconfig du cluster et utilisez kubectl pour vous connecter au cluster.
-
Exécutez la commande suivante pour créer un Secret nommé new-istio-ingressgateway-certs.
kubectl create -n istio-system secret tls new-istio-ingressgateway-certs --key example.com.key --cert example.com.crt
-
-
Exécutez la commande suivante dans le cluster pour supprimer l'ancien Secret de certificat.
kubectl delete secret istio-ingressgateway-certs -n istio-system -
Mettez à jour la ressource Gateway.
Connectez-vous à la console ASM. Dans le volet de navigation de gauche, sélectionnez .
Sur la page Mesh Management, cliquez sur le nom de l'instance ASM. Dans le volet de navigation de gauche, sélectionnez .
Sur la page Gateway, recherchez la ressource Gateway cible et cliquez sur View YAML dans la colonne Actions.
Dans la boîte de dialogue edit, modifiez la valeur de credentialName avec le nouveau nom de Secret de certificat, new-istio-ingressgateway-certs, puis cliquez sur OK.
-
Vérifiez que le certificat de la passerelle est mis à jour.
-
Exécutez la commande suivante pour afficher les informations actuelles du certificat dans le cluster.
kubectl exec istio-ingressgateway-xxxx -n istio-system -- curl localhost:15000/config_dump > ingressgateway_dump.yaml -
Exécutez la commande suivante pour imprimer et rechercher le certificat new-istio-ingressgateway-certs.
cat ingressgateway_dump.yaml | grep new-istio-ingressgateway-certs -A 3Résultat attendu :
"name": "kubernetes://new-istio-ingressgateway-certs", "tls_certificate": { "certificate_chain": { "inline_bytes": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0t...xxx...LS0tLS1FTkQgQ0VSVElGSUNBVEUt" } }Copiez le contenu après le paramètre inline_bytes pour obtenir le certificat encodé en Base64.
-
Exécutez la commande suivante dans votre outil de ligne de commande local pour décoder le certificat en Base64.
echo <Base64-encoded-certificate-content> | base64 --decode Enregistrez le contenu décodé dans un fichier test.com.crt.
-
Exécutez la commande suivante dans l'outil OpenSSL pour afficher l'organisation du certificat.
openssl x509 -in test.com.crt -text -nooutRésultat attendu :
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 organizationVous pouvez constater que l'organisation a bien été modifiée en
myexample, ce qui signifie que le certificat de la passerelle a été mis à jour avec succès.
-