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

คุณกำลังดูเอกสารประกอบของ Apigee Edge
ไปที่ เอกสารประกอบของ Apigee X
info

ลักษณะปัญหา

แอปพลิเคชันไคลเอ็นต์ได้รับการตอบกลับ 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 Monitoring และ เครื่องมือ Trace

  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 แทน HTTPS หรือไม่ และส่งคำขอที่ถูกต้องดังที่ แสดงด้านล่าง:

ตัวอย่างคำขอ 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 ไม่ถูกต้อง

การวินิจฉัย

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

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

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

  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 จะทำให้ Message Processor ของ Apigee Edge ส่งคำขอ HTTP ไปยังเซิร์ฟเวอร์เป้าหมายที่ปลอดภัยหรือกำหนดค่า TLS ซึ่งนำไปสู่ปัญหานี้

การวินิจฉัย

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

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

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

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

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

  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. เรียกใช้ Get target server 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

    ซึ่งทำให้ Message Processor ของ 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 และ Protocols (เฉพาะในกรณีที่จำเป็น)

Management API

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

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

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

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