הפעלת SSL ל-Cloud Endpoints באמצעות ESP

בדף הזה מוסבר איך להפעיל יציאת Secure Sockets Layer ‏ (SSL) כשפורסים את Extensible Service Proxy ‏(ESP) באמצעות Google Kubernetes Engine,‏ Kubernetes או Compute Engine. במקרים מסוימים, כדאי להפעיל יציאת SSL בשירות Endpoints שפרסתם. לדוגמה, אם אתם משתמשים בתכונת הטרנסקוד של gRPC, יכול להיות שתרצו שהשירות שלכם יקבל בקשות HTTP 1.1 ו-gRPC באותו פורט.

לפני שמתחילים, חשוב לעיין במדריכים לסוג השירות ולסביבה שבחרתם, ולוודא שאתם יודעים איך לפרוס ESP בלי SSL.

הגדרת מפתחות ואישורים של SSL

כדי להגדיר את יציאת ה-SSL לטיפול בבקשות HTTPS, פועלים לפי השלבים הבאים:

  1. בודקים שקובץ מפתח ה-SSL נקרא nginx.key וקובץ האישור נקרא nginx.crt. לצורך בדיקה, אפשר ליצור nginx.key ו-nginx.cert בחתימה עצמית באמצעות OpenSSL עם הפקודה הבאה:

    openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout ./nginx.key -out ./nginx.crt
  2. צריך לציין את CN וגם את subjectAltName באישור השרת. הערך של המאפיינים האלה צריך להיות זהה ל-DNS או ל-IP שמשמשים את הלקוחות כדי להתקשר לשירות שלכם. אחרת, לחיצת היד של ה-SSL תיכשל.

הפעלת SSL עבור ESP ב-Kubernetes

כדי להפעיל את יציאת ה-SSL עבור ESP ב-Kubernetes:

  1. יוצרים סוד של Kubernetes עם מפתח ואישור SSL:

    kubectl create secret generic nginx-ssl \
    --from-file=./nginx.crt --from-file=./nginx.key
  2. עורכים את קובצי התצורה של Kubernetes, למשל esp_echo_gke.yaml, כמו שמוצג בקטע הקוד הבא:

    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

    הערה: בדוגמה להגדרה מוצגות השורות שצריך לערוך. כדי לפרוס את הקובץ ב-Cloud Endpoints, צריך את קובץ התצורה המלא.

  3. מטמיעים את הסודות של Kubernetes שיצרתם כנפחים, לפי ההוראות שבדף בנושא נפחים של Kubernetes.

  4. מפעילים את ESP כמו שמתואר במאמר ציון אפשרויות הפעלה ל-ESP, אבל מוסיפים את דגל ההפעלה --ssl_port כדי להפעיל את יציאת ה-SSL. (הערה: יציאת ה-SSL שמוגדרת כברירת מחדל היא 443).

  5. מפעילים את השירות באמצעות קובץ התצורה המעודכן של Kubernetes באמצעות kubectl.

    kubectl apply -f esp_echo_gke.yaml

עדכון אישורי SSL

חשוב לעדכן את אישורי ה-SSL מדי פעם. כדי לעדכן את אישורי ה-SSL, צריך לבצע את השלבים הבאים:

  • יוצרים אישורים חדשים, כמו שמתואר בשלב 1 למעלה.
  • מטמיעים את האישורים החדשים בסודות של Kubernetes, כמו שמתואר בשלב 3 למעלה.
  • מעדכנים את הפריסה של ESP Kubernetes, כמו שמתואר בשלב 5 למעלה.

הפעלת SSL עבור ESP ב-Compute Engine

כדי להפעיל SSL ב-Compute Engine, קודם מעתיקים את הקבצים nginx.key ו-nginx.crt לתיקייה /etc/nginx/ssl של מופע Compute Engine, באמצעות השלבים הבאים:

  1. מריצים את הפקודה הבאה ומחליפים את INSTANCE_NAME בשם של מכונת Compute Engine:

    gcloud compute scp nginx.* INSTANCE-NAME
    
  2. מתחברים למופע באמצעות ssh.

    gcloud compute ssh INSTANCE-NAME
  3. בתיבה של מכונת ה-VM של המופע, יוצרים את הספרייה ומעתיקים אליה את הקבצים:

      sudo mkdir -p /etc/esp/ssl
      sudo cp server.* /etc/esp/ssl/
  4. כדי לבצע פריסה באמצעות Docker, פועלים לפי ההוראות לסוג השירות שלכם. כשמריצים את קובץ ה-Docker של ESP, משתמשים בפקודה הזו:

    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

    בהשוואה לפקודה docker run שאינה SSL, הגרסה של הפקודה שכוללת SSL יוצרת הגדרה שונה. לדוגמה, פקודת ה-SSL:

    • מבצעים Mount לתיקייה עם קובצי המפתח וה-CRT אל הקונטיינר באמצעות --volume
    • השימוש ב---ssl_port=443 מאפשר ל-ESP להפעיל SSL ביציאה 443.
    • משנה את דגל מיפוי היציאות --publish.

עדכון אישורי SSL

חשוב לעדכן את אישורי ה-SSL מדי פעם. כדי לעדכן את אישורי ה-SSL, צריך לבצע את השלבים הבאים:

  • יוצרים אישורים חדשים ומעתיקים אותם למכונות וירטואליות, כמו שמתואר בשלב 1 למעלה.
  • מעתיקים את האישורים החדשים לספרייה /etc/esp/ssl, כמו שמתואר בשלב 3 למעלה.
  • עוצרים ומפעילים מחדש את מאגר ESP באמצעות הפקודה sudo docker run, כפי שמתואר בשלב 4 למעלה.

בדיקת יציאת ה-SSL

כדי להקל על הבדיקה, מגדירים את משתני הסביבה הבאים:

  1. מגדירים את IP_ADDRESS לכתובת ה-IP של מכונת Compute Engine עם אישור ה-SSL החדש.

  2. מגדירים את ENDPOINTS_KEY למפתח API תקין.

אחרי שמפעילים את יציאת ה-SSL, אפשר להשתמש ב-HTTPS כדי לשלוח בקשות ל-Extensible Service Proxy. אם האישור שלכם הוא בחתימה עצמית, צריך להשתמש ב--k כדי להפעיל את האפשרות הלא מאובטחת ב-curl:

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

אפשרות אחרת היא ליצור את האישור בפורמט pem ולהשתמש באפשרות --cacert כדי להשתמש באישור עם חתימה עצמית ב-curl, כמו שמוצג בהמשך:

  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