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

בדף הזה מוסבר איך להפעיל יציאת Secure Sockets Layer ‏ (SSL) כשפורסים Extensible Service Proxy V2 ‏(ESPv2) באמצעות Google Kubernetes Engine,‏ Kubernetes או Compute Engine. במקרים מסוימים, כדאי להפעיל יציאת SSL בשירות Endpoints שפרסתם.

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

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

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

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

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

הפעלת SSL ב-ESPv2 ב-Kubernetes

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

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

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

    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

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

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

  4. מפעילים את ESPv2 כמו שמתואר במאמר ציון אפשרויות הפעלה ל-ESPv2, אבל מוסיפים את דגל ההפעלה --ssl_server_cert_path כדי לציין את הנתיב לקובצי האישורים שנטענו.

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

    kubectl apply -f echo-ssl.yaml

  6. מריצים את פקודת OpenSSL הבאה כדי ליצור את אישור הבסיס של הלקוח:

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

    אם הלקוח משתמש ב-curl, אפשר להשתמש בקובץ client.pem בדגל --caroot. ב-gRPC, ‏ client.pem משמש כקובץ אישור הבסיס של פרטי הכניסה של SSL לערוץ gRPC.

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

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

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

הפעלת SSL ב-ESPv2 ב-Compute Engine

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

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

    gcloud compute scp server.* 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 של ESPv2, משתמשים בפקודה הבאה:

    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

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

    • מבצעים Mount לתיקייה עם קובצי המפתח וה-CRT אל הקונטיינר באמצעות --volume.
    • השימוש ב---ssl_server_cert_path=/etc/esp/ssl מאפשר ל-ESPv2 למצוא את קובצי אישורי השרת server.key ו-server.crt בתיקייה /etc/esp/ssl.
    • משנה את דגל מיפוי היציאות --publish. בקשות נכנסות ליציאת HTTPS‏ 443 ממופות ליציאה 9000 של ESPv2.

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

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

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

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

כדי להקל על בדיקת יציאת ה-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 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