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.
Chuyển đến tài liệu về Apigee X.
thông tin

Triệu chứng

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

Thông báo lỗi

Ứng dụng khách 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 Nội dung 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 Ứng dụng gửi yêu cầu HTTP đến một máy chủ ảo được định cấu hình TLS (Bảo mật tầng truyền tải) Người dùng Edge Public 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ột máy chủ phụ trợ đã bật TLS tại điểm cuối đích. Người dùng Edge Public 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 với cổng bảo mật 443 nhưng SSL chưa được bật. Người dùng Edge Public và Private Cloud

Nguyên nhân: yêu cầu HTTP đến 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 bằng Apigee và máy chủ lưu trữ ảo đã đề 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 Hướng bắc và các yêu cầu API không thành công tại điểm truy cập tương tác giữa ứng dụng khách và Bộ định tuyến, nên những 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ư Giám sát API và công cụ Theo dõi.

  1. Xác minh yêu cầu API của bạn và xem liệu bạn có đang gửi yêu cầu HTTP cho một email đại diện của máy chủ đượ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 của vấn đề.

    Mẫu yêu cầu API 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ủ 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 ứng dụng có đang sử dụng HTTP thay vì HTTP hay không, sau đó đưa ra yêu cầu chính xác như đoạn mã 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 điểm cuối đích đã đị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 tới một máy chủ phụ trợ có hỗ trợ TLS (Bảo mật tầng truyền tải) trong điểm cuối đích của một Proxy API.

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 tính năng Trace trong giao diện người dùng Apigee cho Proxy API bị ảnh hưởng.
  2. Gửi yêu cầu đến Proxy API.
  3. Chọn một trong các yêu cầu API không thành công bằng mã phản hồi 400.
  4. Xem qua các giai đoạn 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 Phản hồi nhận được từ máy chủ mục tiêu như minh hoạ dưới đây:

  6. Xác định điểm cuối đích mà yêu cầu được gửi bằng cách nhấp vào biểu tượng AX (đã ghi dữ liệu phân tích) trong dấu vết.

  7. Hãy lưu ý đến target.url, nơi chứa giao thức, bí danh của máy chủ phụ trợ và đôi khi là số cổng. Cổng được sử dụng cho URL đích 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 cấu hình.
  9. Xác minh rằng máy chủ lưu trữ của máy chủ phụ trợ được bảo mật và theo dõi trên một cổng bảo mật như 443. Nếu bạn đang sử dụng giao thức là http trong phần tử <URL>, thì đó chính là nguyên nhân của sự cố này.

    Cấu hình điểm cuối của 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 sử dụng là cổng bảo mật 443. Việc 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 đã bật tính năng bảo mật/TLS, hãy đảm bảo rằng bạn sử dụng giao thức là 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 của 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 bảo mật, hãy làm như sau:

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

    Cấu hình điểm cuối của 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ì việc này sẽ khiến Bộ xử lý thông báo của Apigee Edge gửi các yêu cầu HTTP tới một máy chủ đích bảo mật hoặc được định cấu hình TLS dẫn đến sự cố 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 tính năng Trace trong giao diện người dùng Apigee cho Proxy API bị ảnh hưởng.
  2. Gửi yêu cầu đến Proxy API.
  3. Chọn một trong các yêu cầu API không thành công bằng mã phản hồi 400.
  4. Xem qua các giai đoạn 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 Phản hồi nhận được từ máy chủ mục tiêu như minh hoạ dưới đây:

  6. Xác định điểm cuối đích mà yêu cầu được gửi bằng cách nhấp vào biểu tượng AX (đã ghi dữ liệu phân tích) trong dấu vết.

  7. Hãy ghi lại tên target.name, đại diện cho tên điểm cuối mục tiêu.

    Trong tệp theo dõi ví dụ ở trên, target.namemặc định. Đ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 cấu hình.

    Cấu hình điểm cuối của 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 mục tiêu mẫu ở trên cho thấy rằng bạn đang sử dụng máy chủ mục tiêu có tên là faulty-target.

  9. Sau khi có tên máy chủ mục tiêu, 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ủ mục tiêu:

    • 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ủ mục tiêu.
  2. Chọn máy chủ mục tiêu cụ thể được xác định từ proxy API và 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 chưa được bật, thì đó chính là nguyên nhân của sự cố này.

    Như bạn có thể thấy trong ảnh chụp màn hình ở trên, cổng được sử dụng là 443 nhưng SSL chưa được bật cho cổng đó trong cấu hình máy chủ mục tiêu. Việc này khiến Bộ xử lý tin nhắn của Apigee Edge gửi các yêu cầu HTTP tới 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 Tải máy chủ mục tiêu để nhận thông tin chi tiết về cấu hình máy chủ mục tiêu cụ thể như trình bày bên dưới:

    Người dùng 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"
    

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

    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ủ mục tiêu đượ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 chưa được bật, thì đó chính là nguyên nhân của sự cố này.

    Cấu hình máy chủ đích mẫu:

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

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

    Việc này khiến Trình xử lý tin nhắn của Apigee Edge gửi các yêu cầu HTTP tới 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 định cấu hình bảo mật hoặc TLS (Bảo mật tầng truyền tải), 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 các tuỳ chọn sau:

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

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

  1. Di chuyển đến máy chủ mục tiêu trên Edge UI > Admin > Environments > Target Servers (Giao diện người dùng Edge > Quản trị viên > Môi trường > Máy chủ mục tiêu).
  2. Chọn máy chủ đích cụ thể và nhấp vào Chỉnh sửa.
  3. Nếu máy chủ đích của bạn được bảo mật và sử dụng một cổng như 443, hãy bật SSL bằng cách chọn hộp kiểm bên cạnh tuỳ chọn SSL.
  4. Định cấu hình Truststore (Tin cậy), Ciphers (Mã mật mã) và Protocols (Giao thức). (Chỉ khi bắt buộc)

API Quản lý

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

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

Nếu sự cố vẫn tiếp diễn sau khi đã 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.

  1. Nếu bạn là người dùng Public Cloud (Đám mây công cộng), 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 hiện lỗi
    • Kết quả của công cụ theo dõi (nếu bạn có thể thu thập dữ liệu cho 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 tư, hãy cung cấp những thông tin sau:
    • Đã phát hiện thấy thông báo lỗi hoàn chỉnh
    • 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ủ đích trong điểm cuối của mình)
    • Kết quả của công cụ theo dõi (nếu bạn có thể thu thập dữ liệu cho yêu cầu không thành công)