קריאות ל-API נכשלות בגלל שגיאות TLS

הדף הזה רלוונטי ל-Apigee ול-Apigee Hybrid.

לעיון במסמכי התיעוד של Apigee Edge

תיאור הבעיה

בקשות Apigee hybrid API נכשלות עם שגיאות בחיבור TLS. בדרך כלל השגיאות האלה הן איפוסים של חיבורים ושל כשלים בהעברת נתוני ההתראה.

הודעות שגיאה

קריאות ל-API נכשלות עם TLS בדומה לשגיאה שמוצגת למטה, או עם שגיאות אחרות אבל לא זהות:

* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to example.apis.com:443
* Closing connection 0
curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to example.apis.com:443
* (304) (OUT), TLS handshake, Client hello (1):
* Recv failure: Connection reset by peer
* LibreSSL/3.3.6: error:02FFF036:system library:func(4095):Connection reset by peer
* Closing connection
curl: (35) Recv failure: Connection reset by peer
* (304) (OUT), TLS handshake, Client hello (1):
* LibreSSL/3.3.6: error:1404B410:SSL routines:ST_CONNECT:sslv3 alert handshake failure
* Closing connection
curl: (35) LibreSSL/3.3.6: error:1404B410:SSL routines:ST_CONNECT:sslv3 alert handshake failure

סיבות אפשריות

מטרה תיאור הוראות לפתרון בעיות שרלוונטיות ל
חסר סוד של Ingress Kubernetes הסוד של Kubernetes עבור org-envgroup חסר במרחב השמות של Apigee. Apigee Hybrid
אישור SSL בפורמט שגוי הפורמט של אישור ה-SSL שאליו מפנה הקטע virtualhosts בקובץ ההחלפות שגוי. Apigee Hybrid
המפתחות של ה-SSL לא תואמים לאישור ה-SSL מפתחות ה-SSL לא תואמים לאישור ה-SSL שאליו מפנה הקטע [virtualhosts] בקובץ [overrides]. Apigee Hybrid

הסיבה: חסר סוד ב-Ingress Kubernetes

אבחון

  1. מנתחים את היומנים של תרמילי apigee-watcher במרחב השמות apigee כדי לראות אם יש שגיאות.

    יכול להיות שתופיע שגיאה כמו זו שמוצגת בהמשך:
    NOT_FOUND: failed to get secret "MY_HYBRID_PROJECT-ENV_GROUP"
    in namespace "apigee": secrets "MY_HYBRID_PROJECT-ENV_GROUP" not found
    כאשר:
    • MY_HYBRID_PROJECT הוא שם הארגון ב-Apigee Hybrid
    • ENV_GROUP הוא השם של קבוצת הסביבות
    השגיאה שלמעלה מציינת ש-apigee-watcher לא הצליח למצוא את הסוד של Kubernetes עבור קבוצת הסביבות שצוינה למעלה בארגון Apigee Hybrid.
  2. כדי לוודא שהסודות של Kubernetes אכן חסרים, משתמשים בפקודה הבאה:
    kubectl -n apigee get secrets | grep MY_HYBRID_PROJECT-ENV_GROUP
    <no output>
    בדוגמה הזו לא מוצגים סודות של Kubernetes עבור MY_HYBRID_PROJECT-ENV_GROUP. יכול להיות שהם נמחקו בטעות.

רזולוציה

אפשר ליצור מחדש את הסודות החסרים של Kubernetes באמצעות המידע על אישורי ה-TLS וקובצי המפתחות מתוך קובץ overrides.yaml:

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

    הרצת בדיקה:

    helm upgrade ENV_GROUP_RELEASE_NAME apigee-virtualhost/ \
    --namespace APIGEE_NAMESPACE \
    --atomic \
    --set envgroup=ENV_GROUP \
    -f OVERRIDES_FILE \
    --dry-run=server
    

    חשוב לכלול את כל ההגדרות שמוצגות, כולל --atomic כדי שהפעולה תבוטל אם היא תיכשל.

    יכול להיות שההתקנה שלכם הוגדרה באמצעות ENV_GROUP_RELEASE_NAME ששונה מ-ENV_GROUP, ויכול להיות שלא. מידע על ההגדרות מופיע במאמר בנושא התקנת Apigee hybrid באמצעות Helm.

    מתקינים את התרשים:

    helm upgrade ENV_GROUP_RELEASE_NAME apigee-virtualhost/ \
    --namespace APIGEE_NAMESPACE \
    --atomic \
    --set envgroup=ENV_GROUP \
    -f OVERRIDES_FILE
    
  2. כדי לוודא שהסודות של Kubernetes נוצרו בהצלחה, משתמשים בפקודה הבאה:
    kubectl -n apigee get secrets | grep MY_HYBRID_PROJECT-ENV_GROUP

    הפלט של הפקודה הזו צריך להראות:

    MY_HYBRID_PROJECT-ENV_GROUP                   Opaque                2      7s

אם הבעיה נמשכת, עוברים אל Must Gather Diagnostic Information.

הסיבה: אישור SSL בפורמט שגוי

אבחון

קודם כל, מוודאים שקובץ האישור הוא קובץ ‎ .PEM. כדי לבדוק אם אישור ה-SSL בפורמט הנכון נטען ל-apigee-ingressgateway, פועלים לפי השלבים הבאים.

אם הגדרתם TLS חד-כיווני באמצעות זוג מפתחות/אישור כמו שמתואר באפשרות 1: זוג מפתחות/אישור, מריצים את הפקודה:

openssl x509 -in $CERT_FILE -text -noout

פלט לדוגמה (ללא שגיאות):

Certificate:
  Data:
    Version: 1 (0x0)
    Serial Number: 1 (0x1)
    Signature Algorithm: sha1WithRSAEncryption
    Issuer: C = US, O = xyz, OU = abc, CN = INTERIM-CN
    Validity
      Not Before: Dec 18 09:40:23 2023 GMT
      Not After : May  1 09:40:23 2025 GMT
    Subject: C = US, O = xyz, OU = abc, CN = shrey.example.com
    Subject Public Key Info:
      Public Key Algorithm: rsaEncryption
        RSA Public-Key: (2048 bit)
        Modulus:
          Trimmed
        Exponent: 65537 (0x10001)
    Signature Algorithm: sha1WithRSAEncryption
          Trimmed

אם הגדרתם TLS חד-כיווני באמצעות סוד של Kubernetes כמו שמתואר באפשרות 2: סוד של Kubernetes, מריצים את הפקודה:

kubectl -n apigee get secret <$SECRET_NAME> -o jsonpath='{.data.cert}'| base64 -d > certfile ;
openssl x509 -in certfile -text -noout

kubectl -n apigee get secret <$SECRET_NAME> -o jsonpath='{.data.cert}'| base64 -d | openssl x509 -noout -text

פלט לדוגמה (ללא שגיאות):

Certificate:
  Data:
    Version: 1 (0x0)
    Serial Number: 1 (0x1)
    Signature Algorithm: sha1WithRSAEncryption
    Issuer: C = US, O = xyz, OU = abc, CN = INTERIM-CN
    Validity
      Not Before: Dec 18 09:40:23 2023 GMT
      Not After : May  1 09:40:23 2025 GMT
    Subject: C = US, O = xyz, OU = abc, CN = shrey.example.com
    Subject Public Key Info:
      Public Key Algorithm: rsaEncryption
        RSA Public-Key: (2048 bit)
        Modulus:
          Trimmed
        Exponent: 65537 (0x10001)
  Signature Algorithm: sha1WithRSAEncryption
          Trimmed

אם הפלט של הפקודה שלמעלה נראה כך:

unable to load certificate
136613728412992:error:0D078095:asn1 encoding routines:asn1_item_embed_d2i:sequence not constructed:../crypto/asn1/tasn_dec.c:321:Type=X509
136613728412992:error:0906700D:PEM routines:PEM_ASN1_read_bio:ASN1 lib:../crypto/pem/pem_oth.c:33:

לשגיאות כמו

error loading certificates
8360934016:error:09FFF066:PEM routines:CRYPTO_internal:bad end line

מידע נוסף זמין בקטע רזולוציה.

רזולוציה

השגיאות עשויות להיות שונות בהתאם לשגיאת הפורמט בקובץ האישור. אם צריך, מתקנים את השגיאה באישור.

אם הפלט מציג את האישור במקום שגיאה, יכול להיות שהסיבה היא שמפתחות ה-SSL לא תואמים לאישור ה-SSL.

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

אבחון

אם הגדרתם TLS חד-כיווני באמצעות זוג אישורים/מפתחות כמו שמתואר ב אפשרות 1: זוג מפתחות/אישורים, מריצים את הפקודה:

diff -q <(openssl rsa -noout -modulus -in $KEY_FILE ) <(openssl x509 -noout -modulus -in $CERT_FILE)

פלט לדוגמה (ללא שגיאות):

diff -q <(openssl rsa -noout -modulus -in my_server.key ) <(openssl x509 -noout -modulus -in my_server.pem)
<No output>

אם הגדרתם TLS חד-כיווני באמצעות סוד Kubernetes כמו שמתואר באפשרות 2: סוד Kubernetes, מריצים את הפקודה:

diff -q <(kubectl -n apigee get secrets $SECRET_NAME -o jsonpath='{.data.key}'| base64 -d | openssl rsa -noout -modulus) <(kubectl -n apigee get secrets $SECRET_NAME -o jsonpath='{.data.cert}'| base64 -d | openssl x509 -noout -modulus)

פלט לדוגמה (ללא שגיאות):

diff -q <(kubectl -n apigee get secrets my-apigee-hybrid-env-grp -o jsonpath='{.data.key}'| base64 -d | openssl rsa -noout -modulus) <(kubectl -n apigee get secrets my-apigee-hybrid-env-grp -o jsonpath='{.data.cert}'| base64 -d | openssl x509 -noout -modulus)
<No output>

אם הפלט של הפקודה שלמעלה מציג שגיאה כמו:

unable to load Private Key
133504499987776:error:09091064:PEM routines:PEM_read_bio_ex:bad base64 decode:../crypto/pem/pem_lib.c:949:
Files /dev/fd/63 and /dev/fd/62 differ

אז מפתחות ה-SSL לא תואמים לאישור ה-SSL, וצריך לעיין בקטע פתרון.

רזולוציה

חשוב לוודא שאתם מספקים את המפתחות הפרטיים הנכונים ואת אישורי ה-SSL התואמים שלהם. צריך לפתור בעיות שקשורות למפתח הפרטי ולאישור ה-SSL.

אם לא מוצגת פלט של הפקודה, אישור ה-SSL והמפתח של ה-SSL תואמים.

איסוף פרטי אבחון

אם הבעיה נמשכת אחרי שמבצעים את ההוראות בדף הזה, צריך לאסוף את פרטי האבחון הבאים ולשלוח אותם לתמיכה של Apigee:

  1. הפלט המפורט המלא curl שבו מופיעה השגיאה.
  2. מצלמים צילום מסך של tcpdump במחשב שבו מוצגות השגיאות, מסירים ממנו מידע רגיש וכתובות IP ומשתפים אותו.
  3. אחרי התייעצות עם צוות הרשת, צריך להכין את הטופולוגיה המלאה של הרשת ואת זרימת הנתונים ברשת כדי לשתף אותם עם צוות התמיכה של Apigee.