Abilitazione di SSL per Cloud Endpoints con ESPv2

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

Questa pagina spiega come abilitare una porta SSL (Secure Sockets Layer) durante il deployment di Extensible Service Proxy V2 (ESPv2) con Google Kubernetes Engine, Kubernetes o Compute Engine. Potresti voler attivare una porta SSL per il servizio Endpoints di cui hai eseguito il deployment per alcuni casi d'uso.

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

Configurazione delle chiavi e dei certificati SSL

Per configurare la porta SSL in modo che soddisfi le richieste HTTPS, procedi nel seguente modo:

  1. Verifica che il file della chiave SSL sia denominato server.key e che il file del certificato sia denominato server.crt. Per eseguire il test, puoi generare server.key e server.crt autofirmati utilizzando OpenSSL con questo comando:

    openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout ./server.key -out ./server.crt
  2. Specifica sia CN sia 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, l'handshake SSL non andrà a buon fine.

Abilitazione di SSL per ESPv2 su Kubernetes

Per abilitare la porta SSL per ESPv2 su Kubernetes:

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

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

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

    Nota: nell'esempio di configurazione vengono visualizzate le righe che devono essere modificate. Per il deployment del file su Cloud Endpoints, è necessario il file di configurazione completo.

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

  4. Avvia ESPv2 come descritto in Specificare le opzioni di avvio per ESPv2, ma assicurati di aggiungere il flag di avvio --ssl_server_cert_path per specificare il percorso dei file del certificato montati.

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

    kubectl apply -f echo-ssl.yaml

  6. Genera il certificato radice per il client utilizzando il comando OpenSSL seguente:

       openssl x509 -in ./server.crt -out ./client.pem -outform PEM
     

    Se il client utilizza curl, il file client.pem può essere utilizzato nel flag --caroot. Per gRPC, client.pem viene utilizzato come file del certificato radice della credenziale SSL per il canale gRPC.

Aggiorna i certificati SSL

È importante aggiornare periodicamente i certificati SSL. Per aggiornare i certificati SSL, segui questi passaggi:

  • Crea nuovi certificati, come descritto nel passaggio 1.
  • Monta i nuovi certificati per i secret di Kubernetes, come descritto sopra nel passaggio 3.
  • Aggiorna il deployment ESPv2 Kubernetes, come descritto sopra nel passaggio 5.
  • Rigenera il file del certificato radice del client, come descritto sopra nel passaggio 6.

Abilitazione di SSL per ESPv2 su Compute Engine

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

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

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

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

      sudo mkdir -p /etc/esp/ssl
      sudo cp server.* /etc/esp/ssl/
    
  4. Segui le istruzioni relative al tuo tipo di servizio di cui vuoi eseguire il deployment con Docker. Quando esegui il container Docker ESPv2, utilizza questo comando:

    sudo docker run --name=esp \
     --detach \
     --publish=443:9000 \
     --net=esp_net \
     --volume=/etc/esp/ssl:/etc/esp/ssl \
      gcr.io/endpoints-release/endpoints-runtime:2 \
     --service=SERVICE_NAME \
     --rollout_strategy=managed \
     --backend=echo:8080 \
     --ssl_server_cert_path=/etc/esp/ssl \
     --listener_port=9000

    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 la chiave e i file CRT nel container utilizzando --volume.
    • Utilizza --ssl_server_cert_path=/etc/esp/ssl per comunicare a ESPv2 di trovare i file dei certificati del server server.key e server.crt nella cartella /etc/esp/ssl.
    • Modifica il flag di mappatura delle porte --publish. Le richieste in entrata alla porta HTTPS 443 sono mappate alla porta ESPv2 9000.

Aggiorna i certificati SSL

È importante aggiornare periodicamente i certificati SSL. Per aggiornare i certificati SSL, segui questi passaggi:

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

Test della porta SSL

Per semplificare il test della porta SSL, imposta le seguenti variabili di ambiente:

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

  2. Imposta ENDPOINTS_KEY su una chiave API valida.

Dopo aver abilitato la porta SSL, puoi utilizzare HTTPS per inviare richieste a 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 nel formato pem e usa l'opzione --cacert per utilizzare il certificato autofirmato in curl, come mostrato di seguito:

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