400 Permintaan buruk - permintaan HTTP biasa dikirim ke port HTTPS

Anda sedang 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 Publik 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 Publik dan Private Cloud
Konfigurasi server target salah Server target dikonfigurasi dengan port aman 443, tetapi SSL tidak diaktifkan. Pengguna Edge Publik 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 sebagai gantinya.

Diagnosis

Karena masalah ini terjadi di endpoint Northbound dan permintaan API gagal pada interaksi titik masuk antara aplikasi klien dan Router, pesan error ini tidak dicatat dalam log akses router NGINX. Oleh karena itu, permintaan ini tidak akan disimpan dalam alat seperti Pemantauan API dan alat Trace.

  1. Verifikasi permintaan API Anda dan lihat apakah Anda membuat permintaan HTTP untuk alias host yang dikonfigurasi untuk menerima permintaan hanya pada port aman 443. Jika ya, maka 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 untuk alias host myorg-test.apigee.net pada port aman 443. Inilah penyebab error 400 Bad Request.

Resolusi

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

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 telah 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 Trace:

  1. Aktifkan Trace 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. Jelajahi berbagai fase dan tentukan di mana kegagalan terjadi.
  5. Biasanya Anda akan melihat respons error 400 berasal dari server backend. Artinya, Anda akan melihat respons error 400 pada fase Respons diterima dari server target seperti yang ditunjukkan di bawah ini:

  6. Tentukan endpoint target tempat permintaan dibuat dengan mengklik ikon AX (Analytics Data Recorded) dalam trace.

  7. Catat 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. Verifikasi bahwa host server backend aman dan melakukan pemrosesan di port aman seperti 443. Jika Anda menggunakan protokol sebagai http dalam elemen <URL>, berarti 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 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/TLS, pastikan Anda menggunakan protokol sebagai https di 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 menyebutkan nomor port aman seperti 443.
    • Anda tidak perlu menyebutkan nomor port sama sekali, jika server backend Anda memantau port standar yang tidak aman
    • Sebutkan nomor port jika Anda menggunakan port yang tidak aman lainnya, 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 salah

Jika server target dikonfigurasi dengan port aman seperti 443 tanpa mengaktifkan SSL, maka Prosesor Pesan Apigee Edge akan mengirim permintaan HTTP ke server target aman atau yang dikonfigurasi TLS yang mengarah ke masalah ini.

Diagnosis

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

  1. Aktifkan Trace 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. Jelajahi berbagai fase dan tentukan di mana kegagalan terjadi.
  5. Biasanya Anda akan melihat respons error 400 berasal dari server backend. Artinya, Anda akan melihat respons error 400 pada fase Respons yang diterima dari server target seperti yang ditunjukkan di bawah ini:

  6. Tentukan endpoint target tempat permintaan dibuat dengan mengklik ikon AX (Analytics Data Recorded) dalam trace.

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

    Pada contoh file rekaman aktivitas di atas, target.name adalah default. Hal ini menunjukkan bahwa endpoint target yang digunakan untuk permintaan ini bersifat 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 mendapatkan 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 spesifik yang diidentifikasi dari proxy API, lalu 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 Anda lihat pada 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 mendapatkan error 400 Bad Request dengan pesan The plain HTTP request was sent to HTTPS port.

Management API

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

    Pengguna Cloud Publik:

    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, berarti itulah penyebab masalah ini.

    Contoh konfigurasi server target:

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

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

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

Resolusi

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

Anda dapat melakukannya menggunakan salah satu opsi berikut:

  • UI Edge
  • Management API

UI Edge

  1. Buka server target di UI Edge > Admin > Lingkungan > Server Target.
  2. Pilih server target spesifik dan klik Edit.
  3. Jika server target Anda aman dan menggunakan port seperti 443, aktifkan SSL dengan memilih kotak centang di samping opsi SSL.
  4. Mengonfigurasi Truststore, Ciphers, dan Protocols. (Hanya jika diperlukan)

Management API

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

Harus mengumpulkan informasi diagnostik

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

  1. Jika Anda adalah pengguna Cloud Publik, berikan informasi berikut:
    • Nama organisasi
    • Nama lingkungan
    • Nama proxy API
    • Menyelesaikan perintah curl untuk mereproduksi error
    • Output alat trace (jika Anda dapat menangkap 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 trace (jika Anda dapat menangkap permintaan yang gagal)