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 กระบวนการแฮนด์เชคระหว่าง 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
    • ไม่มีเชนใบรับรองทั้งหมดของเซิร์ฟเวอร์แบ็กเอนด์
  • หากเชนใบรับรองที่เซิร์ฟเวอร์แบ็กเอนด์แสดง ให้ทําดังนี้

สาเหตุที่เป็นไปได้สำหรับปัญหานี้มีดังนี้

สาเหตุ คำอธิบาย วิธีการแก้ปัญหาสำหรับ
ใบรับรองหรือชุดใบรับรองใน 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

  1. ลงชื่อเข้าใช้ Apigee Edge UI ในฐานะผู้ใช้ที่มี บทบาทที่เหมาะสม
  2. เปลี่ยนเป็นองค์กรที่ต้องการตรวจสอบปัญหา

  3. ไปที่ วิเคราะห์ > การตรวจสอบ API > หน้าตรวจสอบ
  4. เลือกกรอบเวลาที่คุณพบข้อผิดพลาด
  5. พล็อตรหัสข้อผิดพลาดเทียบกับเวลา

  6. เลือกเซลล์ที่มีรหัสข้อผิดพลาด messaging.adaptors.http.flow.SslHandshakeFailedตามที่แสดง ด้านล่าง

    ( ดูรูปภาพขนาดใหญ่ขึ้น)

  7. ข้อมูลเกี่ยวกับรหัสข้อผิดพลาด messaging.adaptors.http.flow.SslHandshakeFailed จะแสดงเป็น แสดงอยู่ด้านล่าง

    ( ดูรูปภาพขนาดใหญ่ขึ้น)

  8. คลิกดูบันทึก และขยายแถวสำหรับคำขอที่ล้มเหลว

    ( ดูรูปภาพขนาดใหญ่ขึ้น)

  9. จากหน้าต่าง Logs ให้จดรายละเอียดต่อไปนี้
    • รหัสข้อความคำขอ
    • รหัสสถานะ: 503
    • แหล่งที่มาของข้อผิดพลาด: target
    • รหัสข้อผิดพลาด: messaging.adaptors.http.flow.SslHandshakeFailed

Trace

ขั้นตอนที่ 2: การใช้เครื่องมือติดตาม

วิธีวินิจฉัยข้อผิดพลาดโดยใช้เครื่องมือติดตาม

  1. เปิดใช้เซสชันการติดตาม และ
    • รอข้อผิดพลาด 503 Service Unavailable ที่มีรหัสข้อผิดพลาด messaging.adaptors.http.flow.SslHandshakeFailedจะเกิดขึ้น หรือ
    • หากคุณทำให้เกิดปัญหาซ้ำได้ ให้เรียกใช้ API เพื่อจำลองปัญหา 503 Service Unavailable
  2. ตรวจสอบว่าเปิดใช้แสดง FlowInfo ทั้งหมด แล้ว

  3. เลือกคำขอที่ไม่สำเร็จรายการหนึ่งและตรวจสอบการติดตาม
  4. ดำเนินการตามขั้นตอนต่างๆ ของการติดตามและค้นหาตำแหน่งที่เกิดข้อผิดพลาด
  5. โดยปกติแล้ว คุณจะพบข้อผิดพลาดนี้หลังจากช่วงเริ่มต้นขั้นตอนการขอเป้าหมายแล้ว ดังที่แสดงด้านล่าง

    ( ดูรูปภาพขนาดใหญ่ขึ้น)

  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 ล้มเหลว เนื่องจาก Message Processor ของ Apigee Edge ไม่สามารถตรวจสอบความถูกต้องของเซิร์ฟเวอร์แบ็กเอนด์ ใบรับรอง
  7. ไปที่ระยะ AX (Analytics Data Recorded) ในการติดตามและคลิก
  8. เลื่อนลงไปที่ส่วนส่วนหัวข้อผิดพลาดเกี่ยวกับรายละเอียดเฟส และระบุ ของ X-Apigee-fault-code และ X-Apigee-fault-source และ X-Apigee-Message-ID ดังที่แสดงด้านล่าง

    ( ดูรูปภาพขนาดใหญ่ขึ้น)

  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-code

    ส่วนหัว ค่า
    X-Apigee-fault-code messaging.adaptors.http.flow.SslHandshakeFailed
    X-Apigee-fault-source target

บันทึกของผู้ประมวลผลข้อความ

ขั้นตอนที่ 4: การใช้บันทึกโปรแกรมประมวลผลข้อความ

  1. กำหนดรหัสข้อความของหนึ่งในคำขอที่ล้มเหลวโดยใช้การตรวจสอบ API, เครื่องมือการติดตาม หรือบันทึกการเข้าถึง 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 ตรวจสอบใบรับรองของเซิร์ฟเวอร์แบ็กเอนด์ไม่ได้

สาเหตุ: ใบรับรองหรือชุดใบรับรองใน Truststore ของ Message Processor ไม่ถูกต้อง/ไม่สมบูรณ์

การวินิจฉัย

  1. กำหนดรหัสข้อผิดพลาด แหล่งที่มาของข้อผิดพลาดสำหรับข้อผิดพลาดที่พบโดยใช้ API การตรวจสอบ เครื่องมือการติดตาม หรือบันทึกการเข้าถึง NGINX ตามที่อธิบายไว้ในหัวข้อทั่วไป ขั้นตอนการวินิจฉัย
  2. หาก Fault Code คือ 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 ล้มเหลว เนื่องจาก Message Processor ของ Apigee Edge ยืนยันเซิร์ฟเวอร์แบ็กเอนด์ไม่ได้ ใบรับรอง

คุณแก้ไขข้อบกพร่องปัญหานี้ได้ 2 ระยะ ดังนี้

  1. ระยะที่ 1: กำหนดเชนใบรับรองของเซิร์ฟเวอร์แบ็กเอนด์
  2. ระยะที่ 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

  1. หากคุณเป็นผู้ใช้ระบบคลาวด์สาธารณะ ให้บันทึกแพ็กเก็ต TCP/IP ใน เซิร์ฟเวอร์แบ็กเอนด์
  2. หากคุณเป็นผู้ใช้ Private Cloud คุณจะสามารถบันทึก TCP/IP แพ็กเก็ตในเซิร์ฟเวอร์แบ็กเอนด์หรือ Message Processor ขอแนะนำให้ถ่ายภาพบน เซิร์ฟเวอร์แบ็กเอนด์เมื่อมีการถอดรหัสแพ็กเก็ตในเซิร์ฟเวอร์แบ็กเอนด์
  3. ใช้รายการต่อไปนี้ คำสั่ง tcpdump เพื่อบันทึกแพ็กเก็ต TCP/IP

    tcpdump -i any -s 0 host IP_ADDRESS -w FILE_NAME
    
  4. วิเคราะห์แพ็กเก็ต 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

ระยะที่ 2

ระยะที่ 2: เปรียบเทียบใบรับรองของเซิร์ฟเวอร์แบ็กเอนด์กับใบรับรองที่จัดเก็บไว้ใน Truststore ของเครื่องมือประมวลผลข้อความ

  1. กำหนดเชนใบรับรองของเซิร์ฟเวอร์แบ็กเอนด์
  2. ระบุใบรับรองที่จัดเก็บไว้ใน Truststore ของตัวประมวลผลข้อความโดยใช้ ขั้นตอนต่อไปนี้
    1. รับชื่อการอ้างอิง 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>
      
    2. ในตัวอย่างด้านบน ชื่ออ้างอิง TrustStore คือ myCompanyTruststoreRef
    3. ใน Edge UI ให้เลือกสภาพแวดล้อม > ข้อมูลอ้างอิง จดชื่อใน คอลัมน์ข้อมูลอ้างอิงสำหรับข้อมูลอ้างอิง Truststore ที่เฉพาะเจาะจง นี่คือ ชื่อ Truststore

      ( ดูรูปภาพขนาดใหญ่ขึ้น)

    4. ในตัวอย่างข้างต้น ชื่อ Truststore คือ

      myCompanyTruststoreRef: myCompanyTruststore

  3. รับใบรับรองที่จัดเก็บไว้ใน Truststore (ตามที่ระบุในขั้นตอนก่อนหน้า) ที่ใช้ API ต่อไปนี้

    1. รับใบรับรองทั้งหมดสำหรับคีย์สโตร์หรือ 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"
      ]
      

    2. รับรายละเอียดใบรับรองของใบรับรองที่ต้องการจาก 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",
      
  4. ยืนยันว่าใบรับรองเซิร์ฟเวอร์จริงที่ได้จากขั้นตอนที่ 1 และใบรับรอง จัดเก็บไว้ใน Truststore ที่ได้จากการจับคู่ในขั้นตอนที่ 3 หากไม่ตรงกัน นั่นคือ ของปัญหานี้

    จากตัวอย่างที่แสดงด้านบน เราจะมาดูใบรับรองทีละใบ

    1. ใบรับรอง 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 ตรงกับใบรับรองของแบ็กเอนด์ เซิร์ฟเวอร์

    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
      

      จาก 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 ตรงกับใบรับรองของ เซิร์ฟเวอร์แบ็กเอนด์

    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
      

      ไม่มีใบรับรองรูทใน Message Processor Truststore

    4. เนื่องจากไม่มีใบรับรองรูทใน 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ไปยังลูกค้า แอปพลิเคชัน

ความละเอียด

  1. ตรวจสอบว่าคุณมีชุดใบรับรองที่เหมาะสมและครบถ้วนของเซิร์ฟเวอร์แบ็กเอนด์
  2. หากคุณเป็นผู้ใช้ระบบคลาวด์สาธารณะ โปรดทำตามวิธีการใน อัปเดตใบรับรอง TLS สำหรับระบบคลาวด์เพื่ออัปเดตใบรับรองเป็นของ Apigee Edge Truststore ของตัวประมวลผลข้อความ
  3. หากคุณเป็นผู้ใช้ 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

การวินิจฉัย

  1. ตรวจสอบปลายทางเป้าหมายที่เฉพาะเจาะจงในพร็อกซี 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

  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 และ FQDN ได้รับ ขั้นตอนที่ 2 ไม่ตรงกัน นั่นเป็นสาเหตุของข้อผิดพลาด
  4. ในตัวอย่างที่พูดถึงข้างต้น ชื่อโฮสต์ในปลายทางเป้าหมายคือ backend.company.com แต่ชื่อ FQDN ในใบรับรองของเซิร์ฟเวอร์แบ็กเอนด์ มีค่า backend.apigee.net คุณจะได้รับข้อผิดพลาดนี้เนื่องจากไม่ตรงกัน

ความละเอียด

คุณแก้ไขปัญหานี้ได้โดยใช้วิธีใดวิธีหนึ่งต่อไปนี้

FQDN ที่ถูกต้อง

อัปเดตคีย์สโตร์ของเซิร์ฟเวอร์แบ็กเอนด์ด้วย FQDN ที่ถูกต้อง รวมถึงใบรับรองที่ถูกต้องและสมบูรณ์ เชน:

  1. หากไม่มีใบรับรองของเซิร์ฟเวอร์แบ็กเอนด์ที่มี FQDN ที่ถูกต้อง จากนั้นจัดหาใบรับรองที่เหมาะสมจาก CA (ผู้ออกใบรับรอง) ที่เหมาะสม
  2. ตรวจสอบว่าคุณมี เชนใบรับรองของเซิร์ฟเวอร์แบ็กเอนด์ที่ถูกต้องและสมบูรณ์

  3. เมื่อคุณมีชุดใบรับรองที่ถูกต้องและสมบูรณ์ซึ่งมี FQDN ที่ถูกต้องของ เซิร์ฟเวอร์แบ็กเอนด์ในใบรับรอง Leaf หรือเอนทิตีที่เหมือนกับชื่อโฮสต์ ที่ระบุในปลายทางเป้าหมาย ให้อัปเดตคีย์สโตร์ของแบ็กเอนด์ด้วยฟังก์ชัน ชุดใบรับรองที่สมบูรณ์

เซิร์ฟเวอร์แบ็กเอนด์ที่ถูกต้อง

อัปเดตปลายทางเป้าหมายด้วยชื่อโฮสต์ของเซิร์ฟเวอร์แบ็กเอนด์ที่ถูกต้อง

  1. หากมีการระบุชื่อโฮสต์ไม่ถูกต้องในปลายทางเป้าหมาย ให้อัปเดต ปลายทางปลายทางให้มีชื่อโฮสต์ที่ถูกต้องซึ่งตรงกับ FQDN ในแบ็กเอนด์ ใบรับรองของเซิร์ฟเวอร์
  2. บันทึกการเปลี่ยนแปลงลงในพร็อกซี 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

  • หากคุณเป็นผู้ใช้ระบบคลาวด์สาธารณะ ให้ระบุข้อมูลต่อไปนี้
    • ชื่อองค์กร
    • ชื่อสภาพแวดล้อม
    • ชื่อพร็อกซี 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

ข้อมูลอ้างอิง