Abilitazione di SSL per Cloud Endpoints con ESP

Questa pagina spiega come attivare una porta Secure Sockets Layer (SSL) durante il deployment di Extensible Service Proxy (ESP) con Google Kubernetes Engine, Kubernetes o Compute Engine. Per alcuni casi d'uso, ti consigliamo di attivare una porta SSL per il servizio Endpoints di cui hai eseguito il deployment. Ad esempio, se utilizzi la funzionalità di transcodifica di gRPC, potresti volere che il tuo servizio riceva sia le richieste HTTP 1.1 che quelle gRPC sulla stessa porta.

Prima di iniziare, assicurati di aver già esaminato i tutorial per il tipo di servizio e l'ambiente che hai scelto e di sapere come eseguire il deployment di ESP senza SSL.

Configurazione delle chiavi e dei certificati SSL

Per configurare la porta SSL in modo che gestisca le richieste HTTPS, segui i passaggi riportati di seguito:

  1. Verifica che il file della chiave SSL sia denominato nginx.key e il file del certificato nginx.crt. Per i test, puoi generare un nginx.key e un nginx.cert autofirmati utilizzando OpenSSL con il seguente comando:

    openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout ./nginx.key -out ./nginx.crt
  2. Specifica sia CN che subjectAltName nel certificato del server. Il valore di questi attributi deve corrispondere al DNS o all'IP utilizzato dai client per chiamare il servizio. In caso contrario, la stretta di mano SSL non andrà a buon fine.

Abilitazione di SSL per ESP su Kubernetes

Per attivare la porta SSL per ESP su Kubernetes:

  1. Crea un segreto Kubernetes con la chiave e il certificato SSL:

    kubectl create secret generic nginx-ssl \
    --from-file=./nginx.crt --from-file=./nginx.key
  2. Modifica i file di configurazione di Kubernetes, ad esempio esp_echo_gke.yaml, come mostrato nel seguente snippet:

    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

    Nota: il Sample di configurazione mostra le righe che devono essere modificate. Per eseguire il deployment del file in Cloud Endpoints, è necessario il file di configurazione completo.

  3. Monta i secret di Kubernetes che hai creato come volumi seguendo le istruzioni riportate nella pagina Volumi Kubernetes.

  4. Avvia ESP come descritto in Specificare le opzioni di avvio per ESP, ma assicurati di aggiungere il flag di avvio --ssl_port per attivare la porta SSL. Tieni presente che la porta SSL predefinita è 443.

  5. Avvia il servizio con il file di configurazione Kubernetes aggiornato utilizzando kubectl.

    kubectl apply -f esp_echo_gke.yaml

Aggiorna i certificati SSL

È importante aggiornare periodicamente i certificati SSL. Per aggiornare i certificati SSL, devi svolgere i seguenti passaggi:

  • Crea nuovi certificati, come descritto nel passaggio 1 qui sopra.
  • Monta i nuovi certificati ai secret Kubernetes, come descritto nel passaggio 3 sopra.
  • Aggiorna il deployment di Kubernetes di ESP, come descritto nel passaggio 5 precedente.

Attivazione di SSL per ESP su Compute Engine

Per attivare SSL su Compute Engine, copia prima i file nginx.key e nginx.crt nella cartella /etc/nginx/ssl dell'istanza Compute Engine, seguendo questi passaggi:

  1. Esegui il comando seguente e sostituisci INSTANCE_NAME con il nome dell'istanza Compute Engine:

    gcloud compute scp nginx.* INSTANCE-NAME
    
  2. Connettiti all'istanza utilizzando ssh.

    gcloud compute ssh INSTANCE-NAME
  3. Nella casella dell'istanza VM, crea la directory e copia i file:

      sudo mkdir -p /etc/esp/ssl
      sudo cp server.* /etc/esp/ssl/
  4. Segui le istruzioni per il tipo di servizio da eseguire con Docker. Quando esegui il container Docker ESP, utilizza questo comando:

    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

    Rispetto al comando docker run non SSL, la versione SSL del comando crea una configurazione diversa. Ad esempio, il comando SSL:

    • Monta la cartella con i file della chiave e del CRT nel contenitore utilizzando --volume
    • Utilizza --ssl_port=443 per indicare a ESP di attivare SSL sulla porta 443.
    • Modifica il flag di mappatura delle porte --publish.

Aggiorna i certificati SSL

È importante aggiornare periodicamente i certificati SSL. Per aggiornare i certificati SSL, devi svolgere i seguenti passaggi:

  • Crea nuovi certificati e copiali nelle istanze VM, come descritto nel passaggio 1 qui sopra.
  • Copia i nuovi certificati nella directory /etc/esp/ssl, come descritto nel passaggio 3 qui sopra.
  • Interrompi e riavvia il contenitore ESP utilizzando il comando sudo docker run, come descritto nel passaggio 4 precedente.

Test della porta SSL

Per semplificare i test, imposta le seguenti variabili di ambiente:

  1. Imposta IP_ADDRESS sull'indirizzo IP dell'istanza Compute Engine con il nuovo certificato SSL.

  2. Imposta ENDPOINTS_KEY su una chiave API valida.

Una volta attivata la porta SSL, puoi utilizzare HTTPS per inviare richieste all'Extensible Service Proxy. Se il certificato è autofirmato, utilizza -k per attivare l'opzione non sicura in curl:

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

In alternativa, genera il certificato in formato pem e utilizza l'opzione --cacert per utilizzare il certificato autofirmato in curl, come mostrato di seguito:

  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