คุณกำลังดูเอกสารประกอบ 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
กระบวนการแฮนด์เชคระหว่าง Message Processor ของ Apigee Edge และเซิร์ฟเวอร์แบ็กเอนด์เป็นเวลาจำนวนหนึ่ง
เหตุผล ข้อความแสดงข้อผิดพลาดใน faultstring
โดยทั่วไปจะระบุ
สาเหตุที่เป็นไปได้ระดับสูงที่ทำให้เกิดข้อผิดพลาดนี้
คุณต้องใช้สิ่งต่อไปนี้ ตามข้อความแสดงข้อผิดพลาดที่พบใน faultstring
เทคนิคที่เหมาะสมในการแก้ไขปัญหา Playbook นี้อธิบายวิธีแก้ปัญหา
ข้อผิดพลาดนี้ หากคุณเห็นข้อความแสดงข้อผิดพลาด 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 มีลักษณะดังนี้
- มีเชนใบรับรองที่ไม่ตรงกับใบรับรองทั้งหมดของเซิร์ฟเวอร์แบ็กเอนด์ กลุ่มใบรับรอง OR
- ไม่มีเชนใบรับรองทั้งหมดของเซิร์ฟเวอร์แบ็กเอนด์
- หากเชนใบรับรองที่เซิร์ฟเวอร์แบ็กเอนด์แสดง ให้ทําดังนี้
- มี ชื่อโดเมนที่ผ่านการรับรองแบบเต็ม (FQDN) ที่ไม่ตรงกับชื่อโฮสต์ที่ระบุใน ปลายทาง
- มีชุดใบรับรองที่ไม่ถูกต้องหรือไม่สมบูรณ์
สาเหตุที่เป็นไปได้สำหรับปัญหานี้มีดังนี้
สาเหตุ | คำอธิบาย | วิธีการแก้ปัญหาสำหรับ |
---|---|---|
ใบรับรองหรือชุดใบรับรองใน Truststore ของ Message Processor ไม่ถูกต้อง/ไม่สมบูรณ์ | ใบรับรองและ/หรือเชนที่เก็บอยู่ใน Truststore ของ Message Processor ของ Apigee Edge ไม่ตรงกับเชนใบรับรองของเซิร์ฟเวอร์แบ็กเอนด์หรือไม่มีเชนใบรับรองทั้งหมดของเซิร์ฟเวอร์แบ็กเอนด์ | ผู้ใช้ Edge Private และ Public Cloud |
FQDN ในใบรับรองของเซิร์ฟเวอร์แบ็กเอนด์กับชื่อโฮสต์ในปลายทางเป้าหมายไม่ตรงกัน | ใบรับรองที่เซิร์ฟเวอร์แบ็กเอนด์แสดงมี FQDN ที่ไม่ตรงกับชื่อโฮสต์ที่ระบุในปลายทางเป้าหมาย | ผู้ใช้ Edge Private และ Public Cloud |
ใบรับรองที่ไม่ถูกต้อง/ไม่สมบูรณ์หรือชุดใบรับรองแสดงโดยเซิร์ฟเวอร์แบ็กเอนด์ | ชุดใบรับรองที่เซิร์ฟเวอร์แบ็กเอนด์แสดงไม่ถูกต้องหรือไม่สมบูรณ์ | ผู้ใช้ Edge Private และ Public Cloud |
ขั้นตอนการวินิจฉัยทั่วไป
ใช้เครื่องมือ/เทคนิคต่อไปนี้เพื่อวินิจฉัยข้อผิดพลาดนี้
การตรวจสอบ API
ขั้นตอนที่ 1: การใช้การตรวจสอบ API
วิธีวินิจฉัยข้อผิดพลาดโดยใช้การตรวจสอบ API
- ลงชื่อเข้าใช้ Apigee Edge UI ในฐานะผู้ใช้ที่มี บทบาทที่เหมาะสม
เปลี่ยนเป็นองค์กรที่ต้องการตรวจสอบปัญหา
- ไปที่ วิเคราะห์ > การตรวจสอบ API > หน้าตรวจสอบ
- เลือกกรอบเวลาที่คุณพบข้อผิดพลาด
พล็อตรหัสข้อผิดพลาดเทียบกับเวลา
เลือกเซลล์ที่มีรหัสข้อผิดพลาด
messaging.adaptors.http.flow.SslHandshakeFailed
ตามที่แสดง ด้านล่างข้อมูลเกี่ยวกับรหัสข้อผิดพลาด
messaging.adaptors.http.flow.SslHandshakeFailed
จะแสดงเป็น แสดงอยู่ด้านล่างคลิกดูบันทึก และขยายแถวสำหรับคำขอที่ล้มเหลว
- จากหน้าต่าง Logs ให้จดรายละเอียดต่อไปนี้
- รหัสข้อความคำขอ
- รหัสสถานะ:
503
- แหล่งที่มาของข้อผิดพลาด:
target
- รหัสข้อผิดพลาด:
messaging.adaptors.http.flow.SslHandshakeFailed
Trace
ขั้นตอนที่ 2: การใช้เครื่องมือติดตาม
วิธีวินิจฉัยข้อผิดพลาดโดยใช้เครื่องมือติดตาม
- เปิดใช้เซสชันการติดตาม และ
- รอข้อผิดพลาด
503 Service Unavailable
ที่มีรหัสข้อผิดพลาดmessaging.adaptors.http.flow.SslHandshakeFailed
จะเกิดขึ้น หรือ - หากคุณทำให้เกิดปัญหาซ้ำได้ ให้เรียกใช้ API เพื่อจำลองปัญหา
503 Service Unavailable
- รอข้อผิดพลาด
ตรวจสอบว่าเปิดใช้แสดง FlowInfo ทั้งหมด แล้ว
- เลือกคำขอที่ไม่สำเร็จรายการหนึ่งและตรวจสอบการติดตาม
- ดำเนินการตามขั้นตอนต่างๆ ของการติดตามและค้นหาตำแหน่งที่เกิดข้อผิดพลาด
โดยปกติแล้ว คุณจะพบข้อผิดพลาดนี้หลังจากช่วงเริ่มต้นขั้นตอนการขอเป้าหมายแล้ว ดังที่แสดงด้านล่าง
- สังเกตค่าต่อไปนี้จากการติดตาม
- ข้อผิดพลาด:
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 ล้มเหลว เนื่องจาก Message Processor ของ Apigee Edge ไม่สามารถตรวจสอบความถูกต้องของเซิร์ฟเวอร์แบ็กเอนด์ ใบรับรอง
- ข้อผิดพลาด:
- ไปที่ระยะ AX (Analytics Data Recorded) ในการติดตามและคลิก
เลื่อนลงไปที่ส่วนส่วนหัวข้อผิดพลาดเกี่ยวกับรายละเอียดเฟส และระบุ ของ 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-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-code
ส่วนหัว ค่า X-Apigee-fault-code messaging.adaptors.http.flow.SslHandshakeFailed
X-Apigee-fault-source target
บันทึกของผู้ประมวลผลข้อความ
ขั้นตอนที่ 4: การใช้บันทึกโปรแกรมประมวลผลข้อความ
- กำหนดรหัสข้อความของหนึ่งในคำขอที่ล้มเหลวโดยใช้การตรวจสอบ API, เครื่องมือการติดตาม หรือบันทึกการเข้าถึง NGINX ตามที่อธิบายไว้ใน ขั้นตอนการวิเคราะห์ทั่วไป
ค้นหารหัสข้อความของคำขอในบันทึกเครื่องมือประมวลผลข้อความ (
/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 ตรวจสอบใบรับรองของเซิร์ฟเวอร์แบ็กเอนด์ไม่ได้
สาเหตุ: ใบรับรองหรือชุดใบรับรองใน Truststore ของ Message Processor ไม่ถูกต้อง/ไม่สมบูรณ์
การวินิจฉัย
- กำหนดรหัสข้อผิดพลาด แหล่งที่มาของข้อผิดพลาดสำหรับข้อผิดพลาดที่พบโดยใช้ API การตรวจสอบ เครื่องมือการติดตาม หรือบันทึกการเข้าถึง NGINX ตามที่อธิบายไว้ในหัวข้อทั่วไป ขั้นตอนการวินิจฉัย
- หาก Fault Code คือ
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 ล้มเหลว เนื่องจาก Message Processor ของ Apigee Edge ยืนยันเซิร์ฟเวอร์แบ็กเอนด์ไม่ได้ ใบรับรอง
คุณแก้ไขข้อบกพร่องปัญหานี้ได้ 2 ระยะ ดังนี้
- ระยะที่ 1: กำหนดเชนใบรับรองของเซิร์ฟเวอร์แบ็กเอนด์
- ระยะที่ 2: เปรียบเทียบเชนใบรับรองที่จัดเก็บไว้ใน Truststore ของตัวประมวลผลข้อความ
ระยะที่ 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 แพ็กเก็ตในเซิร์ฟเวอร์แบ็กเอนด์หรือ Message Processor ขอแนะนำให้ถ่ายภาพบน เซิร์ฟเวอร์แบ็กเอนด์เมื่อมีการถอดรหัสแพ็กเก็ตในเซิร์ฟเวอร์แบ็กเอนด์
ใช้รายการต่อไปนี้ คำสั่ง tcpdump เพื่อบันทึกแพ็กเก็ต TCP/IP
tcpdump -i any -s 0 host IP_ADDRESS -w FILE_NAME
วิเคราะห์แพ็กเก็ต TCP/IP โดยใช้ เครื่องมือ Wireshark หรือ เครื่องมือที่คล้ายกันที่คุณคุ้นเคย
การวิเคราะห์ตัวอย่างของ Tcpdump
- แพ็กเก็ตที่ 43: โปรเซสเซอร์ข้อความ (แหล่งที่มา) ส่ง
Client Hello
ไปยังเซิร์ฟเวอร์แบ็กเอนด์ (ปลายทาง) - แพ็กเก็ต #44: เซิร์ฟเวอร์แบ็กเอนด์รับทราบการรับ
Client Hello
ข้อความจาก Message Processor - แพ็กเก็ต #45: เซิร์ฟเวอร์แบ็กเอนด์จะส่ง
Server Hello
พร้อมกับใบรับรองของข้อความนั้น - แพ็คเก็ตที่ 46: ผู้ประมวลผลข้อความรับทราบว่าได้รับ
Server Hello
ข้อความและใบรับรอง แพ็กเก็ต #47: โปรแกรมประมวลผลข้อความจะส่ง
FIN, ACK
ข้อความตามด้วยRST, ACK
ในแพ็กเก็ต #48ซึ่งหมายความว่าการตรวจสอบใบรับรองเซิร์ฟเวอร์แบ็กเอนด์โดย ตัวประมวลผลข้อความล้มเหลว เนื่องจากเครื่องมือประมวลผลข้อความไม่มี ใบรับรองที่ตรงกับใบรับรองของเซิร์ฟเวอร์แบ็กเอนด์หรือไม่เชื่อถือ ใบรับรองของเซิร์ฟเวอร์แบ็กเอนด์กับใบรับรองที่มีอยู่ใน Truststore (ผู้ประมวลผลข้อมูลข้อความ)
คุณกลับไปตรวจสอบแพ็กเก็ต #45 และตรวจสอบใบรับรองได้ เชนที่ส่งโดยเซิร์ฟเวอร์แบ็กเอนด์
- ในตัวอย่างนี้ คุณจะเห็นว่าเซิร์ฟเวอร์ส่งใบรับรอง Leaf
ด้วย
common name (CN) = mocktarget.apigee.net
ตามด้วย ใบรับรองกลางที่มีCN= GTS CA 1D4
และใบรับรองรูท ด้วยCN = GTX Root R1
หากคุณแน่ใจว่าการยืนยันการรับรองของเซิร์ฟเวอร์ไม่ผ่านการตรวจสอบ ไปที่ระยะที่ 2: เปรียบเทียบใบรับรองของเซิร์ฟเวอร์แบ็กเอนด์ และใบรับรองที่เก็บไว้ใน Truststore ของ Message Processor
- แพ็กเก็ตที่ 43: โปรเซสเซอร์ข้อความ (แหล่งที่มา) ส่ง
ระยะที่ 2
ระยะที่ 2: เปรียบเทียบใบรับรองของเซิร์ฟเวอร์แบ็กเอนด์กับใบรับรองที่จัดเก็บไว้ใน Truststore ของเครื่องมือประมวลผลข้อความ
- กำหนดเชนใบรับรองของเซิร์ฟเวอร์แบ็กเอนด์
- ระบุใบรับรองที่จัดเก็บไว้ใน Truststore ของตัวประมวลผลข้อความโดยใช้
ขั้นตอนต่อไปนี้
รับชื่อการอ้างอิง 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 UI ให้เลือกสภาพแวดล้อม > ข้อมูลอ้างอิง จดชื่อใน คอลัมน์ข้อมูลอ้างอิงสำหรับข้อมูลอ้างอิง Truststore ที่เฉพาะเจาะจง นี่คือ ชื่อ Truststore
ในตัวอย่างข้างต้น ชื่อ Truststore คือ
myCompanyTruststoreRef:
myCompanyTruststore
รับใบรับรองที่จัดเก็บไว้ใน Truststore (ตามที่ระบุในขั้นตอนก่อนหน้า) ที่ใช้ API ต่อไปนี้
รับใบรับรองทั้งหมดสำหรับคีย์สโตร์หรือ Truststore API นี้จะแสดงข้อมูลทั้งหมด ใน Truststore ที่เฉพาะเจาะจง
ผู้ใช้ระบบคลาวด์สาธารณะ:
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
ตัวอย่างเอาต์พุต:
ใบรับรองจากตัวอย่าง 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"
ผู้ใช้ Private Cloud
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 และใบรับรอง จัดเก็บไว้ใน Truststore ที่ได้จากการจับคู่ในขั้นตอนที่ 3 หากไม่ตรงกัน นั่นคือ ของปัญหานี้
จากตัวอย่างที่แสดงด้านบน เราจะมาดูใบรับรองทีละใบ
- ใบรับรอง Leaf:
จากเซิร์ฟเวอร์แบ็กเอนด์ ให้ทำดังนี้
s:/CN=mocktarget.apigee.net i:/C=US/O=Google Trust Services LLC/CN=GTS CA 1D4
จาก Truststore (ไคลเอ็นต์) ของ Message Processor
"subject": "CN=mocktarget.apigee.net", "issuer": "CN=GTS CA 1D4, O=Google Trust Services LLC, C=US",
ใบรับรอง Leaf ที่จัดเก็บไว้ใน Truststore ตรงกับใบรับรองของแบ็กเอนด์ เซิร์ฟเวอร์
- ใบรับรองกลาง:
จากเซิร์ฟเวอร์แบ็กเอนด์ ให้ทำดังนี้
s:/C=US/O=Google Trust Services LLC/CN=GTS CA 1D4 i:/C=US/O=Google Trust Services LLC/CN=GTS Root R1
จาก Truststore (ไคลเอ็นต์) ของ Message Processor
"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:/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
เนื่องจากไม่มีใบรับรองรูทใน 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
ไปยังลูกค้า แอปพลิเคชัน
- ใบรับรอง Leaf:
ความละเอียด
- ตรวจสอบว่าคุณมีชุดใบรับรองที่เหมาะสมและครบถ้วนของเซิร์ฟเวอร์แบ็กเอนด์
- หากคุณเป็นผู้ใช้ระบบคลาวด์สาธารณะ โปรดทำตามวิธีการใน อัปเดตใบรับรอง TLS สำหรับระบบคลาวด์เพื่ออัปเดตใบรับรองเป็นของ Apigee Edge Truststore ของตัวประมวลผลข้อความ
- หากคุณเป็นผู้ใช้ Private Cloud ให้ทำตามวิธีการใน อัปเดตใบรับรอง TLS สำหรับ Private Cloud เพื่ออัปเดตใบรับรองเป็น Truststore ของ Apigee Edge สำหรับ Message Processor
สาเหตุ: 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 ที่คุณติดตาม
และจดบันทึกชื่อโฮสต์ของเซิร์ฟเวอร์แบ็กเอนด์ ดังนี้
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.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
- หากชื่อโฮสต์ของเซิร์ฟเวอร์แบ็กเอนด์ที่ได้จากขั้นตอนที่ 1 และ FQDN ได้รับ ขั้นตอนที่ 2 ไม่ตรงกัน นั่นเป็นสาเหตุของข้อผิดพลาด
- ในตัวอย่างที่พูดถึงข้างต้น ชื่อโฮสต์ในปลายทางเป้าหมายคือ
backend.company.com
แต่ชื่อ FQDN ในใบรับรองของเซิร์ฟเวอร์แบ็กเอนด์ มีค่าbackend.apigee.net
คุณจะได้รับข้อผิดพลาดนี้เนื่องจากไม่ตรงกัน
ความละเอียด
คุณแก้ไขปัญหานี้ได้โดยใช้วิธีใดวิธีหนึ่งต่อไปนี้
FQDN ที่ถูกต้อง
อัปเดตคีย์สโตร์ของเซิร์ฟเวอร์แบ็กเอนด์ด้วย FQDN ที่ถูกต้อง รวมถึงใบรับรองที่ถูกต้องและสมบูรณ์ เชน:
- หากไม่มีใบรับรองของเซิร์ฟเวอร์แบ็กเอนด์ที่มี FQDN ที่ถูกต้อง จากนั้นจัดหาใบรับรองที่เหมาะสมจาก CA (ผู้ออกใบรับรอง) ที่เหมาะสม
ตรวจสอบว่าคุณมี เชนใบรับรองของเซิร์ฟเวอร์แบ็กเอนด์ที่ถูกต้องและสมบูรณ์
- เมื่อคุณมีชุดใบรับรองที่ถูกต้องและสมบูรณ์ซึ่งมี FQDN ที่ถูกต้องของ เซิร์ฟเวอร์แบ็กเอนด์ในใบรับรอง Leaf หรือเอนทิตีที่เหมือนกับชื่อโฮสต์ ที่ระบุในปลายทางเป้าหมาย ให้อัปเดตคีย์สโตร์ของแบ็กเอนด์ด้วยฟังก์ชัน ชุดใบรับรองที่สมบูรณ์
เซิร์ฟเวอร์แบ็กเอนด์ที่ถูกต้อง
อัปเดตปลายทางเป้าหมายด้วยชื่อโฮสต์ของเซิร์ฟเวอร์แบ็กเอนด์ที่ถูกต้อง
- หากมีการระบุชื่อโฮสต์ไม่ถูกต้องในปลายทางเป้าหมาย ให้อัปเดต ปลายทางปลายทางให้มีชื่อโฮสต์ที่ถูกต้องซึ่งตรงกับ FQDN ในแบ็กเอนด์ ใบรับรองของเซิร์ฟเวอร์
บันทึกการเปลี่ยนแปลงลงในพร็อกซี 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.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 - ตรวจสอบว่าคุณมีชุดใบรับรองที่เหมาะสมและสมบูรณ์ตามที่อธิบายไว้ใน การตรวจสอบชุดใบรับรอง
หากไม่มีชุดใบรับรองที่ถูกต้องและสมบูรณ์สำหรับเซิร์ฟเวอร์แบ็กเอนด์ นั่นจึงเป็นสาเหตุของปัญหานี้
ในเชนใบรับรองของเซิร์ฟเวอร์แบ็กเอนด์ตัวอย่างที่แสดงด้านบน ใบรับรองรูทคือ ขาดหายไป ดังนั้นคุณจะได้รับข้อผิดพลาดนี้
ความละเอียด
อัปเดตคีย์สโตร์ของเซิร์ฟเวอร์แบ็กเอนด์ด้วยกลุ่มใบรับรองที่ถูกต้องและสมบูรณ์ ดังนี้
ตรวจสอบว่าคุณมีชุดใบรับรองของเซิร์ฟเวอร์แบ็กเอนด์ที่ถูกต้องและสมบูรณ์
- อัปเดตเชนใบรับรองที่ถูกต้องและสมบูรณ์ในคีย์สโตร์ของเซิร์ฟเวอร์แบ็กเอนด์
หากยังคงพบปัญหา ให้ไปที่ ต้องรวบรวมข้อมูลการวินิจฉัย
ต้องรวบรวมข้อมูลการวินิจฉัย
หากปัญหายังคงอยู่แม้ว่าจะทำตามคำแนะนำด้านบนแล้ว ให้รวบรวมข้อมูลต่อไปนี้ ข้อมูลการวินิจฉัยและติดต่อฝ่ายสนับสนุนของ Apigee Edge
- หากคุณเป็นผู้ใช้ระบบคลาวด์สาธารณะ ให้ระบุข้อมูลต่อไปนี้
- ชื่อองค์กร
- ชื่อสภาพแวดล้อม
- ชื่อพร็อกซี API
- ทำตามคำสั่ง
curl
เพื่อทำให้เกิดข้อผิดพลาดซ้ำ - ไฟล์การติดตามที่แสดงข้อผิดพลาด
เอาต์พุตของคำสั่ง
openssl
:openssl s_client -connect BACKEND_SERVER_HOST_NAME:PORT_#
- แพ็กเก็ต TCP/IP ที่บันทึกในเซิร์ฟเวอร์แบ็กเอนด์
- หากคุณเป็นผู้ใช้ 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 ที่บันทึกในเซิร์ฟเวอร์แบ็กเอนด์หรือ Message Processor
- เอาต์พุตของ รับใบรับรองทั้งหมดสำหรับ Keystore หรือ Truststore API รวมถึงรายละเอียดของ ใบรับรองแต่ละใบที่ได้จากการใช้ รับรายละเอียดใบรับรองจาก Keystore หรือ Truststore API
ข้อมูลอ้างอิง
- ใบรับรองสายความน่าเชื่อถือ
- คำสั่ง OpenSSL