503 השירות לא זמין - לחיצת יד ב-SSL נכשלה

אתם צופים במסמכי התיעוד של Apigee Edge.
כדאי לעיין במסמכי התיעוד של Apigee X.
מידע

תיאור הבעיה

אפליקציית הלקוח מקבלת קוד סטטוס של HTTP‏ 503 Service Unavailable עם קוד השגיאה messaging.adaptors.http.flow.SslHandshakeFailed כתגובה לקריאות ל-API.

הודעת שגיאה

אפליקציית הלקוח מקבלת את קוד התגובה הבא:

HTTP/1.1 503 Service Unavailable

בנוסף, יכול להיות שתופיע הודעת השגיאה הבאה:

{
   "fault":{
      "faultstring":"SSL Handshake failed sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target",
      "detail":{
         "errorcode":"messaging.adaptors.http.flow.SslHandshakeFailed"
      }
   }
}

גורמים אפשריים

יכול להיות שתקבלו את קוד הסטטוס 503 Service Unavailable עם קוד השגיאה messaging.adaptors.http.flow.SslHandshakeFailed בגלל כשל בתהליך לחיצת היד של SSL בין מעבד ההודעות של Apigee Edge לבין שרת הקצה העורפי, מסיבות שונות. הודעת השגיאה בfaultstring דרך כלל מציינת סיבה אפשרית ברמה גבוהה שהובילה לשגיאה הזו.

בהתאם להודעת השגיאה שמופיעה ב-faultstring, צריך להשתמש בשיטות המתאימות כדי לפתור את הבעיה. במדריך הזה מוסבר איך לפתור את השגיאה הזו אם הודעת השגיאה SSL Handshake failed sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target מופיעה בfaultstring.

השגיאה הזו מתרחשת במהלך תהליך לחיצת היד של SSL בין מעבד ההודעות של Apigee Edge לבין שרת הקצה העורפי:

  • אם truststore של מעבד ההודעות של Apigee Edge:
    • מכיל שרשרת אישורים שלא תואמת לשרשרת האישורים המלאה של שרת הקצה העורפי, או
    • לא מכיל את שרשרת האישורים המלאה של שרת הקצה העורפי
  • אם שרשרת האישורים שמוצגת על ידי שרת הקצה העורפי:

אלה הסיבות האפשריות לבעיה:

סיבה תיאור הוראות לפתרון בעיות שרלוונטיות ל
אישור או שרשרת אישורים לא נכונים או לא מלאים במאגר האישורים של מעבד ההודעות האישור ו/או השרשרת שלו שמאוחסנים במאגר האישורים של מעבד ההודעות ב-Apigee Edge לא תואמים לשרשרת האישורים של השרת העורפי, או שלא מכילים את שרשרת האישורים המלאה של השרת העורפי. משתמשים ב-Edge Private Cloud וב-Edge Public Cloud
אי התאמה בין שם הדומיין שמוגדר במלואו (FQDN) באישור של שרת הקצה העורפי לבין שם המארח בנקודת הקצה של היעד האישור שמוצג על ידי שרת הקצה העורפי מכיל FQDN שלא תואם לשם המארח שצוין בנקודת הקצה של היעד. משתמשים ב-Edge Private Cloud וב-Edge Public Cloud
אישור או שרשרת אישורים לא נכונים או לא מלאים שהוצגו על ידי שרת הקצה העורפי שרשרת האישורים שהוצגה על ידי שרת הקצה העורפי שגויה או לא מלאה. משתמשים ב-Edge Private Cloud וב-Edge Public Cloud

שלבים נפוצים לאבחון

כדי לאבחן את השגיאה הזו, אפשר להשתמש באחד מהכלים או מהטכניקות הבאים:

API Monitoring

תהליך מספר 1: שימוש ב-API Monitoring

כדי לאבחן את השגיאה באמצעות הכלי 'מעקב אחר API':

  1. נכנסים לממשק המשתמש של Apigee Edge בתור משתמש עם תפקיד מתאים.
  2. עוברים לארגון שבו רוצים לבדוק את הבעיה.

  3. עוברים לדף Analyze > API Monitoring > Investigate.
  4. בוחרים את מסגרת הזמן הספציפית שבה נתקלת בשגיאות.
  5. משרטטים את קוד התקלה מול הזמן.

  6. בוחרים תא עם קוד השגיאה messaging.adaptors.http.flow.SslHandshakeFailed כמו שמוצג למטה:

    ( הגדלת התמונה)

  7. המידע על קוד התקלה messaging.adaptors.http.flow.SslHandshakeFailed מוצג כמו בדוגמה הבאה:

    ( הגדלת התמונה)

  8. לוחצים על הצגת יומנים ומרחיבים את השורה של הבקשה שנכשלה.

    ( הגדלת התמונה)

  9. בחלון יומנים, רושמים את הפרטים הבאים:
    • מזהה הודעת הבקשה
    • קוד סטטוס: 503
    • מקור התקלה: target
    • קוד תקלה: messaging.adaptors.http.flow.SslHandshakeFailed

מעקב

תהליך מספר 2: שימוש בכלי המעקב

כדי לאבחן את השגיאה באמצעות הכלי Trace:

  1. מפעילים את trace session ואת אחת מהאפשרויות הבאות:
    • מחכים לשגיאה 503 Service Unavailable עם קוד השגיאה messaging.adaptors.http.flow.SslHandshakeFailed, או
    • אם אפשר לשחזר את הבעיה, מבצעים את הקריאה ל-API כדי לשחזר את הבעיה 503 Service Unavailable
  2. מוודאים שהאפשרות הצגת כל פרטי הזרימה מופעלת:

  3. בוחרים אחת מהבקשות שנכשלו ובודקים את המעקב.
  4. עוברים בין השלבים השונים של ה-trace ומאתרים את המקום שבו התרחשה הכשל.
  5. השגיאה בדרך כלל מופיעה אחרי השלב Target Request Flow Started כמו שמוצג בהמשך:

    ( הגדלת התמונה)

  6. שימו לב לערכים הבאים מהמעקב:
    • שגיאה: SSL Handshake failed sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    • error.cause: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    • error.class: com.apigee.errors.http.server.ServiceUnavailableException
    • הערך של השגיאה SSL Handshake failed sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target מציין שה-SSL Handshake נכשל, כי מעבד ההודעות של Apigee Edge לא הצליח לאמת את האישור של שרת הקצה העורפי.
  7. עוברים לשלב AX (נתוני Analytics שתועדו) בנתוני המעקב ולוחצים עליו.
  8. גוללים למטה לקטע Phase Details Error Headers (כותרות שגיאה של פרטי השלב) ומזהים את הערכים של X-Apigee-fault-code (קוד שגיאה של Apigee),‏ X-Apigee-fault-source (מקור השגיאה של Apigee) ו-X-Apigee-Message-ID (מזהה ההודעה של Apigee), כמו שמוצג בהמשך:

    ( הגדלת התמונה)

  9. שימו לב לערכים של X-Apigee-fault-code,‏ X-Apigee-fault-source ו-X-Apigee-Message-ID:
  10. כותרות שגיאה ערך
    X-Apigee-fault-code messaging.adaptors.http.flow.SslHandshakeFailed
    X-Apigee-fault-source target
    X-Apigee-Message-ID MESSAGE_ID

NGINX

תהליך מספר 3: שימוש ביומני גישה של NGINX

כדי לאבחן את השגיאה באמצעות יומני הגישה של NGINX:

  1. אם אתם משתמשי Private Cloud, אתם יכולים להשתמש ביומני הגישה של NGINX כדי לקבוע את פרטי המפתח לגבי HTTP 503 Service Unavailable.
  2. בודקים את יומני הגישה של NGINX:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

  3. מחפשים שגיאות 503 עם קוד שגיאה messaging.adaptors.http.flow.SslHandshakeFailed במהלך פרק זמן מסוים (אם הבעיה התרחשה בעבר) או אם יש בקשות שעדיין נכשלות עם 503.
  4. אם מופיעות שגיאות 503 עם הערך של X-Apigee-fault-code שזהה לערך של messaging.adaptors.http.flow.SslHandshakeFailed, צריך לקבוע את הערך של X-Apigee-fault-source.

    דוגמה לשגיאה 503 מיומן הגישה של NGINX:

    ( הגדלת התמונה)

    בדוגמה של רשומה מיומן הגישה של NGINX שמופיעה למעלה, הערכים של X-Apigee-fault-code ושל X-Apigee-fault-source הם:

    כותרות ערך
    X-Apigee-fault-code messaging.adaptors.http.flow.SslHandshakeFailed
    X-Apigee-fault-source target

יומנים של מעבד הודעות

תהליך מספר 4: שימוש ביומני מעבד בקשות

  1. קובעים את מזהה ההודעה של אחת מהבקשות שנכשלו באמצעות API Monitoring, הכלי Trace או יומני הגישה של NGINX, כמו שמוסבר בשלבים נפוצים לאבחון.
  2. מחפשים את מזהה הודעת הבקשה הספציפית ביומן של מעבד ההודעות (/opt/apigee/var/log/edge-message-processor/logs/system.log). יכול להיות שתופיע השגיאה הבאה:

    org:myorg env:test api:MyProxy rev:1
    messageid:myorg-28247-3541813-1
    NIOThread@1 ERROR HTTP.CLIENT - HTTPClient$Context.handshakeFailed() :
    SSLClientChannel[Connected: Remote:X.X.X.X:443
    Local:192.168.194.140:55102]@64596 useCount=1
    bytesRead=0 bytesWritten=0 age=233ms  lastIO=233ms
    isOpen=true handshake failed, message: General SSLEngine problem
    

    השגיאה שלמעלה מציינת שלחיצת היד של SSL נכשלה בין מעבד ההודעות לבין השרת העורפי.

    אחרי זה תופיע חריגה עם דוח קריסות מפורט, כמו שמוצג בהמשך:

    org:myorg env:test api:MyProxy rev:1
    messageid:myorg-28247-3541813-1
    NIOThread@1 ERROR ADAPTORS.HTTP.FLOW - RequestWriteListener.onException() :
    RequestWriteListener.onException(HTTPRequest@1522922c)
    javax.net.ssl.SSLHandshakeException: General SSLEngine problem
    	at sun.security.ssl.Handshaker.checkThrown(Handshaker.java:1478)
    	at sun.security.ssl.SSLEngineImpl.checkTaskThrown(SSLEngineImpl.java:535)
    	... <snipped>
    Caused by: javax.net.ssl.SSLHandshakeException: General SSLEngine problem
    	at sun.security.ssl.Alerts.getSSLException(Alerts.java:203)
    	at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1728)
    	... <snipped>
    Caused by: sun.security.validator.ValidatorException: PKIX path building failed:
    sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid
    certification path to requested target
    	at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:397)
    	at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:302)
    	... <snipped>
      

    הערה: הכשל בלחיצת היד נובע מהסיבות הבאות:

    Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

    השגיאה הזו מציינת שלחיצת היד של SSL נכשלה כי מעבד ההודעות של Apigee Edge לא הצליח לאמת את האישור של שרת הקצה העורפי.

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

אבחון

  1. קובעים את קוד השגיאה ומקור השגיאה של השגיאה שנצפתה באמצעות מעקב אחר קריאות ל-API, הכלי Trace או יומני הגישה של NGINX, כמו שמוסבר בשלבים נפוצים לאבחון.
  2. אם קוד התקלה הוא messaging.adaptors.http.flow.SslHandshakeFailed, צריך לקבוע את הודעת השגיאה באחת מהשיטות הבאות:
  3. אם הודעת השגיאה היא sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target", המשמעות היא ש-SSL Handshake נכשל, כי מעבד הבקשות של Apigee Edge לא הצליח לאמת את האישור של שרת הקצה העורפי.

אפשר לנפות את הבאג הזה בשני שלבים:

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

שלב 1

שלב 1: קביעת שרשרת האישורים של שרת הקצה העורפי

כדי לקבוע את שרשרת האישורים של שרת הקצה העורפי, אפשר להשתמש באחת מהשיטות הבאות:

openssl

מריצים את הפקודה openssl מול שם המארח של שרת הקצה העורפי באופן הבא:

openssl s_client -connect BACKEND_SERVER_HOST_NAME:PORT#

שימו לב לשרשרת האישורים מהפלט של הפקודה שלמעלה:

דוגמה לשרשרת אישורים של שרת קצה עורפי מתוך פלט פקודה של openssl:

Certificate chain
 0 s:/CN=mocktarget.apigee.net
   i:/C=US/O=Google Trust Services LLC/CN=GTS CA 1D4
 1 s:/C=US/O=Google Trust Services LLC/CN=GTS CA 1D4
   i:/C=US/O=Google Trust Services LLC/CN=GTS Root R1
 2 s:/C=US/O=Google Trust Services LLC/CN=GTS Root R1
   i:/C=US/O=Google Trust Services LLC/CN=GTS Root R1

tcpdump

  1. אם אתם משתמשים בענן ציבורי, אתם צריכים ללכוד את מנות ה-TCP/IP בשרת הקצה העורפי.
  2. אם אתם משתמשים ב-Private Cloud, אתם יכולים ללכוד את מנות ה-TCP/IP בשרת העורפי או במעבד ההודעות. עדיף ללכוד אותם בשרת העורפי, כי החבילות מפוענחות בשרת העורפי.
  3. משתמשים בפקודה הבאה של tcpdump כדי לתעד חבילות TCP/IP:

    tcpdump -i any -s 0 host IP_ADDRESS -w FILE_NAME
    
  4. מנתחים את חבילות ה-TCP/IP באמצעות הכלי Wireshark או כלי דומה שאתם מכירים.

    ניתוח לדוגמה של Tcpdump

    ( הגדלת התמונה)

    • ‫Packet #43: מעבד ההודעות (מקור) שלח הודעת Client Hello לשרת העורפי (יעד).
    • חבילה מס' 44: שרת הקצה העורפי מאשר את קבלת ההודעה Client Hello ממעבד ההודעות.
    • מנה מספר 45: שרת הקצה העורפי שולח את ההודעה Server Hello יחד עם האישור שלו.
    • חבילה מס' 46: מעבד ההודעות מאשר את קבלת ההודעה Server Hello והאישור.
    • מנה מספר 47: מעבד ההודעות שולח הודעה FIN, ACK ואחריה RST, ACK במנה מספר 48.

      השגיאה הזו מציינת שאימות האישור של השרת העורפי על ידי מעבד ההודעות נכשל. הסיבה לכך היא שמעבד ההודעות לא כולל אישור שתואם לאישור של השרת העורפי, או שהוא לא יכול לסמוך על האישור של השרת העורפי עם האישורים שזמינים במאגר האישורים שלו (של מעבד ההודעות).

    • אפשר לחזור אחורה ולבדוק את Packet #45 ולקבוע את שרשרת האישורים שנשלחה על ידי שרת הקצה העורפי

      ( הגדלת התמונה)

    • בדוגמה הזו אפשר לראות שהשרת שלח אישור עלים עם common name (CN) = mocktarget.apigee.net, ואחריו אישור ביניים עם CN= GTS CA 1D4 ואישור בסיס עם CN = GTX Root R1.

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

שלב 2

שלב 2: השוואה בין האישור של שרת הקצה העורפי לבין האישורים שמאוחסנים במאגר האישורים של מעבד ההודעות

  1. קובעים את שרשרת האישורים של שרת הקצה העורפי.
  2. כדי לקבוע את האישור שמאוחסן במאגר האישורים של מעבד ההודעות, פועלים לפי השלבים הבאים:
    1. מקבלים את שם ההפניה של מאגר האישורים מהרכיב TrustStore בקטע SSLInfo ב-TargetEndpoint.

      בואו נראה דוגמה לקטע SSLInfo בהגדרה של TargetEndpoint:

      <TargetEndpoint name="default">
      ...
         <HTTPTargetConnection>
            <Properties />
            <SSLInfo>
               <Enabled>true</Enabled>
               <ClientAuthEnabled>true</ClientAuthEnabled>
               <KeyStore>ref://myKeystoreRef</KeyStore>
               <KeyAlias>myKey</KeyAlias>
               <TrustStore>
                  ref://myCompanyTrustStoreRef
               </TrustStore>
            </SSLInfo>
         </HTTPTargetConnection>
         ...
      </TargetEndpoint>
    2. בדוגמה שלמעלה, שם ההפניה TrustStore הוא myCompanyTruststoreRef.
    3. בממשק המשתמש של Edge, בוחרים באפשרות סביבות > קובצי עזר. שימו לב לשם בעמודה Reference (אסמכתא) של הפניה ספציפית למאגר האישורים. זה יהיה השם של חנות האישורים שלכם.

      ( הגדלת התמונה)

    4. בדוגמה שלמעלה, שם מאגר האישורים הוא:

      ‫myCompanyTruststoreRef: myCompanyTruststore

  3. מקבלים את האישורים שמאוחסנים במאגר האישורים (שנקבע בשלב הקודם) באמצעות ממשקי ה-API הבאים:

    1. קבלת כל האישורים של חנות מפתחות או חנות אישורים מהימנים ממשק ה-API הזה מציג רשימה של כל האישורים במאגר האישורים הספציפי.

      משתמש בענן ציבורי:

      curl -v -X GET https//api.enterprise.apigee.com/v1/organizations/ORGANIZATION_NAME/environments/ENVIRONMENT_NAME/keystores/KEYSTORE_NAME/certs -H "Authorization: Bearer $TOKEN"
      

      משתמש ב-Private Cloud:

      curl -v -X GET http://MANAGEMENT_HOST:PORT_#/v1/organizations/ORGANIZATION_NAME/environments/ENVIRONMENT_NAME/keystores/KEYSTORE_NAME/certs -H "Authorization: Bearer $TOKEN"
      

      איפה:

      • ‫ORGANIZATION_NAME הוא שם הארגון
      • ‫ENVIRONMENT_NAME הוא שם הסביבה
      • ‫KEYSTORE_NAME הוא השם של מאגר המפתחות
      • המשתנה ‎$TOKEN מוגדר לאסימון הגישה מסוג OAuth 2.0, כפי שמתואר במאמר בנושא קבלת אסימון גישה מסוג OAuth 2.0
      • האפשרויות curl שמשמשות בדוגמה הזו מתוארות במאמר בנושא שימוש ב-curl.

      פלט לדוגמה:

      האישורים ממאגר האישורים לדוגמה myCompanyTruststore הם:

      [
        "serverCert"
      ]
    2. קבלת פרטי אישור עבור אישור ספציפי ממאגר מפתחות או ממאגר אישורים מהימנים ממשק ה-API הזה מחזיר את המידע על אישור ספציפי במאגר אישורים ספציפי.

      משתמש בענן ציבורי:

      curl -v -X GET https//api.enterprise.apigee.com/v1/organizations/ORGANIZATION_NAME/environments/ENVIRONMENT_NAME/keystores/KEYSTORE_NAME/certs/CERT_NAME -H "Authorization: Bearer $TOKEN"
      

      משתמש בענן פרטי

      curl -v -X GET http://MANAGEMENT_HOST:PORT_#>/v1/organizations/ORGANIZATION_NAME/environments/ENVIRONMENT_NAME/keystores/KEYSTORE_NAME/certs/CERT_NAME -H "Authorization: Bearer $TOKEN"
      

      איפה:

      • ‫ORGANIZATION_NAME הוא שם הארגון
      • ‫ENVIRONMENT_NAME הוא שם הסביבה
      • ‫KEYSTORE_NAME הוא השם של מאגר המפתחות
      • ‫CERT_NAME הוא שם האישור
      • המשתנה ‎$TOKEN מוגדר לאסימון הגישה מסוג OAuth 2.0, כפי שמתואר במאמר בנושא קבלת אסימון גישה מסוג OAuth 2.0
      • האפשרויות curl שמשמשות בדוגמה הזו מתוארות במאמר בנושא שימוש ב-curl.

      פלט לדוגמה

      פרטי serverCert מציגים את הנושא והמנפיק באופן הבא:

      אישור עלה/ישות:

      "subject": "CN=mocktarget.apigee.net",
      "issuer": "CN=GTS CA 1D4, O=Google Trust Services LLC, C=US",

      אישור ביניים:

      "subject" : "CN=GTS CA 1D4, O=Google Trust Services LLC, C=US",
      "issuer" : "CN=GTS Root R1, O=Google Trust Services LLC, C=US",
  4. מוודאים שאישור השרת בפועל שהתקבל בשלב 1 זהה לאישור שאוחסן במאגר האישורים שהתקבל בשלב 3. אם הם לא זהים, זו הסיבה לבעיה.

    בדוגמה שלמעלה, נבחן כל אישור בנפרד:

    1. אישור קצה:

      מהשרת העורפי:

      s:/CN=mocktarget.apigee.net
      i:/C=US/O=Google Trust Services LLC/CN=GTS CA 1D4

      ממאגר האישורים של מעבד ההודעות (הלקוח):

      "subject": "CN=mocktarget.apigee.net",
      "issuer": "CN=GTS CA 1D4, O=Google Trust Services LLC, C=US",

      האישור של עלה העץ שמאוחסן במאגר האישורים תואם לזה של שרת הקצה העורפי.

    2. אישור ביניים:

      מהשרת העורפי:

      s:/C=US/O=Google Trust Services LLC/CN=GTS CA 1D4
      i:/C=US/O=Google Trust Services LLC/CN=GTS Root R1

      ממאגר האישורים של מעבד ההודעות (הלקוח):

      "subject" : "CN=GTS CA 1D4, O=Google Trust Services LLC, C=US",
      "issuer" : "CN=GTS Root R1, O=Google Trust Services LLC, C=US",

      אישור הביניים שמאוחסן במאגר האישורים זהה לזה של שרת הקצה העורפי.

    3. אישור בסיס:

      מהשרת העורפי:

      s:/C=US/O=Google Trust Services LLC/CN=GTS Root R1
      i:/C=US/O=Google Trust Services LLC/CN=GTS Root R1

      אישור הבסיס חסר לחלוטין במאגר האישורים של מעבד ההודעות.

    4. מכיוון שאישור הבסיס חסר במאגר האישורים, מעבד ההודעות יוצר את החריגה הבאה:

      sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

      ומוחזר קוד 503 Service Unavailable עם קוד השגיאה messaging.adaptors.http.flow.SslHandshakeFailed לאפליקציות של הלקוח.

רזולוציה

  1. מוודאים שיש לכם את שרשרת האישורים המלאה והנכונה של שרת הקצה העורפי.
  2. אם אתם משתמשים בענן ציבורי, אתם צריכים לפעול לפי ההוראות במאמר עדכון אישור TLS עבור Cloud כדי לעדכן את האישור במאגר האישורים של מעבד ההודעות ב-Apigee Edge.
  3. אם אתם משתמשים ב-Private Cloud, אתם צריכים לפעול לפי ההוראות במאמר עדכון אישור TLS ל-Private Cloud כדי לעדכן את האישור ב-truststore של מעבד ההודעות ב-Apigee Edge.

הגורם: אי התאמה בין שם הדומיין שמוגדר במלואו (FQDN) באישור של שרת הקצה העורפי לבין שם המארח בנקודת הקצה של היעד

אם שרת הקצה העורפי מציג שרשרת אישורים שמכילה FQDN, שלא תואם לשם המארח שצוין בנקודת הקצה של היעד, תהליך העברת ההודעות ב-Apigee Edge מחזיר את השגיאה SSL Handshake failed sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target.

אבחון

  1. בודקים את נקודת הקצה הספציפית של היעד ב-API proxy שבו השגיאה הזו מופיעה, ורושמים את שם המארח של שרת הבק-אנד:

    TargetEndpoint לדוגמה:

    <TargetEndpoint name="default">
       …
       <HTTPTargetConnection>
          <Properties />
          <SSLInfo>
             <Enabled>true</Enabled>
             <TrustStore>ref://myTrustStoreRef</TrustStore>
          </SSLInfo>
          <URL>https://backend.company.com/resource</URL>
       </HTTPTargetConnection>
    </TargetEndpoint>

    בדוגמה שלמעלה, שם המארח של שרת הקצה העורפי הוא backend.company.com.

  2. כדי לקבוע את ה-FQDN באישור של שרת הקצה העורפי, משתמשים בפקודה openssl כפי שמוצג בהמשך:

    openssl s_client -connect BACKEND_SERVER_HOST_NAME>:PORT_#>
    

    לדוגמה:

    openssl s_client -connect backend.company.com:443
    

    בודקים את סעיף Certificate chain ורושמים את ה-FQDN שצוין כחלק מה-CN בנושא של אישור העלה.

    Certificate chain
     0 s:/CN=backend.apigee.net
       i:/C=US/O=Google Trust Services LLC/CN=GTS CA 1D4
     1 s:/C=US/O=Google Trust Services LLC/CN=GTS CA 1D4
       i:/C=US/O=Google Trust Services LLC/CN=GTS Root R1
     2 s:/C=US/O=Google Trust Services LLC/CN=GTS Root R1
       i:/C=US/O=Google Trust Services LLC/CN=GTS Root R1
    

    בדוגמה שלמעלה, ה-FQDN של שרת הקצה העורפי הוא backend.apigee.net.

  3. אם שם המארח של שרת הקצה העורפי שהתקבל משלב 1 ושם הדומיין המלא שהתקבל משלב 2 לא זהים, זו הסיבה לשגיאה.
  4. בדוגמה שצוינה למעלה, שם המארח בנקודת הקצה של היעד הוא backend.company.com. עם זאת, שם ה-FQDN באישור של שרת הקצה העורפי הוא backend.apigee.net. מכיוון שהם לא זהים, השגיאה הזו מופיעה.

רזולוציה

כדי לפתור את הבעיה, אפשר להשתמש באחת מהשיטות הבאות:

תיקון ה-FQDN

מעדכנים את מאגר המפתחות של שרת הקצה העורפי עם FQDN נכון ושרשרת אישורים מלאה ותקינה:

  1. אם אין לכם אישור של שרת קצה עורפי עם שם דומיין מלא (FQDN) נכון, אז צריך להשיג את האישור המתאים מרשות אישורים (CA) מתאימה.
  2. מוודאים שיש לכם שרשרת אישורים תקינה ומלאה של שרת הקצה העורפי.

  3. אחרי שיש לכם שרשרת אישורים מלאה ותקינה עם שם הדומיין שמוגדר במלואו (FQDN) של שרת הקצה העורפי (backend) באישור העלה או באישור הישות, שזהה לשם המארח שצוין בנקודת הקצה של היעד, צריך לעדכן את מאגר המפתחות של הקצה העורפי עם שרשרת האישורים המלאה.

שרת עורפי נכון

מעדכנים את נקודת הקצה של היעד עם שם המארח הנכון של שרת הקצה העורפי:

  1. אם שם המארח צוין בצורה שגויה בנקודת הקצה של היעד, צריך לעדכן את נקודת הקצה של היעד כך ששם המארח יהיה נכון ויתאים ל-FQDN באישור של שרת הקצה העורפי.
  2. שומרים את השינויים ב-proxy ל-API.

    בדוגמה שצוינה למעלה, אם שם המארח של שרת הקצה העורפי צוין בצורה שגויה, אפשר לתקן את זה באמצעות ה-FQDN מאישור שרת הקצה העורפי, כלומר backend.apigee.net באופן הבא:

    <TargetEndpoint name="default">
       …
       <HTTPTargetConnection>
          <Properties />
          <SSLInfo>
             <Enabled>true</Enabled>
             <TrustStore>ref://myTrustStoreRef</TrustStore>
          </SSLInfo>
          <URL>https://backend.apigee.net/resource</URL>
       </HTTPTargetConnection>
    </TargetEndpoint>

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

אבחון

  1. כדי לקבל את שרשרת האישורים של שרת הקצה העורפי, מריצים את הפקודה openssl מול שם המארח של שרת הקצה העורפי באופן הבא:
    openssl s_client -connect BACKEND_SERVER_HOST_NAME:PORT_#
    

    שימו לב לערך Certificate chain בפלט של הפקודה שלמעלה.

    דוגמה לשרשרת אישורים של שרת קצה עורפי מתוך פלט הפקודה של openssl:

    Certificate chain
     0 s:/CN=mocktarget.apigee.net
       i:/C=US/O=Google Trust Services LLC/CN=GTS CA 1D4
     1 s:/C=US/O=Google Trust Services LLC/CN=GTS CA 1D4
       i:/C=US/O=Google Trust Services LLC/CN=GTS Root R1
       
  2. מוודאים שיש לכם את שרשרת האישורים המלאה והנכונה, כפי שמוסבר במאמר בנושא אימות שרשרת אישורים.
  3. אם אין לכם שרשרת אישורים תקפה ומלאה לשרת העורפי, זו הסיבה לבעיה הזו.

    בשרשרת האישורים של שרת הקצה העורפי לדוגמה שמוצגת למעלה, אישור הבסיס חסר. לכן מוצגת השגיאה הזו.

רזולוציה

מעדכנים את מאגר המפתחות של שרת הקצה העורפי עם שרשרת אישורים תקינה ומלאה:

  1. מוודאים שיש לכם שרשרת אישורים תקינה ומלאה של שרת הקצה העורפי.

  2. מעדכנים את שרשרת האישורים התקינה והמלאה במאגר המפתחות של שרת הקצה העורפי.

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

צריך לאסוף פרטי אבחון

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

  • אם אתם משתמשי ענן ציבורי, עליכם לספק את הפרטים הבאים:
    • שם הארגון
    • שם הסביבה
    • שם ה-proxy ל-API
    • השלמת הפקודה curl כדי לשחזר את השגיאה
    • קובץ פרטי העברה שבו מוצגת השגיאה
    • הפלט של הפקודה openssl:

      openssl s_client -connect BACKEND_SERVER_HOST_NAME:PORT_#

    • חבילות TCP/IP שתועדו בשרת העורפי
  • אם אתם משתמשי Private Cloud, עליכם לספק את הפרטים הבאים:
    • הודעת השגיאה המלאה שזוהתה
    • חבילת proxy ל-API
    • קובץ פרטי העברה שבו מוצגת השגיאה
    • יומנים של מעבד בקשות /opt/apigee/var/log/edge-message-processor/logs/system.log
    • הפלט של הפקודה openssl:
      openssl s_client -connect BACKEND_SERVER_HOST_NAME:PORT_#
    • חבילות TCP/IP שתועדו בשרת העורפי או במעבד ההודעות.
    • הפלט של API‏ Get all certificates for a keystore or truststore וגם הפרטים של כל אישור שהתקבל באמצעות API‏ Get Cert Details from a Keystore or Truststore.

קובצי עזר