Mengaktifkan SSL untuk Cloud Endpoints dengan ESP

Halaman ini menjelaskan cara mengaktifkan port Secure Sockets Layer (SSL) saat men-deploy Extensible Service Proxy (ESP) dengan Google Kubernetes Engine, Kubernetes, atau Compute Engine. Anda mungkin ingin mengaktifkan port SSL untuk layanan Endpoints yang di-deploy untuk beberapa kasus penggunaan. Misalnya, jika Anda menggunakan fitur transkode gRPC, Anda mungkin ingin layanan Anda menerima permintaan HTTP 1.1 dan gRPC di port yang sama.

Sebelum memulai, pastikan Anda telah meninjau tutorial untuk jenis layanan dan lingkungan yang dipilih, serta mengetahui cara men-deploy ESP tanpa SSL.

Mengonfigurasi kunci dan sertifikat SSL Anda

Untuk mengonfigurasi port SSL Anda agar melayani permintaan HTTPS, ikuti langkah-langkah di bawah ini:

  1. Periksa untuk memastikan bahwa file kunci SSL Anda diberi nama nginx.key dan file sertifikat Anda diberi nama nginx.crt. Untuk pengujian, Anda dapat membuat nginx.key dan nginx.cert yang ditandatangani sendiri menggunakan OpenSSL dengan perintah berikut:

    openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout ./nginx.key -out ./nginx.crt
  2. Tentukan CN dan subjectAltName di sertifikat server Anda. Nilai atribut ini harus cocok dengan DNS atau IP yang digunakan oleh klien untuk memanggil layanan Anda; jika tidak, handshake SSL akan gagal.

Mengaktifkan SSL untuk ESP di Kubernetes

Untuk mengaktifkan port SSL untuk ESP di Kubernetes:

  1. Buat secret Kubernetes dengan kunci dan sertifikat SSL Anda:

    kubectl create secret generic nginx-ssl \
    --from-file=./nginx.crt --from-file=./nginx.key
  2. Edit file konfigurasi Kubernetes, misalnya, esp_echo_gke.yaml, seperti yang ditunjukkan dalam cuplikan berikut:

    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

    Catatan: Contoh konfigurasi menampilkan baris yang perlu diedit. Untuk men-deploy file ke Cloud Endpoints, file konfigurasi lengkap diperlukan.

  3. Pasang secret Kubernetes yang Anda buat sebagai volume, dengan mengikuti petunjuk di halaman Volume Kubernetes.

  4. Mulai ESP seperti yang dijelaskan dalam Menentukan opsi startup untuk ESP, tetapi pastikan Anda menambahkan tanda startup --ssl_port untuk mengaktifkan port SSL. (Perhatikan bahwa port SSL default adalah 443.)

  5. Mulai layanan dengan file konfigurasi Kubernetes yang telah diupdate menggunakan kubectl.

    kubectl apply -f esp_echo_gke.yaml

Memperbarui sertifikat SSL

Penting untuk memperbarui sertifikat SSL Anda secara berkala. Untuk memperbarui sertifikat SSL, Anda harus melakukan langkah-langkah berikut:

  • Buat sertifikat baru, seperti yang dijelaskan pada Langkah 1 di atas.
  • Pasang sertifikat baru ke secret Kubernetes, seperti yang dijelaskan di Langkah 3 di atas.
  • Perbarui deployment ESP Kubernetes, seperti yang dijelaskan pada Langkah 5 di atas.

Mengaktifkan SSL untuk ESP di Compute Engine

Untuk mengaktifkan SSL di Compute Engine, salin terlebih dahulu file nginx.key dan nginx.crt ke folder /etc/nginx/ssl instance Compute Engine Anda, menggunakan langkah-langkah berikut:

  1. Jalankan perintah berikut dan ganti INSTANCE_NAME dengan nama instance Compute Engine Anda:

    gcloud compute scp nginx.* INSTANCE-NAME
    
  2. Hubungkan ke instance menggunakan ssh.

    gcloud compute ssh INSTANCE-NAME
  3. Di kotak VM instance, buat direktori dan salin file:

      sudo mkdir -p /etc/esp/ssl
      sudo cp server.* /etc/esp/ssl/
  4. Ikuti petunjuk untuk jenis layanan Anda guna men-deploy dengan Docker. Saat Anda menjalankan container Docker ESP, gunakan perintah ini:

    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

    Jika dibandingkan dengan perintah docker run non-SSL, perintah versi SSL membuat konfigurasi yang berbeda. Misalnya, perintah SSL:

    • Memasang folder dengan file kunci dan CRT ke container menggunakan --volume
    • Menggunakan --ssl_port=443 untuk memberi tahu ESP agar mengaktifkan SSL di port 443.
    • Mengubah tanda pemetaan port --publish.

Memperbarui sertifikat SSL

Penting untuk memperbarui sertifikat SSL Anda secara berkala. Untuk memperbarui sertifikat SSL, Anda harus melakukan langkah-langkah berikut:

  • Buat sertifikat baru dan salin ke instance VM, seperti yang dijelaskan di Langkah 1 di atas.
  • Salin sertifikat baru ke direktori /etc/esp/ssl, seperti yang dijelaskan pada Langkah 3 di atas.
  • Hentikan dan mulai ulang penampung ESP menggunakan perintah sudo docker run, seperti yang dijelaskan pada Langkah 4 di atas.

Menguji port SSL

Untuk mempermudah pengujian, tetapkan variabel lingkungan berikut:

  1. Tetapkan IP_ADDRESS ke alamat IP instance Compute Engine dengan sertifikat SSL baru.

  2. Tetapkan ENDPOINTS_KEY ke kunci API yang valid.

Setelah port SSL diaktifkan, Anda dapat menggunakan HTTPS untuk mengirim permintaan ke Extensible Service Proxy. Jika sertifikat Anda ditandatangani sendiri, gunakan -k untuk mengaktifkan opsi tidak aman di curl:

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

Atau, buat sertifikat dalam format pem dan gunakan opsi --cacert untuk menggunakan sertifikat yang ditandatangani sendiri di curl, seperti yang ditunjukkan di bawah:

  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