400 คําขอไม่ถูกต้อง - คําขอ HTTP ธรรมดาที่ส่งไปยังพอร์ต HTTPS

คุณกำลังดูเอกสารประกอบของ 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 และเครื่องมือติดตาม

  1. ยืนยันคำขอ 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>
    
  2. ในคำขอตัวอย่างข้างต้น จะมีการส่งคำขอ 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

การวินิจฉัย

ใช้ขั้นตอนต่อไปนี้เพื่อวิเคราะห์ข้อผิดพลาดโดยใช้เครื่องมือติดตาม

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

  6. กำหนดปลายทางเป้าหมายที่ส่งคำขอโดยคลิกไอคอน AX (บันทึกข้อมูล Analytics) ในการติดตาม

  7. ให้สังเกต target.url ซึ่งมีโปรโตคอล ชื่อแทนโฮสต์ของเซิร์ฟเวอร์แบ็กเอนด์ และบางครั้งอาจเป็นหมายเลขพอร์ต พอร์ตที่ใช้สำหรับ URL เป้าหมายคือ 443 แต่โปรโตคอลคือ HTTP
  8. ตรวจสอบคำจำกัดความของปลายทางเป้าหมายเพื่อทำความเข้าใจการกำหนดค่า
  9. ยืนยันว่าโฮสต์เซิร์ฟเวอร์แบ็กเอนด์มีความปลอดภัยและรับข้อมูลผ่านพอร์ตที่ปลอดภัย เช่น 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

ความละเอียด

  1. หากเซิร์ฟเวอร์แบ็กเอนด์มีความปลอดภัย/เปิดใช้ TLS ให้ตรวจสอบว่าคุณใช้โปรโตคอลเป็น https ในองค์ประกอบ <URL> ของปลายทางเป้าหมายดังที่แสดงในตัวอย่างต่อไปนี้

    ตัวอย่างการกำหนดค่าปลายทางเป้าหมาย

    <HTTPTargetConnection>
        <Properties/>
        <URL>https://somehost.org:443/get</URL>
    </HTTPTargetConnection>
    
  2. หากเซิร์ฟเวอร์แบ็กเอนด์ไม่ปลอดภัย ให้ทำดังนี้

    • อย่าระบุหมายเลขพอร์ตที่ปลอดภัย เช่น 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 ซึ่งทำให้เกิดปัญหานี้

การวินิจฉัย

ใช้ขั้นตอนต่อไปนี้เพื่อวิเคราะห์ข้อผิดพลาดโดยใช้เครื่องมือติดตาม

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

  6. กำหนดปลายทางเป้าหมายที่ส่งคำขอโดยคลิกไอคอน AX (บันทึกข้อมูล Analytics) ในการติดตาม

  7. จดบันทึก target.name ซึ่งแสดงชื่อปลายทางเป้าหมาย

    ในไฟล์การติดตามตัวอย่างข้างต้น target.name คือค่าเริ่มต้น ซึ่งเป็นการระบุว่าปลายทางเป้าหมายที่ใช้สำหรับคำขอนี้เป็นค่าเริ่มต้น

  8. ตรวจสอบคำจำกัดความของปลายทางเป้าหมายเพื่อทำความเข้าใจการกำหนดค่า

    ตัวอย่างการกำหนดค่าปลายทางเป้าหมาย

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

  9. เมื่อมีชื่อเซิร์ฟเวอร์เป้าหมายแล้ว คุณจะใช้วิธีการใดวิธีการหนึ่งต่อไปนี้เพื่อตรวจสอบการกำหนดค่าเซิร์ฟเวอร์เป้าหมายได้

    • UI ของ Edge
    • Management API

UI ของ Edge

  1. ไปที่ Apigee Edge > ผู้ดูแลระบบ > สภาพแวดล้อม > เซิร์ฟเวอร์เป้าหมาย
  2. เลือกเซิร์ฟเวอร์เป้าหมายที่ระบุจากพร็อกซี API แล้วคลิก แก้ไข
  3. ตรวจสอบพอร์ตที่ระบุสำหรับเซิร์ฟเวอร์เป้าหมายและข้อมูล SSL
  4. หากมีการกำหนดค่าเซิร์ฟเวอร์เป้าหมายด้วยพอร์ตที่ปลอดภัย (เช่น 443) แต่ไม่ได้เปิดใช้ SSL สาเหตุของปัญหานี้

    อย่างที่เห็นในภาพหน้าจอด้านบน พอร์ตที่ใช้คือ 443 แต่ไม่ได้เปิดใช้ SSL สำหรับพอร์ตนั้นในการกำหนดค่าเซิร์ฟเวอร์เป้าหมาย ซึ่งจะทำให้ผู้ประมวลผลข้อความของ Apigee Edge ส่งคำขอ HTTP ไปยังพอร์ตที่ปลอดภัย 443 ดังนั้น คุณจะได้รับข้อผิดพลาด 400 Bad Request พร้อมข้อความ The plain HTTP request was sent to HTTPS port

Management API

  1. เรียกใช้ 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"
    
  2. ตรวจสอบพอร์ตที่ระบุสำหรับเซิร์ฟเวอร์เป้าหมายและข้อมูล SSL
  3. หากมีการกำหนดค่าเซิร์ฟเวอร์เป้าหมายด้วยพอร์ตที่ปลอดภัย (เช่น 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

  1. ไปยังเซิร์ฟเวอร์เป้าหมายใน UI ของ Edge > ผู้ดูแลระบบ > สภาพแวดล้อม > เซิร์ฟเวอร์เป้าหมาย
  2. เลือกเซิร์ฟเวอร์เป้าหมายที่ต้องการ แล้วคลิก แก้ไข
  3. หากเซิร์ฟเวอร์เป้าหมายมีความปลอดภัยและใช้พอร์ต เช่น 443 ให้เปิดใช้ SSL โดยเลือกช่องทำเครื่องหมายข้างตัวเลือก SSL
  4. กำหนดค่า Truststore, Ciphers และโปรโตคอล (เฉพาะในกรณีที่จำเป็น)

Management API

ใช้ Management API เพื่อกำหนดค่าเซิร์ฟเวอร์เป้าหมายตามที่อธิบายไว้ในเอกสารประกอบ อัปเดตการกำหนดค่าเซิร์ฟเวอร์เป้าหมาย

ต้องรวบรวมข้อมูลการวินิจฉัย

หากปัญหายังคงอยู่แม้ว่าจะทำตามวิธีการข้างต้นแล้ว ให้รวบรวมข้อมูลการวินิจฉัยต่อไปนี้แล้วติดต่อทีมสนับสนุนของ Apigee Edge

  1. หากคุณเป็นผู้ใช้ ระบบคลาวด์สาธารณะ โปรดระบุข้อมูลต่อไปนี้
    • ชื่อองค์กร
    • ชื่อสภาพแวดล้อม
    • ชื่อพร็อกซี API
    • ใช้คำสั่ง curl เพื่อจำลองข้อผิดพลาด
    • เอาต์พุตของเครื่องมือติดตาม (หากคุณสามารถบันทึกสำหรับคำขอที่ล้มเหลว)
  2. หากคุณเป็นผู้ใช้ Private Cloud โปรดระบุข้อมูลต่อไปนี้
    • สังเกตข้อความแสดงข้อผิดพลาดเสร็จสมบูรณ์
    • ชื่อสภาพแวดล้อม
    • ชุดพร็อกซี API
    • คำจำกัดความเซิร์ฟเวอร์เป้าหมาย (หากคุณใช้เซิร์ฟเวอร์เป้าหมายในปลายทาง)
    • เอาต์พุตของเครื่องมือติดตาม (หากคุณสามารถบันทึกสำหรับคำขอที่ล้มเหลว)