Mengaktifkan SSL untuk Cloud Endpoints dengan ESPv2

Halaman ini menjelaskan cara mengaktifkan port Secure Sockets Layer (SSL) saat men-deploy Extensible Service Proxy V2 (ESPv2) dengan Google Kubernetes Engine, Kubernetes, atau Compute Engine. Anda mungkin ingin mengaktifkan port SSL untuk layanan Endpoint yang di-deploy untuk beberapa kasus penggunaan.

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

Mengonfigurasi kunci dan sertifikat SSL

Untuk mengonfigurasi port SSL agar menayangkan permintaan HTTPS, ikuti langkah-langkah di bawah:

  1. Pastikan file kunci SSL Anda diberi nama server.key dan file sertifikat diberi nama server.crt. Untuk pengujian, Anda dapat membuat server.key dan server.crt yang ditandatangani sendiri menggunakan OpenSSL dengan perintah berikut:

    openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout ./server.key -out ./server.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 ESPv2 di Kubernetes

Guna mengaktifkan port SSL untuk ESPv2 di Kubernetes:

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

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

    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

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

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

  4. Mulai ESPv2 seperti yang dijelaskan dalam Menentukan opsi startup untuk ESPv2, tetapi pastikan Anda menambahkan tanda startup --ssl_server_cert_path untuk menentukan jalur file sertifikat yang terpasang.

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

    kubectl apply -f echo-ssl.yaml

  6. Buat root certificate untuk klien menggunakan perintah OpenSSL berikut:

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

    Jika klien menggunakan curl, file client.pem dapat digunakan dalam tanda --caroot. Untuk gRPC, client.pem digunakan sebagai file root certificate kredensial SSL untuk saluran gRPC.

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 pada Langkah 3 di atas.
  • Update deployment Kubernetes ESPv2, seperti yang dijelaskan pada Langkah 5 di atas.
  • Buat ulang file root certificate klien, seperti yang dijelaskan pada Langkah 6 di atas.

Mengaktifkan SSL untuk ESPv2 di Compute Engine

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

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

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

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

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

    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

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

    • Pasang folder yang berisi kunci dan file CRT ke container menggunakan --volume.
    • Menggunakan --ssl_server_cert_path=/etc/esp/ssl untuk memberi tahu ESPv2 agar menemukan file sertifikat server server.key dan server.crt di folder /etc/esp/ssl.
    • Mengubah tanda pemetaan port --publish. Permintaan masuk ke port HTTPS 443 dipetakan ke port ESPv2 9000.

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 pada Langkah 1 di atas.
  • Salin sertifikat baru ke direktori /etc/esp/ssl, seperti yang dijelaskan pada Langkah 3 di atas.
  • Hentikan dan mulai ulang container ESPv2 menggunakan perintah sudo docker run, seperti yang dijelaskan pada Langkah 4 di atas.

Menguji port SSL

Untuk mempermudah pengujian port SSL, tetapkan variabel lingkungan berikut:

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

  2. Setel 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 yang 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 ini:

  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