شما در حال مشاهده مستندات 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 handshake بین پردازنده پیام Apigee Edge و سرور backend است. پیام خطا در 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 in the faultstring توضیح میدهد.
این خطا در طول فرآیند SSL handshake بین پردازنده پیام Apigee Edge و سرور backend رخ میدهد:
- اگر فروشگاه اعتماد پردازنده پیام Apigee Edge:
- حاوی زنجیره گواهی است که با کل زنجیره گواهی سرور backend مطابقت ندارد، یا
- شامل کل زنجیره گواهی سرور backend نمیشود.
- اگر زنجیره گواهی توسط سرور backend ارائه شده باشد:
- شامل نام دامنه کاملاً واجد شرایط (FQDN) است که با نام میزبان مشخص شده در نقطه پایانی هدف مطابقت ندارد.
- حاوی زنجیره گواهی نادرست یا ناقص است
علل احتمالی این مشکل به شرح زیر است:
| علت | توضیحات | دستورالعملهای عیبیابی قابل اجرا برای |
|---|---|---|
| گواهی یا زنجیره گواهی نادرست/ناقص در حافظه امن پردازشگر پیام | گواهی و/یا زنجیره آن که در حافظه امن پردازشگر پیام Apigee Edge ذخیره شده است، با زنجیره گواهی سرور backend مطابقت ندارد یا شامل زنجیره کامل گواهی سرور backend نیست. | کاربران Edge Private و Public Cloud |
| عدم تطابق FQDN در گواهی سرور backend و نام میزبان در نقطه پایانی هدف | گواهی ارائه شده توسط سرور backend حاوی یک FQDN است که با نام میزبان مشخص شده در نقطه پایانی هدف مطابقت ندارد. | کاربران Edge Private و Public Cloud |
| گواهی یا زنجیره گواهی نادرست/ناقص ارائه شده توسط سرور backend | زنجیره گواهی ارائه شده توسط سرور backend یا نادرست یا ناقص است. | کاربران Edge Private و Public Cloud |
مراحل تشخیص مشترک
برای تشخیص این خطا از یکی از ابزارها/تکنیکهای زیر استفاده کنید:
نظارت بر API
روش شماره ۱: استفاده از مانیتورینگ API
برای تشخیص خطا با استفاده از مانیتورینگ API:
- به عنوان کاربری با نقش کاربری مناسب، وارد Apigee Edge UI شوید .
به سازمانی که میخواهید مشکل را در آن بررسی کنید، مراجعه کنید.

- به صفحه Analyze > API Monitoring > Investigate بروید.
- بازه زمانی خاصی را که در آن خطاها را مشاهده کردهاید، انتخاب کنید.
رسم کد خطا در مقابل زمان .
سلولی را انتخاب کنید که کد خطای
messaging.adaptors.http.flow.SslHandshakeFailedرا دارد، همانطور که در زیر نشان داده شده است:
اطلاعات مربوط به کد خطای
messaging.adaptors.http.flow.SslHandshakeFailedمطابق شکل زیر نمایش داده میشود:
روی «مشاهده گزارشها» کلیک کنید و ردیف مربوط به درخواست ناموفق را باز کنید.

- از پنجره Logs ، جزئیات زیر را یادداشت کنید:
- درخواست شناسه پیام
- کد وضعیت:
503 - منبع خطا:
target - کد خطا:
messaging.adaptors.http.flow.SslHandshakeFailed
ردیابی
روش شماره ۲: استفاده از ابزار ردیابی
برای تشخیص خطا با استفاده از ابزار Trace:
- جلسه ردیابی را فعال کنید و یا
- منتظر خطای
503 Service Unavailableبا کد خطاmessaging.adaptors.http.flow.SslHandshakeFailedباشید، یا - اگر میتوانید مشکل را دوباره ایجاد کنید، فراخوانی API را برای ایجاد مجدد مشکل انجام دهید
503 Service Unavailable
- منتظر خطای
مطمئن شوید که گزینهی Show all FlowInfos فعال است:

- یکی از درخواستهای ناموفق را انتخاب کنید و مسیر پیگیری را بررسی کنید.
- مراحل مختلف ردیابی را طی کنید و محل وقوع خرابی را پیدا کنید.
معمولاً پس از شروع مرحلهی «جریان درخواست هدف» (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 - کلاس خطا:
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 نتوانسته گواهی سرور backend را اعتبارسنجی کند.
- خطا:
- در مسیر ردیابی، به مرحله AX (دادههای تحلیلی ثبتشده) بروید و روی آن کلیک کنید.
به پایین اسکرول کنید تا به بخش Phase Details Error Headers برسید و مقادیر X-Apigee-fault-code و X-Apigee-fault-source و X-Apigee-Message-ID را مطابق شکل زیر تعیین کنید:

- به مقادیر X-Apigee-fault-code ، X-Apigee-fault-source و X-Apigee-Message-ID توجه کنید:
| هدرهای خطا | ارزش |
|---|---|
| کد خطای X-Apigee | messaging.adaptors.http.flow.SslHandshakeFailed |
| منبع گسل X-Apigee | target |
| شناسه پیام X-Apigee | MESSAGE_ID |
انجینکس
روش شماره ۳: استفاده از گزارشهای دسترسی NGINX
برای تشخیص خطا با استفاده از گزارشهای دسترسی NGINX:
- اگر شما یک کاربر ابر خصوصی هستید، میتوانید از گزارشهای دسترسی NGINX برای تعیین اطلاعات کلیدی در مورد
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 را تعیین کنید.نمونه خطای ۵۰۳ از لاگ دسترسی NGINX:

ورودی نمونه بالا از لاگ دسترسی NGINX دارای مقادیر زیر برای X-Apigee-fault-code و X-Apigee-fault-source است:
سربرگها ارزش کد خطای X-Apigee messaging.adaptors.http.flow.SslHandshakeFailedمنبع گسل X-Apigee target
گزارشهای پردازنده پیام
روش شماره ۴: استفاده از گزارشهای پردازشگر پیام
- شناسه پیام یکی از درخواستهای ناموفق را با استفاده از API Monitoring، ابزار Trace یا NGINX Access Logs همانطور که در مراحل تشخیص مشترک توضیح داده شده است، تعیین کنید.
شناسه پیام درخواست خاص را در گزارش پردازشگر پیام (
/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 handshake بین پردازنده پیام و سرور backend با شکست مواجه شده است.
این با یک استثنا با ردیابی دقیق پشته، همانطور که در زیر نشان داده شده است، دنبال خواهد شد:
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>توجه داشته باشید که عدم موفقیت در handshake به دلایل زیر است:
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 Handshake با شکست مواجه شده است، زیرا پردازنده پیام Apigee Edge قادر به اعتبارسنجی گواهی سرور backend نبوده است.
علت: گواهی یا زنجیره گواهی نادرست/ناقص در حافظه امن پردازشگر پیام
تشخیص
- کد خطا ، منبع خطا برای خطای مشاهده شده را با استفاده از API Monitoring، ابزار Trace یا گزارشهای دسترسی NGINX، همانطور که در مراحل تشخیص مشترک توضیح داده شده است، تعیین کنید.
- اگر کد خطا
messaging.adaptors.http.flow.SslHandshakeFailedباشد، با استفاده از یکی از روشهای زیر پیام خطا را تعیین کنید: - همانطور که در مراحل تشخیص رایج توضیح داده شده است، با استفاده از ابزار Trace، علت خطا را پیدا کنید.
- همانطور که در مراحل تشخیص مشترک توضیح داده شده است، با استفاده از گزارشهای پردازنده پیام، استثنا را پیدا کنید
-
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 نتوانسته گواهی سرور backend را تأیید کند.
شما میتوانید این مشکل را در دو مرحله اشکالزدایی کنید:
- مرحله ۱: تعیین زنجیره گواهی سرور backend
- مرحله ۲: مقایسه زنجیره گواهی ذخیره شده در حافظه اعتماد پردازشگر پیام
فاز ۱
مرحله ۱: تعیین زنجیره گواهی سرور backend
برای تعیین زنجیره گواهی سرور backend از یکی از روشهای زیر استفاده کنید:
اوپناساسال
دستور openssl در مقابل نام میزبان سرور backend به صورت زیر اجرا کنید:
openssl s_client -connect BACKEND_SERVER_HOST_NAME:PORT#
به زنجیره گواهی از خروجی دستور بالا توجه کنید:
نمونه زنجیره گواهی سرور backend از خروجی دستور 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
تیسیپیدامپ
- اگر شما یک کاربر ابر عمومی هستید، بستههای TCP/IP را در سرور backend ضبط کنید.
- اگر شما یک کاربر ابر خصوصی هستید، میتوانید بستههای TCP/IP را روی سرور backend یا پردازشگر پیام ضبط کنید. ترجیحاً، آنها را روی سرور backend ضبط کنید زیرا بستهها در سرور backend رمزگشایی میشوند.
برای ضبط بستههای TCP/IP از دستور tcpdump زیر استفاده کنید:
tcpdump -i any -s 0 host IP_ADDRESS -w FILE_NAME
بستههای TCP/IP را با استفاده از ابزار Wireshark یا ابزار مشابهی که با آن آشنا هستید، تجزیه و تحلیل کنید.
تحلیل نمونه Tcpdump

- بسته شماره ۴۳: پردازنده پیام (منبع) یک پیام
Client Helloبه سرور backend (مقصد) ارسال کرد. - بسته شماره ۴۴: سرور backend دریافت پیام
Client Helloرا از پردازنده پیام تأیید میکند. - بسته شماره ۴۵: سرور backend پیام
Server Helloرا به همراه گواهی خود ارسال میکند. - بسته شماره ۴۶: پردازشگر پیام، دریافت پیام
Server Helloو گواهی را تأیید میکند. بسته شماره ۴۷: پردازنده پیام یک پیام
FIN, ACKو به دنبال آنRST, ACKدر بسته شماره ۴۸ ارسال میکند.این نشان میدهد که اعتبارسنجی گواهی سرور backend توسط پردازشگر پیام با شکست مواجه شده است. دلیل این امر این است که پردازشگر پیام هیچ گواهیای که با گواهی سرور backend مطابقت داشته باشد، ندارد یا نمیتواند به گواهی سرور backend با گواهیهای موجود در truststore (پردازنده پیام) خود اعتماد کند.
میتوانید برگردید و بسته شماره ۴۵ را بررسی کنید و زنجیره گواهی ارسال شده توسط سرور backend را تعیین کنید.

- در این مثال، میتوانید ببینید که سرور یک گواهی برگ با
common name (CN) = mocktarget.apigee.netارسال کرده است و به دنبال آن یک گواهی میانی باCN= GTS CA 1D4و گواهی ریشه باCN = GTX Root R1قرار دارد.
اگر مطمئن شدید که اعتبارسنجی گواهینامه سرور با شکست مواجه شده است، به مرحله 2 بروید: مقایسه گواهینامه سرور backend و گواهینامههای ذخیره شده در حافظه اعتماد پردازنده پیام .
- بسته شماره ۴۳: پردازنده پیام (منبع) یک پیام
فاز ۲
مرحله ۲: مقایسه گواهی سرور backend و گواهیهای ذخیره شده در حافظه اعتماد پردازشگر پیام
- زنجیره گواهی سرور backend را تعیین کنید .
- با استفاده از مراحل زیر، گواهی ذخیره شده در حافظهی اعتماد پردازشگر پیام را تعیین کنید:
نام مرجع truststore را از عنصر
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، گزینه Environments > References را انتخاب کنید. نام مرجع truststore خاص را در ستون Reference یادداشت کنید. این نام truststore شما خواهد بود.

در مثال بالا نام فروشگاه اعتماد عبارت است از:
فروشگاه اعتماد شرکت من مرجع :
myCompanyTruststore
با استفاده از API های زیر، گواهیهای ذخیره شده در truststore (که در مرحله قبل تعیین شدهاند) را دریافت کنید:
دریافت تمام گواهینامههای یک فروشگاه کلید یا فروشگاه اعتماد . این 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"
کاربر ابر خصوصی:
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» توضیح داده شدهاند.
خروجی نمونه:
گواهینامههای مربوط به نمونهی truststore
myCompanyTruststoreعبارتند از:[ "serverCert" ]
- دریافت جزئیات گواهی برای گواهی خاص از یک Keystore یا Truststore . این API اطلاعات مربوط به یک گواهی خاص را در truststore خاص برمیگرداند.
کاربر ابر عمومی:
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",
تأیید کنید که گواهی سرور واقعی که در مرحله ۱ به دست آمده و گواهی ذخیره شده در truststore که در مرحله ۳ به دست آمده است، مطابقت دارند. اگر مطابقت نداشته باشند، دلیل مشکل همین است.
از مثال بالا، بیایید به تک تک گواهیها نگاهی بیندازیم:
- گواهی برگ:
از سرور بکاند:
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",
گواهی میانی ذخیره شده در truststore با گواهی سرور backend مطابقت دارد.
- گواهی ریشه:
از سرور بکاند:
s:/C=US/O=Google Trust Services LLC/CN=GTS Root R1 i:/C=US/O=Google Trust Services LLC/CN=GTS Root R1
گواهی ریشه به طور کامل در مخزن اعتماد پردازشگر پیام (Message Processor) وجود ندارد.
از آنجایی که گواهی ریشه در truststore وجود ندارد، پردازشگر پیام خطای زیر را صادر میکند:
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به برنامههای کلاینت برمیگرداند.
- گواهی برگ:
وضوح تصویر
- مطمئن شوید که زنجیره گواهینامه مناسب و کاملی از سرور backend دارید.
- اگر کاربر فضای ابری عمومی هستید، دستورالعملهای موجود در بخش «بهروزرسانی گواهی TLS برای فضای ابری» را دنبال کنید تا گواهی را به مخزن اعتماد پردازشگر پیام Apigee Edge بهروزرسانی کنید.
- اگر شما یک کاربر ابر خصوصی هستید، دستورالعملهای موجود در بهروزرسانی گواهی TLS برای ابر خصوصی را دنبال کنید تا گواهی را به فروشگاه اعتماد پردازنده پیام Apigee Edge بهروزرسانی کنید.
علت: عدم تطابق FQDN در گواهی سرور backend و نام میزبان در نقطه پایانی هدف
اگر سرور backend یک زنجیره گواهی ارائه دهد که شامل 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 که در آن این خطا را مشاهده میکنید، بررسی کنید و نام میزبان سرور backend را یادداشت کنید:
نمونه نقطه پایانی هدف:
<TargetEndpoint name="default"> … <HTTPTargetConnection> <Properties /> <SSLInfo> <Enabled>true</Enabled> <TrustStore>ref://myTrustStoreRef</TrustStore> </SSLInfo> <URL>https://backend.company.com/resource</URL> </HTTPTargetConnection> </TargetEndpoint>در مثال بالا، نام میزبان سرور backend
backend.company.comاست. با استفاده از دستور
opensslمطابق شکل زیر، FQDN موجود در گواهی سرور backend را تعیین کنید: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
backend.apigee.netاست.- اگر نام میزبان سرور backend که از مرحله ۱ به دست آمده و FQDN که از مرحله ۲ به دست آمده است، مطابقت نداشته باشند، علت خطا همین است.
- در مثالی که در بالا مورد بحث قرار گرفت، نام میزبان در نقطه پایانی هدف
backend.company. comاست. با این حال، نام FQDN در گواهی سرور backend،backend.apigee. netاست. از آنجایی که آنها مطابقت ندارند، این خطا را دریافت میکنید.
وضوح تصویر
شما میتوانید با استفاده از یکی از روشهای زیر این مشکل را برطرف کنید:
FQDN صحیح
بهروزرسانی کلید سرور backend با FQDN صحیح، زنجیره گواهی معتبر و کامل:
- اگر گواهی سرور بکاند با FQDN صحیح ندارید، گواهی مناسب را از یک CA (مرجع صدور گواهی) مناسب تهیه کنید.
تأیید کنید که زنجیره گواهی سرور backend معتبر و کاملی دارید .
- زمانی که زنجیره گواهی معتبر و کامل را با FQDN صحیح سرور backend در leaf یا گواهی entity که با نام میزبان مشخص شده در endpoint هدف یکسان است، در اختیار داشتید، keystore مربوط به backend را با زنجیره گواهی کامل بهروزرسانی کنید.
سرور پشتیبان صحیح
نقطه پایانی هدف را با نام میزبان سرور backend صحیح بهروزرسانی کنید:
- اگر نام میزبان در نقطه پایانی هدف به اشتباه مشخص شده است، نقطه پایانی هدف را بهروزرسانی کنید تا نام میزبان صحیحی داشته باشید که با FQDN موجود در گواهی سرور backend مطابقت داشته باشد.
تغییرات را در پروکسی API ذخیره کنید.
در مثالی که در بالا مورد بحث قرار گرفت، اگر نام میزبان سرور backend به اشتباه مشخص شده باشد، میتوانید با استفاده از FQDN از گواهی سرور backend، که
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>
علت: گواهی یا زنجیره گواهی نادرست/ناقص ارائه شده توسط سرور backend
تشخیص
- با اجرای دستور
opensslدر مقابل نام میزبان سرور backend به شرح زیر، زنجیره گواهی سرور backend را دریافت کنید:openssl s_client -connect BACKEND_SERVER_HOST_NAME:PORT_#
به
Certificate chainاز خروجی دستور بالا توجه کنید.نمونه زنجیره گواهی سرور backend از خروجی دستور 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 - تأیید کنید که زنجیره گواهی مناسب و کامل را همانطور که در اعتبارسنجی زنجیره گواهی توضیح داده شده است، دارید.
اگر زنجیره گواهینامه معتبر و کاملی برای سرور backend ندارید، دلیل این مشکل همین است.
در زنجیره گواهی سرور backend نمونه که در بالا نشان داده شده است، گواهی ریشه وجود ندارد. بنابراین، این خطا را دریافت میکنید.
وضوح تصویر
بهروزرسانی کلید سرور backend با زنجیره گواهی معتبر و کامل:
تأیید کنید که زنجیره گواهی سرور backend معتبر و کاملی دارید .
- زنجیره گواهی معتبر و کامل را در keystore سرور backend بهروزرسانی کنید.
اگر مشکل همچنان ادامه داشت، به «باید اطلاعات تشخیصی جمعآوری شود» بروید.
باید اطلاعات تشخیصی جمعآوری کند
اگر مشکل حتی پس از دنبال کردن دستورالعملهای بالا ادامه داشت، اطلاعات تشخیصی زیر را جمعآوری کرده و با پشتیبانی Apigee Edge تماس بگیرید:
- اگر کاربر فضای ابری عمومی هستید، اطلاعات زیر را ارائه دهید:
- نام سازمان
- نام محیط
- نام پروکسی API
- دستور
curlرا برای بازتولید خطا کامل کنید - فایل ردیابی که خطا را نشان میدهد
خروجی دستور
openssl:openssl s_client -connect BACKEND_SERVER_HOST_NAME : PORT_#- بستههای TCP/IP که در سرور backend ضبط میشوند
- اگر کاربر Private Cloud هستید، اطلاعات زیر را ارائه دهید:
- پیام خطای کامل مشاهده شد
- بسته پروکسی API
- فایل ردیابی که خطا را نشان میدهد
- گزارشهای پردازشگر پیام
/opt/apigee/var/log/edge-message-processor/logs/system.log - خروجی دستور
openssl:
openssl s_client -connect BACKEND_SERVER_HOST_NAME : PORT_# - بستههای TCP/IP که در سرور backend یا پردازنده پیام ضبط میشوند.
- خروجی دستور Get all certificates for a keystore یا truststore API و همچنین جزئیات هر گواهی که با استفاده از Get Cert Details from a Keystore یا Truststore API دریافت شده است.
منابع
- زنجیره اعتماد گواهی
- دستور OpenSSL