400 Permintaan buruk - permintaan HTTP biasa dikirim ke port HTTPS

Anda melihat dokumentasi Apigee Edge.
Buka dokumentasi Apigee X.
info

Gejala

Aplikasi klien menerima respons HTTP 400 Bad Request dengan pesan The plain HTTP request was sent to HTTPS port.

Pesan error

Aplikasi klien mendapatkan kode respons berikut:

HTTP/1.1 400 Bad Request

Diikuti oleh halaman error HTML di bawah:

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

Kemungkinan penyebab

Penyebab Deskripsi Petunjuk pemecahan masalah yang berlaku untuk
Permintaan HTTP ke host virtual yang dikonfigurasi TLS Klien mengirimkan permintaan HTTP ke host virtual yang dikonfigurasi TLS Pengguna Edge Public dan Private Cloud
Permintaan HTTP ke endpoint target yang dikonfigurasi TLS Permintaan HTTP dibuat ke server backend yang mendukung TLS di endpoint target. Pengguna Edge Public dan Private Cloud
Konfigurasi server target yang salah Server target dikonfigurasi dengan port aman 443, tetapi SSL tidak diaktifkan. Pengguna Edge Public dan Private Cloud

Penyebab: Permintaan HTTP ke host virtual yang dikonfigurasi TLS

Error ini terjadi saat klien mencoba terhubung ke API di Apigee dan host virtual yang disebutkan dikonfigurasi untuk menggunakan SSL dan menerima permintaan HTTP.

Diagnosis

Karena masalah ini terjadi di Endpoint utara dan permintaan API gagal pada interaksi titik entri antara aplikasi klien dan Router, pesan error ini tidak dicatat dalam log akses router NGINX. Oleh karena itu, permintaan ini tidak akan diambil di alat seperti Pemantauan API dan alat Pelacakan.

  1. Verifikasi permintaan API Anda dan lihat apakah Anda membuat permintaan HTTP untuk alias host yang dikonfigurasi untuk menerima permintaan hanya di port aman 443. Jika ya, itulah penyebab masalahnya.

    Contoh permintaan API yang salah:

    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. Dalam contoh permintaan di atas, perhatikan bahwa permintaan HTTP dibuat ke alias host myorg-test.apigee.net di port aman 443. Hal ini menyebabkan error 400 Bad Request

Resolusi

Anda harus memverifikasi apakah klien menggunakan HTTP, bukan HTTPs, dan membuat permintaan yang benar seperti yang ditunjukkan di bawah:

Contoh permintaan API:

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

atau

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

Penyebab: Permintaan HTTP ke endpoint target yang dikonfigurasi TLS

Error ini terjadi jika Anda salah mengonfigurasi permintaan HTTP ke server backend yang mendukung TLS di endpoint target Proxy API.

Diagnosis

Gunakan langkah-langkah berikut untuk mendiagnosis error menggunakan alat Pelacakan:

  1. Aktifkan Pelacakan di UI Apigee untuk Proxy API yang terpengaruh.
  2. Buat permintaan ke Proxy API.
  3. Pilih salah satu permintaan API yang gagal dengan kode respons 400.
  4. Buka berbagai fase dan tentukan tempat terjadinya kegagalan.
  5. Biasanya, Anda akan melihat respons error 400 yang berasal dari server backend. Artinya, Anda akan melihat respons error 400 dalam fase Respons diterima dari server target seperti yang ditunjukkan di bawah:

  6. Tentukan endpoint target yang permintaannya dibuat dengan mengklik ikon AX (Data Analytics Tercatat) dalam pelacakan.

  7. Perhatikan target.url, yang berisi protokol, alias host server backend, dan terkadang nomor port. Port yang digunakan untuk URL target adalah 443 tetapi protokolnya adalah HTTP.
  8. Tinjau definisi endpoint target untuk memahami konfigurasi.
  9. Pastikan host server backend aman dan memproses port aman seperti 443. Jika Anda menggunakan protokol sebagai http dalam elemen <URL>, maka itulah penyebab masalah ini.

    Contoh konfigurasi endpoint target:

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

    Contoh di atas menunjukkan bahwa Anda menggunakan protokol HTTP, tetapi port yang digunakan adalah port aman port 443. Hal ini menyebabkan server backend merespons dengan 400 Bad Request dan pesan error The plain HTTP request was sent to HTTPS port.

Resolusi

  1. Jika server backend Anda aman/mendukung TLS, pastikan Anda menggunakan protokol sebagai https dalam elemen <URL> endpoint target seperti yang ditunjukkan dalam contoh berikut:

    Contoh konfigurasi endpoint target:

    <HTTPTargetConnection>
        <Properties/>
        <URL>https://somehost.org:443/get</URL>
    </HTTPTargetConnection>
  2. Jika server backend Anda tidak aman, maka:

    • Jangan sebutkan nomor port aman seperti 443.
    • Anda tidak perlu menyebutkan nomor port sama sekali, jika server backend Anda memproses port standar yang tidak aman
    • Sebutkan nomor port jika Anda menggunakan port lain yang tidak aman, misalnya: 9080

    Contoh konfigurasi endpoint target:

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

Penyebab: Konfigurasi server target yang salah

Jika server target dikonfigurasi dengan port aman seperti 443 tanpa mengaktifkan SSL, hal ini akan menyebabkan Message Processor Apigee Edge mengirim permintaan HTTP ke server target yang aman atau dikonfigurasi TLS sehingga menyebabkan masalah ini.

Diagnosis

Gunakan langkah-langkah berikut untuk mendiagnosis error menggunakan alat Pelacakan:

  1. Aktifkan Pelacakan di UI Apigee untuk Proxy API yang terpengaruh.
  2. Buat permintaan ke Proxy API.
  3. Pilih salah satu permintaan API yang gagal dengan kode respons 400.
  4. Buka berbagai fase dan tentukan tempat terjadinya kegagalan.
  5. Biasanya, Anda akan melihat respons 400 error yang berasal dari server backend. Artinya, Anda akan melihat respons error 400 dalam fase Respons diterima dari server target seperti yang ditunjukkan di bawah:

  6. Tentukan endpoint target yang permintaannya dibuat dengan mengklik ikon AX (Data Analytics Tercatat) dalam pelacakan.

  7. Perhatikan target.name, yang mewakili nama endpoint target.

    Dalam contoh file pelacakan di atas, target.name adalah default. Hal ini menunjukkan bahwa endpoint target yang digunakan untuk permintaan ini adalah default.

  8. Tinjau definisi endpoint target untuk memahami konfigurasi.

    Contoh konfigurasi endpoint target:

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

    Contoh konfigurasi endpoint target di atas menunjukkan bahwa Anda menggunakan server target bernama faulty-target.

  9. Setelah memiliki nama server target, Anda dapat menggunakan salah satu metode berikut untuk memeriksa konfigurasi server target:

    • UI Edge
    • Management API

UI Edge

  1. Buka Apigee Edge > Admin > Environments > Target Servers.
  2. Pilih server target tertentu yang diidentifikasi dari proxy API dan klik Edit.
  3. Verifikasi port yang ditentukan untuk server target dan informasi SSL.
  4. Jika server target dikonfigurasi dengan port aman (misalnya: 443), tetapi SSL tidak diaktifkan, itulah penyebab masalah ini.

    Seperti yang dapat Anda lihat di screenshot di atas, port yang digunakan adalah 443, tetapi SSL tidak diaktifkan untuk port tersebut dalam konfigurasi server target. Hal ini menyebabkan Message Processor Apigee Edge mengirim permintaan HTTP ke port aman 443. Oleh karena itu, Anda akan mendapatkan error 400 Bad Request dengan pesan The plain HTTP request was sent to HTTPS port.

Management API

  1. Jalankan Get target server API untuk mendapatkan detail tentang konfigurasi server target tertentu seperti yang ditunjukkan di bawah:

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

    Pengguna 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. Verifikasi port yang ditentukan untuk server target dan informasi SSL.
  3. Jika server target dikonfigurasi dengan port aman (misalnya: 443), tetapi bagian SSLInfo tidak ditentukan atau tidak diaktifkan, itulah penyebab masalah ini.

    Contoh konfigurasi server target:

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

    Dalam contoh output di atas, kita dapat melihat bahwa port yang digunakan untuk koneksi target adalah 443, tetapi tidak ada SSLInfo blok konfigurasi.

    Hal ini menyebabkan Message Processor Apigee Edge mengirim permintaan HTTP ke port aman 443. Oleh karena itu, Anda akan mendapatkan error 400 Bad Request dengan pesan The plain HTTP request was sent to HTTPS port.

Resolusi

Jika server target Anda aman atau dikonfigurasi TLS, Anda harus mengaktifkan SSL untuk server target tertentu.

Anda dapat melakukannya dengan menggunakan salah satu opsi berikut:

  • UI Edge
  • Management API

UI Edge

  1. Buka server target di UI Edge > Admin > Environments > Target Servers.
  2. Pilih server target tertentu dan klik Edit.
  3. Jika server target Anda aman dan menggunakan port seperti 443, aktifkan SSL dengan mencentang kotak di samping opsi SSL.
  4. Konfigurasi Truststore, Ciphers, dan Protocols. (Hanya jika diperlukan)

Management API

Gunakan management API untuk mengonfigurasi server target seperti yang dijelaskan dalam dokumentasi Mengupdate konfigurasi server target.

Informasi diagnostik yang harus dikumpulkan

Jika masalah berlanjut meskipun setelah mengikuti petunjuk di atas, kumpulkan informasi diagnostik berikut lalu hubungi Dukungan Apigee Edge.

  1. Jika Anda adalah pengguna Public Cloud, berikan informasi berikut:
    • Nama organisasi
    • Nama lingkungan
    • Nama proxy API
    • Perintah curl lengkap untuk mereproduksi error
    • Output alat Pelacakan (jika Anda dapat mengambilnya untuk permintaan yang gagal)
  2. Jika Anda adalah pengguna Private Cloud, berikan informasi berikut:
    • Pesan error lengkap yang diamati
    • Nama lingkungan
    • Paket proxy API
    • Definisi server target (jika Anda menggunakan server target di endpoint)
    • Output alat Pelacakan (jika Anda dapat mengambilnya untuk permintaan yang gagal)