400 Bad request - HTTP HTTP thuần túy được gửi tới cổng HTTPS

Bạn đang xem tài liệu về Apigee Edge.
Truy cập vào tài liệu Apigee X.
thông tin

Dấu hiệu

Ứng dụng khách nhận được phản hồi HTTP 400 Bad Request kèm theo thông báo The plain HTTP request was sent to HTTPS port.

Thông báo lỗi

Ứng dụng khách sẽ nhận được mã phản hồi sau:

HTTP/1.1 400 Bad Request

Tiếp theo là trang lỗi HTML bên dưới:

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

Các nguyên nhân có thể

Nguyên nhân Mô tả Hướng dẫn khắc phục sự cố áp dụng cho
Yêu cầu HTTP đến máy chủ ảo được định cấu hình TLS Máy khách gửi yêu cầu HTTP đến máy chủ ảo được định cấu hình TLS Người dùng Edge Public Cloud và Private Cloud
Yêu cầu HTTP đến một điểm cuối đích được định cấu hình TLS Yêu cầu HTTP được gửi đến máy chủ phụ trợ có TLS trong điểm cuối mục tiêu. Người dùng Edge Public Cloud và Private Cloud
Cấu hình máy chủ đích không chính xác Máy chủ đích được định cấu hình bằng cổng bảo mật 443 nhưng SSL chưa được bật. Người dùng Edge Public Cloud và Private Cloud

Nguyên nhân: Yêu cầu HTTP đến một máy chủ ảo được định cấu hình TLS

Lỗi này xảy ra khi một ứng dụng đang cố gắng kết nối với một API trên Apigee và máy chủ ảo được đề cập được định cấu hình để sử dụng SSL và nhận được một yêu cầu HTTP.

Chẩn đoán

Vì vấn đề này xảy ra trên điểm cuối Northbound và các yêu cầu API không thành công tại điểm tương tác nhập giữa ứng dụng khách và Bộ định tuyến, nên các thông báo lỗi này không được ghi vào nhật ký truy cập bộ định tuyến NGINX. Do đó, những yêu cầu này sẽ không được ghi lại trong các công cụ như API Monitoring và Trace.

  1. Xác minh yêu cầu API của bạn và xem bạn có đang đưa ra yêu cầu HTTP cho một bí danh máy chủ lưu trữ được định cấu hình để chỉ chấp nhận các yêu cầu trên cổng bảo mật 443 hay không. Nếu có, thì đó là nguyên nhân gây ra vấn đề.

    Yêu cầu API mẫu không chính xác:

    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. Trong yêu cầu mẫu ở trên, lưu ý rằng yêu cầu HTTP được gửi đến bí danh máy chủ lưu trữ myorg-test.apigee.net trên cổng bảo mật 443. Đây là nguyên nhân gây ra lỗi 400 Bad Request.

Độ phân giải

Bạn cần xác minh xem máy khách có đang sử dụng HTTP thay vì HTTPs hay không và đưa ra yêu cầu chính xác như minh hoạ bên dưới:

Yêu cầu API mẫu:

curl https://org-test.apigee.net:443/400-demo

hoặc

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

Nguyên nhân: Yêu cầu HTTP đến một điểm cuối mục tiêu được định cấu hình TLS

Lỗi này xảy ra nếu bạn định cấu hình không chính xác các yêu cầu HTTP đến một máy chủ phụ trợ hỗ trợ TLS trong điểm cuối đích của một API Proxy.

Chẩn đoán

Hãy làm theo các bước sau để chẩn đoán lỗi bằng công cụ Theo dõi:

  1. Bật Trace (Theo dõi) trong giao diện người dùng Apigee cho API Proxy bị ảnh hưởng.
  2. Gửi yêu cầu đến API Proxy.
  3. Chọn một trong các yêu cầu API không thực hiện được có mã phản hồi 400.
  4. Chuyển qua các giai đoạn khác nhau và xác định nơi xảy ra lỗi.
  5. Thông thường, bạn sẽ thấy phản hồi lỗi 400 đến từ máy chủ phụ trợ. Tức là bạn sẽ thấy phản hồi lỗi 400 trong giai đoạn Đã nhận được phản hồi từ máy chủ đích như minh hoạ dưới đây:

  6. Xác định điểm cuối mục tiêu mà yêu cầu được thực hiện bằng cách nhấp vào biểu tượng AX (Dữ liệu Analytics được ghi lại) trong dấu vết.

  7. Lưu ý target.url, chứa giao thức, bí danh máy chủ phụ trợ và đôi khi là số cổng. Cổng được dùng cho URL mục tiêu là 443 nhưng giao thức là HTTP.
  8. Xem lại định nghĩa về điểm cuối mục tiêu để hiểu rõ cấu hình.
  9. Xác minh rằng máy chủ lưu trữ phụ trợ an toàn và đang nghe trên một cổng an toàn, chẳng hạn như 443. Nếu bạn đang sử dụng giao thức dưới dạng http trong phần tử <URL>, thì đó là nguyên nhân gây ra vấn đề này.

    Cấu hình điểm cuối mục tiêu mẫu:

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

    Ví dụ trên cho thấy bạn đang sử dụng giao thức HTTP, nhưng cổng được dùng là cổng bảo mật 443. Điều này khiến máy chủ phụ trợ phản hồi bằng 400 Bad Request và thông báo lỗi The plain HTTP request was sent to HTTPS port.

Độ phân giải

  1. Nếu máy chủ phụ trợ của bạn được bảo mật/hỗ trợ TLS, hãy đảm bảo rằng bạn sử dụng giao thức này dưới dạng https trong phần tử <URL> của điểm cuối đích như trong ví dụ sau:

    Cấu hình điểm cuối mục tiêu mẫu:

    <HTTPTargetConnection>
        <Properties/>
        <URL>https://somehost.org:443/get</URL>
    </HTTPTargetConnection>
  2. Nếu máy chủ phụ trợ của bạn không an toàn, thì:

    • Không đề cập đến số cổng bảo mật, chẳng hạn như 443.
    • Bạn không cần đề cập đến số cổng nếu máy chủ phụ trợ của bạn theo dõi trên một cổng không bảo mật tiêu chuẩn
    • Đề cập đến số cổng nếu bạn đang sử dụng bất kỳ cổng không an toàn nào khác, ví dụ:: 9080

    Cấu hình điểm cuối mục tiêu mẫu:

    <HTTPTargetConnection>
        <Properties/>
        <URL>http://somehost.org/get</URL>
    </HTTPTargetConnection>
    
    or
    
    <HTTPTargetConnection>
        <Properties/>
        <URL>http://somehost.org:9080/get</URL>
    </HTTPTargetConnection>

Nguyên nhân: Cấu hình máy chủ đích không chính xác

Nếu máy chủ đích được định cấu hình bằng một cổng bảo mật như 443 mà không bật SSL, thì Bộ xử lý thông báo của Apigee Edge sẽ gửi các yêu cầu HTTP đến một máy chủ đích được định cấu hình TLS hoặc bảo mật, dẫn đến vấn đề này.

Chẩn đoán

Hãy làm theo các bước sau để chẩn đoán lỗi bằng công cụ Theo dõi:

  1. Bật Trace (Theo dõi) trong giao diện người dùng Apigee cho API Proxy bị ảnh hưởng.
  2. Gửi yêu cầu đến API Proxy.
  3. Chọn một trong các yêu cầu API không thực hiện được có mã phản hồi 400.
  4. Chuyển qua các giai đoạn khác nhau và xác định nơi xảy ra lỗi.
  5. Thông thường, bạn sẽ thấy phản hồi lỗi 400 đến từ máy chủ phụ trợ. Tức là bạn sẽ thấy phản hồi lỗi 400 trong giai đoạn Đã nhận được phản hồi từ máy chủ đích như minh hoạ dưới đây:

  6. Xác định điểm cuối mục tiêu mà yêu cầu được thực hiện bằng cách nhấp vào biểu tượng AX (Dữ liệu Analytics được ghi lại) trong dấu vết.

  7. Ghi lại target.name, đại diện cho tên điểm cuối đích.

    Trong tệp theo dõi ví dụ ở trên, target.namedefault. Điều này cho biết rằng điểm cuối đích được dùng cho yêu cầu này là mặc định.

  8. Xem lại định nghĩa về điểm cuối mục tiêu để hiểu rõ cấu hình.

    Cấu hình điểm cuối mục tiêu mẫu:

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

    Cấu hình điểm cuối đích mẫu ở trên cho thấy bạn đang sử dụng một máy chủ đích có tên là faulty-target.

  9. Sau khi có tên máy chủ đích, bạn có thể dùng một trong các phương thức sau để kiểm tra cấu hình máy chủ đích:

    • Giao diện người dùng Edge
    • API Quản lý

Giao diện người dùng Edge

  1. Chuyển đến Apigee Edge > Quản trị > Môi trường > Máy chủ đích.
  2. Chọn máy chủ đích cụ thể được xác định từ proxy API rồi nhấp vào Chỉnh sửa.
  3. Xác minh cổng được chỉ định cho máy chủ đích và thông tin SSL.
  4. Nếu máy chủ đích được định cấu hình bằng một cổng bảo mật (ví dụ: 443), nhưng SSL không được bật, thì đó là nguyên nhân gây ra vấn đề này.

    Như bạn có thể thấy trong ảnh chụp màn hình ở trên, cổng được dùng là 443 nhưng SSL không được bật cho cổng đó trong cấu hình máy chủ đích. Điều này khiến Trình xử lý thông báo của Apigee Edge gửi các yêu cầu HTTP đến cổng bảo mật 443. Do đó, bạn sẽ gặp lỗi 400 Bad Request với thông báo The plain HTTP request was sent to HTTPS port.

API Quản lý

  1. Thực thi API Lấy máy chủ đích để lấy thông tin chi tiết về cấu hình máy chủ đích cụ thể như minh hoạ bên dưới:

    Người dùng Đám mây công khai:

    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"
    

    Người dùng Đám mây riêng:

    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. Xác minh cổng được chỉ định cho máy chủ đích và thông tin SSL.
  3. Nếu máy chủ đích được định cấu hình bằng một cổng bảo mật (ví dụ: 443), nhưng phần SSLInfo không được xác định hoặc không được bật, thì đó là nguyên nhân gây ra vấn đề này.

    Ví dụ về cấu hình máy chủ đích:

    {
      "host" : "somehost.org",
      "isEnabled" : true,
      "name" : "faulty-target",
      "port" : 443
    }

    Trong đầu ra mẫu ở trên, chúng ta có thể thấy rằng cổng được dùng cho kết nối đích là 443, nhưng không có khối cấu hình SSLInfo.

    Điều này khiến Trình xử lý thông báo của Apigee Edge gửi các yêu cầu HTTP đến cổng bảo mật 443. Do đó, bạn sẽ gặp lỗi 400 Bad Request với thông báo The plain HTTP request was sent to HTTPS port.

Độ phân giải

Nếu máy chủ đích của bạn được bảo mật hoặc được định cấu hình TLS, thì bạn cần bật SSL cho máy chủ đích cụ thể.

Bạn có thể thực hiện việc này bằng một trong những cách sau:

  • Giao diện người dùng Edge
  • API Quản lý

Giao diện người dùng Edge

  1. Chuyển đến máy chủ đích trên Giao diện người dùng Edge > Quản trị > Môi trường > Máy chủ đích.
  2. Chọn máy chủ mục tiêu cụ thể rồi nhấp vào Chỉnh sửa.
  3. Nếu máy chủ đích của bạn an toàn và sử dụng một cổng như 443, hãy bật SSL bằng cách chọn hộp đánh dấu bên cạnh lựa chọn SSL.
  4. Định cấu hình Truststore, CiphersProtocols. (Chỉ khi được yêu cầu)

API Quản lý

Sử dụng API quản lý để định cấu hình máy chủ đích như mô tả trong tài liệu Cập nhật cấu hình máy chủ đích.

Phải thu thập thông tin chẩn đoán

Nếu vấn đề vẫn tiếp diễn ngay cả sau khi bạn làm theo hướng dẫn ở trên, hãy thu thập thông tin chẩn đoán sau đây rồi liên hệ với Nhóm hỗ trợ Apigee Edge.

  1. Nếu bạn là người dùng Đám mây công khai, hãy cung cấp những thông tin sau:
    • Tên tổ chức
    • Tên môi trường
    • Tên proxy API
    • Hoàn tất lệnh curl để tái tạo lỗi
    • Đầu ra của công cụ theo dõi (nếu bạn có thể ghi lại yêu cầu không thành công)
  2. Nếu bạn là người dùng Đám mây riêng, hãy cung cấp những thông tin sau:
    • Thông báo lỗi hoàn chỉnh đã được ghi nhận
    • Tên môi trường
    • Gói proxy API
    • Định nghĩa máy chủ mục tiêu (nếu bạn đang sử dụng máy chủ mục tiêu trong điểm cuối)
    • Đầu ra của công cụ theo dõi (nếu bạn có thể ghi lại yêu cầu không thành công)