אתם צופים במסמכי התיעוד של 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:
- מכיל שרשרת אישורים שלא תואמת לשרשרת האישורים המלאה של שרת הקצה העורפי, או
- לא מכיל את שרשרת האישורים המלאה של שרת הקצה העורפי
- אם שרשרת האישורים שמוצגת על ידי שרת הקצה העורפי:
- מכיל שם דומיין שמוגדר במלואו (FQDN) שלא תואם לשם המארח שצוין בנקודת הקצה של היעד
- הוא מכיל שרשרת אישורים שגויה או לא מלאה
אלה הסיבות האפשריות לבעיה:
| סיבה | תיאור | הוראות לפתרון בעיות שרלוונטיות ל |
|---|---|---|
| אישור או שרשרת אישורים לא נכונים או לא מלאים במאגר האישורים של מעבד ההודעות | האישור ו/או השרשרת שלו שמאוחסנים במאגר האישורים של מעבד ההודעות ב-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':
- נכנסים לממשק המשתמש של Apigee Edge בתור משתמש עם תפקיד מתאים.
עוברים לארגון שבו רוצים לבדוק את הבעיה.
- עוברים לדף Analyze > API Monitoring > Investigate.
- בוחרים את מסגרת הזמן הספציפית שבה נתקלת בשגיאות.
משרטטים את קוד התקלה מול הזמן.
בוחרים תא עם קוד השגיאה
messaging.adaptors.http.flow.SslHandshakeFailedכמו שמוצג למטה:( הגדלת התמונה)

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

לוחצים על הצגת יומנים ומרחיבים את השורה של הבקשה שנכשלה.
( הגדלת התמונה)
- בחלון יומנים, רושמים את הפרטים הבאים:
- מזהה הודעת הבקשה
- קוד סטטוס:
503 - מקור התקלה:
target - קוד תקלה:
messaging.adaptors.http.flow.SslHandshakeFailed
מעקב
תהליך מספר 2: שימוש בכלי המעקב
כדי לאבחן את השגיאה באמצעות הכלי Trace:
- מפעילים את trace session ואת אחת מהאפשרויות הבאות:
- מחכים לשגיאה
503 Service Unavailableעם קוד השגיאהmessaging.adaptors.http.flow.SslHandshakeFailed, או - אם אפשר לשחזר את הבעיה, מבצעים את הקריאה ל-API כדי לשחזר את הבעיה
503 Service Unavailable
- מחכים לשגיאה
מוודאים שהאפשרות הצגת כל פרטי הזרימה מופעלת:

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

- שימו לב לערכים הבאים מהמעקב:
- שגיאה:
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 לא הצליח לאמת את האישור של שרת הקצה העורפי.
- שגיאה:
- עוברים לשלב AX (נתוני Analytics שתועדו) בנתוני המעקב ולוחצים עליו.
גוללים למטה לקטע Phase Details Error Headers (כותרות שגיאה של פרטי השלב) ומזהים את הערכים של X-Apigee-fault-code (קוד שגיאה של Apigee), X-Apigee-fault-source (מקור השגיאה של Apigee) ו-X-Apigee-Message-ID (מזהה ההודעה של Apigee), כמו שמוצג בהמשך:
( הגדלת התמונה)

- שימו לב לערכים של X-Apigee-fault-code, X-Apigee-fault-source ו-X-Apigee-Message-ID:
| כותרות שגיאה | ערך |
|---|---|
| X-Apigee-fault-code | messaging.adaptors.http.flow.SslHandshakeFailed |
| X-Apigee-fault-source | target |
| X-Apigee-Message-ID | MESSAGE_ID |
NGINX
תהליך מספר 3: שימוש ביומני גישה של NGINX
כדי לאבחן את השגיאה באמצעות יומני הגישה של NGINX:
- אם אתם משתמשי Private Cloud, אתם יכולים להשתמש ביומני הגישה של NGINX כדי לקבוע את פרטי המפתח לגבי HTTP
503 Service Unavailable. בודקים את יומני הגישה של NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log- מחפשים שגיאות
503עם קוד שגיאהmessaging.adaptors.http.flow.SslHandshakeFailedבמהלך פרק זמן מסוים (אם הבעיה התרחשה בעבר) או אם יש בקשות שעדיין נכשלות עם503. אם מופיעות שגיאות
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.SslHandshakeFailedX-Apigee-fault-source target
יומנים של מעבד הודעות
תהליך מספר 4: שימוש ביומני מעבד בקשות
- קובעים את מזהה ההודעה של אחת מהבקשות שנכשלו באמצעות API Monitoring, הכלי Trace או יומני הגישה של NGINX, כמו שמוסבר בשלבים נפוצים לאבחון.
מחפשים את מזהה הודעת הבקשה הספציפית ביומן של מעבד ההודעות (
/opt/apigee/var/log/edge-message-processor/logs/system.log). יכול להיות שתופיע השגיאה הבאה:org:myorg env:test api:MyProxy rev:1
messageid:myorg-28247-3541813-1NIOThread@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-1NIOThread@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 targetat 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 לא הצליח לאמת את האישור של שרת הקצה העורפי.
הסיבה: אישור או שרשרת אישורים לא נכונים או לא מלאים במאגר האישורים של מעבד ההודעות
אבחון
- קובעים את קוד השגיאה ומקור השגיאה של השגיאה שנצפתה באמצעות מעקב אחר קריאות ל-API, הכלי Trace או יומני הגישה של NGINX, כמו שמוסבר בשלבים נפוצים לאבחון.
- אם קוד התקלה הוא
messaging.adaptors.http.flow.SslHandshakeFailed, צריך לקבוע את הודעת השגיאה באחת מהשיטות הבאות: - מוצאים את error.cause באמצעות כלי המעקב, כמו שמוסבר במאמר בנושא שלבים נפוצים לאבחון
- מחפשים את החריג באמצעות יומני מעבד ההודעות, כמו שמוסבר בשלבים נפוצים לאבחון
- מחפשים את קוד השגיאה
faultstringבתגובה לשגיאה בקריאה ל-API, כפי שמופיע בהודעת השגיאה. - אם הודעת השגיאה היא
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: קביעת שרשרת האישורים של שרת הקצה העורפי
- שלב 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
- אם אתם משתמשים בענן ציבורי, אתם צריכים ללכוד את מנות ה-TCP/IP בשרת הקצה העורפי.
- אם אתם משתמשים ב-Private Cloud, אתם יכולים ללכוד את מנות ה-TCP/IP בשרת העורפי או במעבד ההודעות. עדיף ללכוד אותם בשרת העורפי, כי החבילות מפוענחות בשרת העורפי.
משתמשים בפקודה הבאה של tcpdump כדי לתעד חבילות TCP/IP:
tcpdump -i any -s 0 host IP_ADDRESS -w FILE_NAME
מנתחים את חבילות ה-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: השוואה בין האישור של שרת הקצה העורפי לבין האישורים שמאוחסנים במאגר האישורים המהימנים של מעבד ההודעות.
- Packet #43: מעבד ההודעות (מקור) שלח הודעת
שלב 2
שלב 2: השוואה בין האישור של שרת הקצה העורפי לבין האישורים שמאוחסנים במאגר האישורים של מעבד ההודעות
- קובעים את שרשרת האישורים של שרת הקצה העורפי.
- כדי לקבוע את האישור שמאוחסן במאגר האישורים של מעבד ההודעות, פועלים לפי השלבים הבאים:
מקבלים את שם ההפניה של מאגר האישורים מהרכיב
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>- בדוגמה שלמעלה, שם ההפניה
TrustStoreהואmyCompanyTruststoreRef. בממשק המשתמש של Edge, בוחרים באפשרות סביבות > קובצי עזר. שימו לב לשם בעמודה Reference (אסמכתא) של הפניה ספציפית למאגר האישורים. זה יהיה השם של חנות האישורים שלכם.
( הגדלת התמונה)
בדוגמה שלמעלה, שם מאגר האישורים הוא:
myCompanyTruststoreRef:
myCompanyTruststore
מקבלים את האישורים שמאוחסנים במאגר האישורים (שנקבע בשלב הקודם) באמצעות ממשקי ה-API הבאים:
קבלת כל האישורים של חנות מפתחות או חנות אישורים מהימנים ממשק ה-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" ]
-
קבלת פרטי אישור עבור אישור ספציפי ממאגר מפתחות או ממאגר אישורים מהימנים
ממשק ה-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",
מוודאים שאישור השרת בפועל שהתקבל בשלב 1 זהה לאישור שאוחסן במאגר האישורים שהתקבל בשלב 3. אם הם לא זהים, זו הסיבה לבעיה.
בדוגמה שלמעלה, נבחן כל אישור בנפרד:
- אישור קצה:
מהשרת העורפי:
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",
האישור של עלה העץ שמאוחסן במאגר האישורים תואם לזה של שרת הקצה העורפי.
- אישור ביניים:
מהשרת העורפי:
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",
אישור הביניים שמאוחסן במאגר האישורים זהה לזה של שרת הקצה העורפי.
- אישור בסיס:
מהשרת העורפי:
s:/C=US/O=Google Trust Services LLC/CN=GTS Root R1 i:/C=US/O=Google Trust Services LLC/CN=GTS Root R1
אישור הבסיס חסר לחלוטין במאגר האישורים של מעבד ההודעות.
מכיוון שאישור הבסיס חסר במאגר האישורים, מעבד ההודעות יוצר את החריגה הבאה:
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לאפליקציות של הלקוח.
- אישור קצה:
רזולוציה
- מוודאים שיש לכם את שרשרת האישורים המלאה והנכונה של שרת הקצה העורפי.
- אם אתם משתמשים בענן ציבורי, אתם צריכים לפעול לפי ההוראות במאמר עדכון אישור TLS עבור Cloud כדי לעדכן את האישור במאגר האישורים של מעבד ההודעות ב-Apigee Edge.
- אם אתם משתמשים ב-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.
אבחון
- בודקים את נקודת הקצה הספציפית של היעד ב-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. כדי לקבוע את ה-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.neti:/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.- אם שם המארח של שרת הקצה העורפי שהתקבל משלב 1 ושם הדומיין המלא שהתקבל משלב 2 לא זהים, זו הסיבה לשגיאה.
- בדוגמה שצוינה למעלה, שם המארח בנקודת הקצה של היעד הוא
backend.company.com. עם זאת, שם ה-FQDN באישור של שרת הקצה העורפי הואbackend.apigee.net. מכיוון שהם לא זהים, השגיאה הזו מופיעה.
רזולוציה
כדי לפתור את הבעיה, אפשר להשתמש באחת מהשיטות הבאות:
תיקון ה-FQDN
מעדכנים את מאגר המפתחות של שרת הקצה העורפי עם FQDN נכון ושרשרת אישורים מלאה ותקינה:
- אם אין לכם אישור של שרת קצה עורפי עם שם דומיין מלא (FQDN) נכון, אז צריך להשיג את האישור המתאים מרשות אישורים (CA) מתאימה.
מוודאים שיש לכם שרשרת אישורים תקינה ומלאה של שרת הקצה העורפי.
- אחרי שיש לכם שרשרת אישורים מלאה ותקינה עם שם הדומיין שמוגדר במלואו (FQDN) של שרת הקצה העורפי (backend) באישור העלה או באישור הישות, שזהה לשם המארח שצוין בנקודת הקצה של היעד, צריך לעדכן את מאגר המפתחות של הקצה העורפי עם שרשרת האישורים המלאה.
שרת עורפי נכון
מעדכנים את נקודת הקצה של היעד עם שם המארח הנכון של שרת הקצה העורפי:
- אם שם המארח צוין בצורה שגויה בנקודת הקצה של היעד, צריך לעדכן את נקודת הקצה של היעד כך ששם המארח יהיה נכון ויתאים ל-FQDN באישור של שרת הקצה העורפי.
שומרים את השינויים ב-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>
הסיבה: אישור לא נכון או לא מלא, או שרשרת אישורים לא נכונה או לא מלאה, שהוצגו על ידי שרת הקצה העורפי
אבחון
- כדי לקבל את שרשרת האישורים של שרת הקצה העורפי, מריצים את הפקודה
opensslמול שם המארח של שרת הקצה העורפי באופן הבא:openssl s_client -connect BACKEND_SERVER_HOST_NAME:PORT_#
שימו לב לערך
Certificate chainבפלט של הפקודה שלמעלה.דוגמה לשרשרת אישורים של שרת קצה עורפי מתוך פלט הפקודה של openssl:
Certificate chain 0 s:/
CN=mocktarget.apigee.neti:/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 - מוודאים שיש לכם את שרשרת האישורים המלאה והנכונה, כפי שמוסבר במאמר בנושא אימות שרשרת אישורים.
אם אין לכם שרשרת אישורים תקפה ומלאה לשרת העורפי, זו הסיבה לבעיה הזו.
בשרשרת האישורים של שרת הקצה העורפי לדוגמה שמוצגת למעלה, אישור הבסיס חסר. לכן מוצגת השגיאה הזו.
רזולוציה
מעדכנים את מאגר המפתחות של שרת הקצה העורפי עם שרשרת אישורים תקינה ומלאה:
מוודאים שיש לכם שרשרת אישורים תקינה ומלאה של שרת הקצה העורפי.
- מעדכנים את שרשרת האישורים התקינה והמלאה במאגר המפתחות של שרת הקצה העורפי.
אם הבעיה נמשכת, אפשר לעבור אל איסוף מידע לצורך אבחון.
צריך לאסוף פרטי אבחון
אם הבעיה נמשכת גם אחרי שמבצעים את ההוראות שלמעלה, צריך לאסוף את פרטי האבחון הבאים ולפנות לתמיכה של 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.
קובצי עזר
- אישור שרשרת מהימנות
- פקודת OpenSSL