Activer SSL pour Cloud Endpoints avec ESP

Cette page explique comment activer un port SSL (Secure Sockets Layer) lors du déploiement d'Extensible Service Proxy (ESP) avec Google Kubernetes Engine, Kubernetes ou Compute Engine. Vous pouvez activer un port SSL pour votre service Endpoints déployé dans certains cas d'utilisation. Par exemple, si vous utilisez la fonctionnalité de transcodage de gRPC, vous souhaitez peut-être que votre service reçoive à la fois des requêtes HTTP 1.1 et gRPC sur le même port.

Avant de commencer, assurez-vous d'avoir déjà consulté les tutoriels sur le type de service et l'environnement que vous avez choisis, et que vous savez comment déployer ESP sans SSL.

Configurer vos clés et certificats SSL

Pour configurer votre port SSL afin qu'il diffuse les requêtes HTTPS, procédez comme suit :

  1. Assurez-vous que votre fichier de clé SSL est nommé nginx.key et que votre fichier de certificat s'appelle nginx.crt. Pour les tests, vous pouvez générer des fichiers autosignés nginx.key et nginx.cert à l'aide d'OpenSSL à l'aide de la commande suivante :

    openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout ./nginx.key -out ./nginx.crt
  2. Indiquez à la fois CN et subjectAltName dans votre certificat de serveur. La valeur de ces attributs doit correspondre au DNS ou à l'adresse IP utilisés par les clients pour appeler votre service. Sinon, le handshake SSL échouera.

Activer SSL pour ESP sur Kubernetes

Pour activer le port SSL pour ESP sur Kubernetes, procédez comme suit :

  1. Créez un secret Kubernetes contenant la clé et le certificat SSL :

    kubectl create secret generic nginx-ssl \
    --from-file=./nginx.crt --from-file=./nginx.key
  2. Modifiez les fichiers de configuration Kubernetes, par exemple esp_echo_gke.yaml, comme illustré dans l'extrait suivant :

    template:
      metadata:
        labels:
          app: esp-echo
      spec:
        volumes:
        - name: nginx-ssl
          secret:
            secretName: nginx-ssl
        containers:
        - name: esp
          image: gcr.io/endpoints-release/endpoints-runtime:1
          args: [
            "--http_port", "8080",
            "--ssl_port", "443",
            "--backend", "127.0.0.1:8081",
            "--service", "SERVICE_NAME",
            "--rollout_strategy", "managed",
          ]
          ports:
            - containerPort: 8080
            - containerPort: 443
          volumeMounts:
          - mountPath: /etc/nginx/ssl
            name: nginx-ssl
            readOnly: true
        - name: echo
          image: gcr.io/endpoints-release/echo:latest
          ports:
            - containerPort: 8081

    Remarque : L'exemple de configuration affiche les lignes à modifier. Le fichier de configuration complet est nécessaire au déploiement du fichier sur Cloud Endpoints.

  3. Installez les codes secrets Kubernetes créés en tant que volumes, à l'aide des instructions de la page relative aux Volumes Kubernetes.

  4. Démarrez ESP comme décrit sur la page Spécifier des options de démarrage pour ESP. N'oubliez pas d'ajouter l'indicateur de démarrage --ssl_port pour activer le port SSL. (Le port SSL par défaut est le 443.)

  5. Démarrez le service avec le fichier de configuration Kubernetes mis à jour à l'aide de kubectl.

    kubectl apply -f esp_echo_gke.yaml

Mettre à jour les certificats SSL

Il est important de mettre régulièrement à jour vos certificats SSL. Pour mettre à jour vos certificats SSL, procédez comme suit :

  • Créez des certificats, comme décrit à l'étape 1 ci-dessus.
  • Installez les nouveaux certificats sur les secrets Kubernetes, comme décrit à l'étape 3 ci-dessus.
  • Mettez à jour le déploiement ESP Kubernetes, comme décrit à l'étape 5 ci-dessus.

Activer SSL pour ESP sur Compute Engine

Pour activer SSL sur Compute Engine, commencez par copier les fichiers nginx.key et nginx.crt dans le dossier /etc/nginx/ssl de l'instance Compute Engine, comme suit :

  1. Exécutez la commande suivante et remplacez INSTANCE_NAME par le nom de l'instance Compute Engine :

    gcloud compute scp nginx.* INSTANCE-NAME
    
  2. Connectez-vous à l'instance via ssh.

    gcloud compute ssh INSTANCE-NAME
  3. Dans la zone d'instance de VM, créez le répertoire et copiez-y les fichiers :

      sudo mkdir -p /etc/esp/ssl
      sudo cp server.* /etc/esp/ssl/
    
  4. Suivez les instructions applicables à votre type de service pour effectuer un déploiement avec Docker. Lorsque vous exécutez le conteneur Docker d'ESP, utilisez la commande suivante :

    sudo docker run --name=esp \
     --detach \
     --publish=443:443 \
     --net=esp_net \
     --volume=/etc/nginx/ssl:/etc/nginx/ssl \
     --link=echo:echo \
     gcr.io/endpoints-release/endpoints-runtime:1 \
     --service=SERVICE_NAME \
     --rollout_strategy=managed \
     --backend=echo:8080 \
     --ssl_port=443

    Par rapport à la commande non SSL docker run, la version SSL de la commande crée une configuration différente. Par exemple, la commande SSL :

    • installe le dossier contenant les fichiers de clé et CRT dans le conteneur en utilisant --volume ;
    • utilise --ssl_port=443 pour indiquer à ESP d'activer SSL sur le port 443 ;
    • modifie l'option de mappage de port --publish.

Mettre à jour les certificats SSL

Il est important de mettre régulièrement à jour vos certificats SSL. Pour mettre à jour vos certificats SSL, procédez comme suit:

  • Créez des certificats et copiez-les dans des instances de VM, comme décrit à l'étape 1 ci-dessus.
  • Copiez les nouveaux certificats dans le répertoire /etc/esp/ssl, comme décrit à l'étape 3 ci-dessus.
  • Arrêtez et redémarrez le conteneur ESP à l'aide de la commande sudo docker run, comme décrit à l'étape 4 ci-dessus.

Tester le port SSL

Pour faciliter les tests, définissez les variables d’environnement suivantes :

  1. Définissez IP_ADDRESS sur l'adresse IP de l'instance Compute Engine avec le nouveau certificat SSL.

  2. Définissez ENDPOINTS_KEY sur une clé API valide.

Une fois le port SSL activé, vous pouvez utiliser HTTPS pour envoyer des requêtes à Extensible Service Proxy. Si votre certificat est autosigné, utilisez -k pour activer l'option non sécurisée dans la commande curl :

curl -k -d '{"message":"hello world"}' -H "content-type:application/json" \
https://IP_ADDRESS:443/echo?key=ENDPOINTS_KEY

Vous pouvez également générer le certificat au format pem et vous servir de l'option --cacert pour utiliser le certificat autosigné dans le fichier curl, comme indiqué ci-dessous :

  openssl x509 -in nginx.crt -out nginx.pem -outform PEM
  curl --cacert "./nginx.pem" -d '{"message":"hello world"}' -H "content-type:application/json" \
  https://IP_ADDRESS:443/echo?key=ENDPOINTS_KEY