คุณกำลังดูเอกสารประกอบของ Apigee Edge
ไปที่เอกสารประกอบของ Apigee X ข้อมูล
ลักษณะปัญหา
แอปพลิเคชันไคลเอ็นต์จะได้รับการตอบกลับ HTTP 400 Bad Request
พร้อมข้อความ The plain HTTP request was sent to HTTPS port
ข้อความแสดงข้อผิดพลาด
แอปพลิเคชันไคลเอ็นต์จะได้รับโค้ดตอบกลับต่อไปนี้
HTTP/1.1 400 Bad Request
ตามด้วยหน้าข้อผิดพลาด HTML ต่อไปนี้
<html> <head><title>400 The plain HTTP request was sent to HTTPS port</title></head> <body> <center><h1>400 Bad Request</h1></center> <center>The plain HTTP request was sent to HTTPS port</center> </body> </html>
สาเหตุที่เป็นไปได้
สาเหตุ | คำอธิบาย | วิธีการแก้ปัญหาที่ใช้กับ |
---|---|---|
คำขอ HTTP ที่ส่งไปยังโฮสต์เสมือนที่กำหนดค่า TLS | ไคลเอ็นต์ส่งคำขอ HTTP ไปยังโฮสต์เสมือนที่กำหนดค่า TLS | ผู้ใช้ Edge Public และ Private Cloud |
คำขอ HTTP ไปยังปลายทางเป้าหมายที่กำหนดค่า TLS | คำขอ HTTP ที่ส่งไปยังเซิร์ฟเวอร์แบ็กเอนด์ที่เปิดใช้ TLS ในปลายทางเป้าหมาย | ผู้ใช้ Edge Public และ Private Cloud |
การกำหนดค่าเซิร์ฟเวอร์เป้าหมายไม่ถูกต้อง | เซิร์ฟเวอร์เป้าหมายได้รับการกำหนดค่าด้วยพอร์ตที่ปลอดภัย 443 แต่ไม่ได้เปิดใช้ SSL |
ผู้ใช้ Edge Public และ Private Cloud |
สาเหตุ: คำขอ HTTP ที่ส่งไปยังโฮสต์เสมือนที่กำหนดค่า TLS
ข้อผิดพลาดนี้เกิดขึ้นเมื่อไคลเอ็นต์พยายามเชื่อมต่อกับ API บน Apigee และมีการกำหนดค่าโฮสต์เสมือนดังกล่าวให้ใช้ SSL และรับคำขอ HTTP แทน
การวินิจฉัย
เนื่องจากปัญหานี้เกิดขึ้นในปลายทาง Northbound และคำขอ API ล้มเหลวในการโต้ตอบกับแอปพลิเคชันไคลเอ็นต์กับเราเตอร์ ข้อความแสดงข้อผิดพลาดเหล่านี้จะไม่ได้รับการบันทึกไว้ในบันทึกการเข้าถึงของเราเตอร์ NGINX ดังนั้น จะไม่มีการบันทึกคำขอเหล่านี้ในเครื่องมือต่างๆ เช่น การตรวจสอบ API และเครื่องมือติดตาม
-
ยืนยันคำขอ API และดูว่าคุณกำลังส่งคำขอ HTTP สำหรับชื่อแทนโฮสต์ที่กำหนดค่าให้ยอมรับคำขอบนพอร์ตที่ปลอดภัย
443
เท่านั้นหรือไม่ หากเป็นเช่นนั้น แสดงว่านั่นเป็นสาเหตุของปัญหาตัวอย่างคำขอ API ที่ไม่ถูกต้อง:
curl http://org-test.apigee.net:443/400-demo
<html> <head><title>400 The plain HTTP request was sent to HTTPS port</title></head> <body> <center><h1>400 Bad Request</h1></center> <center>The plain HTTP request was sent to HTTPS port</center> <hr><center>server</center> </body> </html>
- ในคำขอตัวอย่างข้างต้น จะมีการส่งคำขอ HTTP ไปยังชื่อแทนโฮสต์
myorg-test.apigee.net
บนพอร์ตที่ปลอดภัย443
ซึ่งเป็นสาเหตุของข้อผิดพลาด400 Bad Request
ความละเอียด
คุณต้องยืนยันว่าไคลเอ็นต์ใช้ HTTP แทน HTTP หรือไม่ และส่งคำขอที่ถูกต้องดังที่แสดงด้านล่าง
ตัวอย่างคําขอ API
curl https://org-test.apigee.net:443/400-demo
หรือ
curl https://org-test.apigee.net/400-demo
< HTTP/1.1 200 OK < Date: Thu, 25 Feb 2021 13:01:43 GMT < Content-Type: text/xml;charset=UTF-8 < Content-Length: 403 < Connection: keep-alive < Server: gunicorn/19.9.0 < Access-Control-Allow-Origin: * < Access-Control-Allow-Credentials: true
สาเหตุ: มีการส่งคำขอ HTTP ไปยังปลายทางเป้าหมายที่กำหนดค่า TLS
ข้อผิดพลาดนี้เกิดขึ้นหากคุณกำหนดค่าคำขอ HTTP ไปยังเซิร์ฟเวอร์แบ็กเอนด์ที่เปิดใช้ TLS อย่างไม่ถูกต้องในปลายทางเป้าหมายของพร็อกซี API
การวินิจฉัย
ใช้ขั้นตอนต่อไปนี้เพื่อวิเคราะห์ข้อผิดพลาดโดยใช้เครื่องมือติดตาม
- เปิดใช้การติดตามใน UI ของ Apigee สำหรับพร็อกซี API ที่ได้รับผลกระทบ
- ส่งคำขอไปยังพร็อกซี API
- เลือกคำขอ API รายการหนึ่งที่ล้มเหลวโดยมีโค้ดตอบกลับ
400
- ไปยังขั้นตอนต่างๆ และดูว่าความล้มเหลวเกิดขึ้นที่ใด
-
โดยทั่วไปคุณจะเห็นการตอบกลับข้อผิดพลาด
400
ที่มาจากเซิร์ฟเวอร์แบ็กเอนด์ หมายความว่าคุณจะเห็นการตอบกลับข้อผิดพลาด400
ในส่วนการตอบกลับที่ได้รับจากเซิร์ฟเวอร์เป้าหมาย ดังที่แสดงด้านล่าง -
กำหนดปลายทางเป้าหมายที่ส่งคำขอโดยคลิกไอคอน AX (บันทึกข้อมูล Analytics) ในการติดตาม
- ให้สังเกต target.url ซึ่งมีโปรโตคอล ชื่อแทนโฮสต์ของเซิร์ฟเวอร์แบ็กเอนด์ และบางครั้งอาจเป็นหมายเลขพอร์ต พอร์ตที่ใช้สำหรับ URL เป้าหมายคือ
443
แต่โปรโตคอลคือ HTTP - ตรวจสอบคำจำกัดความของปลายทางเป้าหมายเพื่อทำความเข้าใจการกำหนดค่า
-
ยืนยันว่าโฮสต์เซิร์ฟเวอร์แบ็กเอนด์มีความปลอดภัยและรับข้อมูลผ่านพอร์ตที่ปลอดภัย เช่น
443
หากคุณใช้โปรโตคอลเป็นhttp
ในองค์ประกอบ<URL>
สาเหตุของปัญหานี้ตัวอย่างการกำหนดค่าปลายทางเป้าหมาย
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <TargetEndpoint name="default"> <Description/> <FaultRules/> <PreFlow name="PreFlow"> <Request/> <Response/> </PreFlow> <PostFlow name="PostFlow"> <Request/> <Response/> </PostFlow> <Flows/> <HTTPTargetConnection> <Properties/> <URL>http://somehost.org:443/get</URL> </HTTPTargetConnection> </TargetEndpoint>
ตัวอย่างข้างต้นแสดงให้เห็นว่าคุณกำลังใช้โปรโตคอล HTTP แต่พอร์ตที่ใช้คือพอร์ตที่ปลอดภัย
443
ซึ่งจะทําให้เซิร์ฟเวอร์แบ็กเอนด์ตอบกลับด้วย400 Bad Request
และข้อความแสดงข้อผิดพลาดThe plain HTTP request was sent to HTTPS port
ความละเอียด
-
หากเซิร์ฟเวอร์แบ็กเอนด์มีความปลอดภัย/เปิดใช้ TLS ให้ตรวจสอบว่าคุณใช้โปรโตคอลเป็น
https
ในองค์ประกอบ<URL>
ของปลายทางเป้าหมายดังที่แสดงในตัวอย่างต่อไปนี้ตัวอย่างการกำหนดค่าปลายทางเป้าหมาย
<HTTPTargetConnection> <Properties/> <URL>https://somehost.org:443/get</URL> </HTTPTargetConnection>
-
หากเซิร์ฟเวอร์แบ็กเอนด์ไม่ปลอดภัย ให้ทำดังนี้
- อย่าระบุหมายเลขพอร์ตที่ปลอดภัย เช่น
443
- คุณไม่ต้องพูดถึงหมายเลขพอร์ตเลย หากเซิร์ฟเวอร์แบ็กเอนด์รับคำสั่งผ่านพอร์ตมาตรฐานที่ไม่ปลอดภัย
- แจ้งหมายเลขพอร์ตหากคุณใช้พอร์ตอื่นๆ ที่ไม่ปลอดภัย เช่น
9080
ตัวอย่างการกำหนดค่าปลายทางเป้าหมาย
<HTTPTargetConnection> <Properties/> <URL>http://somehost.org/get</URL> </HTTPTargetConnection> or <HTTPTargetConnection> <Properties/> <URL>http://somehost.org:9080/get</URL> </HTTPTargetConnection>
- อย่าระบุหมายเลขพอร์ตที่ปลอดภัย เช่น
สาเหตุ: การกำหนดค่าเซิร์ฟเวอร์เป้าหมายไม่ถูกต้อง
หากมีการกำหนดค่าเซิร์ฟเวอร์เป้าหมายด้วยพอร์ตที่ปลอดภัย เช่น 443
โดยไม่เปิดใช้ SSL จะทำให้ตัวประมวลผลข้อความของ Apigee Edge ส่งคำขอ HTTP ไปยังเซิร์ฟเวอร์เป้าหมายที่ปลอดภัยหรือกำหนดค่า TLS ซึ่งทำให้เกิดปัญหานี้
การวินิจฉัย
ใช้ขั้นตอนต่อไปนี้เพื่อวิเคราะห์ข้อผิดพลาดโดยใช้เครื่องมือติดตาม
- เปิดใช้การติดตามใน UI ของ Apigee สำหรับพร็อกซี API ที่ได้รับผลกระทบ
- ส่งคำขอไปยังพร็อกซี API
- เลือกคำขอ API รายการหนึ่งที่ล้มเหลวโดยมีโค้ดตอบกลับ
400
- ไปยังขั้นตอนต่างๆ และดูว่าความล้มเหลวเกิดขึ้นที่ใด
-
โดยทั่วไปคุณจะเห็นการตอบกลับข้อผิดพลาด
400
ที่มาจากเซิร์ฟเวอร์แบ็กเอนด์ คุณจะเห็นการตอบกลับสำหรับข้อผิดพลาด400
ในส่วนการตอบกลับที่ได้รับจากเซิร์ฟเวอร์เป้าหมายดังที่แสดงด้านล่าง -
กำหนดปลายทางเป้าหมายที่ส่งคำขอโดยคลิกไอคอน AX (บันทึกข้อมูล Analytics) ในการติดตาม
-
จดบันทึก target.name ซึ่งแสดงชื่อปลายทางเป้าหมาย
ในไฟล์การติดตามตัวอย่างข้างต้น target.name คือค่าเริ่มต้น ซึ่งเป็นการระบุว่าปลายทางเป้าหมายที่ใช้สำหรับคำขอนี้เป็นค่าเริ่มต้น
-
ตรวจสอบคำจำกัดความของปลายทางเป้าหมายเพื่อทำความเข้าใจการกำหนดค่า
ตัวอย่างการกำหนดค่าปลายทางเป้าหมาย
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <TargetEndpoint name="default"> <Description/> <FaultRules/> <PreFlow name="PreFlow"> <Request/> <Response/> </PreFlow> <PostFlow name="PostFlow"> <Request/> <Response/> </PostFlow> <Flows/> <HTTPTargetConnection> <Properties/> <LoadBalancer> <Server name="faulty-target"/> </LoadBalancer> </HTTPTargetConnection> </TargetEndpoint>
ตัวอย่างการกำหนดค่าปลายทางปลายทางตัวอย่างข้างต้นแสดงให้เห็นว่าคุณกำลังใช้เซิร์ฟเวอร์เป้าหมายที่ชื่อว่า
faulty-target
-
เมื่อมีชื่อเซิร์ฟเวอร์เป้าหมายแล้ว คุณจะใช้วิธีการใดวิธีการหนึ่งต่อไปนี้เพื่อตรวจสอบการกำหนดค่าเซิร์ฟเวอร์เป้าหมายได้
- UI ของ Edge
- Management API
UI ของ Edge
- ไปที่ Apigee Edge > ผู้ดูแลระบบ > สภาพแวดล้อม > เซิร์ฟเวอร์เป้าหมาย
- เลือกเซิร์ฟเวอร์เป้าหมายที่ระบุจากพร็อกซี API แล้วคลิก แก้ไข
- ตรวจสอบพอร์ตที่ระบุสำหรับเซิร์ฟเวอร์เป้าหมายและข้อมูล SSL
-
หากมีการกำหนดค่าเซิร์ฟเวอร์เป้าหมายด้วยพอร์ตที่ปลอดภัย (เช่น
443
) แต่ไม่ได้เปิดใช้ SSL สาเหตุของปัญหานี้อย่างที่เห็นในภาพหน้าจอด้านบน พอร์ตที่ใช้คือ
443
แต่ไม่ได้เปิดใช้ SSL สำหรับพอร์ตนั้นในการกำหนดค่าเซิร์ฟเวอร์เป้าหมาย ซึ่งจะทำให้ผู้ประมวลผลข้อความของ Apigee Edge ส่งคำขอ HTTP ไปยังพอร์ตที่ปลอดภัย443
ดังนั้น คุณจะได้รับข้อผิดพลาด400 Bad Request
พร้อมข้อความThe plain HTTP request was sent to HTTPS port
Management API
-
เรียกใช้ API รับเซิร์ฟเวอร์เป้าหมายเพื่อดูรายละเอียดเกี่ยวกับการกำหนดค่าเซิร์ฟเวอร์เป้าหมายที่เฉพาะเจาะจงตามที่แสดงด้านล่าง
ผู้ใช้ Public Cloud
curl -v 'https://api.enterprise.apigee.com/v1/organizations/ORG_NAME/environments/ENV_NAME>/targetservers/TARGET_SERVER_NAME' \ -H "Content-Type:application/xml" \ -H "Authorization:Bearer $TOKEN"
ผู้ใช้ Private Cloud
curl -v 'http://MANAGEMENT_IP:8080/v1/organizations/ORG_NAME/environments/ENV_NAME/targetservers/TARGET_SERVER_NAME' \ -H "Content-Type:application/xml" \ -H "Authorization:Bearer $TOKEN"
- ตรวจสอบพอร์ตที่ระบุสำหรับเซิร์ฟเวอร์เป้าหมายและข้อมูล SSL
-
หากมีการกำหนดค่าเซิร์ฟเวอร์เป้าหมายด้วยพอร์ตที่ปลอดภัย (เช่น
443
) แต่ไม่ได้กำหนดหรือไม่ได้เปิดใช้ส่วนSSLInfo
ไว้ แสดงว่าเป็นสาเหตุของปัญหานี้ตัวอย่างการกำหนดค่าเซิร์ฟเวอร์เป้าหมาย
{ "host" : "somehost.org", "isEnabled" : true, "name" : "faulty-target", "port" : 443 }
ในเอาต์พุตตัวอย่างด้านบน เราจะเห็นว่าพอร์ตที่ใช้สำหรับการเชื่อมต่อเป้าหมายคือ
443
แต่ไม่มีบล็อกการกำหนดค่าSSLInfo
ซึ่งจะทำให้ผู้ประมวลผลข้อความของ Apigee Edge ส่งคำขอ HTTP ไปยังพอร์ตที่ปลอดภัย
443
ดังนั้น คุณจะได้รับข้อผิดพลาด400 Bad Request
พร้อมข้อความThe plain HTTP request was sent to HTTPS port
ความละเอียด
หากเซิร์ฟเวอร์เป้าหมายมีความปลอดภัยหรือกำหนดค่า TLS คุณจะต้องเปิดใช้ SSL สำหรับเซิร์ฟเวอร์เป้าหมายที่เจาะจง
ซึ่งทำได้โดยใช้ตัวเลือกใดตัวเลือกหนึ่งต่อไปนี้
- UI ของ Edge
- Management API
UI ของ Edge
- ไปยังเซิร์ฟเวอร์เป้าหมายใน UI ของ Edge > ผู้ดูแลระบบ > สภาพแวดล้อม > เซิร์ฟเวอร์เป้าหมาย
- เลือกเซิร์ฟเวอร์เป้าหมายที่ต้องการ แล้วคลิก แก้ไข
- หากเซิร์ฟเวอร์เป้าหมายมีความปลอดภัยและใช้พอร์ต เช่น
443
ให้เปิดใช้ SSL โดยเลือกช่องทำเครื่องหมายข้างตัวเลือก SSL - กำหนดค่า Truststore, Ciphers และโปรโตคอล (เฉพาะในกรณีที่จำเป็น)
Management API
ใช้ Management API เพื่อกำหนดค่าเซิร์ฟเวอร์เป้าหมายตามที่อธิบายไว้ในเอกสารประกอบ อัปเดตการกำหนดค่าเซิร์ฟเวอร์เป้าหมาย
ต้องรวบรวมข้อมูลการวินิจฉัย
หากปัญหายังคงอยู่แม้ว่าจะทำตามวิธีการข้างต้นแล้ว ให้รวบรวมข้อมูลการวินิจฉัยต่อไปนี้แล้วติดต่อทีมสนับสนุนของ Apigee Edge
- หากคุณเป็นผู้ใช้ ระบบคลาวด์สาธารณะ โปรดระบุข้อมูลต่อไปนี้
- ชื่อองค์กร
- ชื่อสภาพแวดล้อม
- ชื่อพร็อกซี API
- ใช้คำสั่ง curl เพื่อจำลองข้อผิดพลาด
- เอาต์พุตของเครื่องมือติดตาม (หากคุณสามารถบันทึกสำหรับคำขอที่ล้มเหลว)
- หากคุณเป็นผู้ใช้ Private Cloud โปรดระบุข้อมูลต่อไปนี้
- สังเกตข้อความแสดงข้อผิดพลาดเสร็จสมบูรณ์
- ชื่อสภาพแวดล้อม
- ชุดพร็อกซี API
- คำจำกัดความเซิร์ฟเวอร์เป้าหมาย (หากคุณใช้เซิร์ฟเวอร์เป้าหมายในปลายทาง)
- เอาต์พุตของเครื่องมือติดตาม (หากคุณสามารถบันทึกสำหรับคำขอที่ล้มเหลว)