הפעלת 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