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 tersebut 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 ini:

<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 berlaku untuk
Permintaan HTTP ke host virtual yang dikonfigurasi TLS Klien mengirim 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 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 {i>host<i} virtual dikonfigurasi untuk menggunakan SSL dan menerima permintaan HTTP sebagai gantinya.

Diagnosis

Karena masalah ini terjadi di Endpoint arah utara dan permintaan API gagal di interaksi titik entri antara aplikasi klien dan Router, pesan error ini tidak dicatat di router NGINX log akses. Oleh karena itu, permintaan ini tidak akan ditangkap 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 masalah.

    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 pada port aman 443. Ini adalah penyebab 400 Bad Request error.

Resolusi

Anda perlu memverifikasi apakah klien menggunakan HTTP, bukan HTTPs dan membuat permintaan yang benar yang ditampilkan 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 salah mengonfigurasi permintaan HTTP ke backend yang mengaktifkan TLS server tertentu di titik akhir 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. Membuat permintaan ke Proxy API.
  3. Pilih salah satu permintaan API yang gagal dengan kode respons 400.
  4. Lihat berbagai fase dan tentukan di mana kegagalan terjadi.
  5. Biasanya Anda akan melihat respons error 400 yang berasal dari server backend. Artinya, Anda akan melihat respons error 400 di fase Respons diterima dari server target seperti yang ditunjukkan di bawah ini:

  6. Tentukan endpoint target yang dibuatkan permintaan dengan mengklik AX (Data Analytics Direkam) di rekaman aktivitas.

  7. Perhatikan target.url, yang berisi protokol, alias host server backend, dan terkadang nomor port. Porta yang digunakan untuk URL targetnya adalah 443 tetapi protokolnya adalah HTTP.
  8. Tinjau definisi endpoint target untuk memahami konfigurasinya.
  9. Pastikan host server backend aman dan memproses port aman seperti 443. Jika Anda menggunakan protokol sebagai http dalam elemen <URL>, 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 porta yang digunakan 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 aman/TLS, pastikan Anda menggunakan protokol tersebut https di elemen <URL> endpoint target seperti yang ditunjukkan pada 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 non-aman standar
    • Cantumkan nomor port jika Anda menggunakan port 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, lalu menyebabkan Pemroses Pesan Apigee Edge mengirim permintaan HTTP ke jaringan Server target yang dikonfigurasi TLS yang menyebabkan 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. Membuat permintaan ke Proxy API.
  3. Pilih salah satu permintaan API yang gagal dengan kode respons 400.
  4. Lihat berbagai fase dan tentukan di mana kegagalan terjadi.
  5. Biasanya Anda akan melihat 400 respons error yang berasal dari server backend. Anda akan melihat respons error 400 di fase Respons diterima dari server target seperti yang ditunjukkan di bawah ini:

  6. Tentukan endpoint target yang dibuatkan permintaan dengan mengklik AX (Data Analytics Direkam) di rekaman aktivitas.

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

    Dalam contoh file rekaman aktivitas di atas, target.name bersifat default. Hal ini menunjukkan bahwa endpoint target yang digunakan untuk permintaan ini adalah {i>default<i}.

  8. Tinjau definisi endpoint target untuk memahami konfigurasinya.

    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>
    

    Konfigurasi endpoint target contoh di atas menunjukkan bahwa Anda menggunakan server target bernama faulty-target.

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

    • UI Edge
    • Management API

UI Edge

  1. Buka Apigee Edge > Admin > Lingkungan > Server Target.
  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), tapi SSL tidak diaktifkan, maka itulah penyebab masalah ini.

    Seperti yang dapat Anda lihat pada screenshot di atas, port yang digunakan adalah 443 tetapi SSL tidak diaktifkan untuk porta tersebut di konfigurasi server target. Hal ini menyebabkan Pesan Apigee Edge Pemroses untuk 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 Mendapatkan API server target untuk mendapatkan detail tentang konfigurasi server target tertentu sebagaimana 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, maka itulah penyebab menyelesaikan masalah ini.

    Contoh konfigurasi server target:

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

    Dalam contoh {i>output<i} di atas, kita dapat melihat bahwa porta yang digunakan untuk koneksi target telah 443, tetapi tidak ada blok konfigurasi SSLInfo.

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

Resolusi

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

Anda dapat melakukannya menggunakan salah satu opsi berikut:

  • UI Edge
  • Management API

UI Edge

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

Management API

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

Harus mengumpulkan informasi diagnostik

Jika masalah berlanjut bahkan setelah mengikuti instruksi di atas, kumpulkan informasi diagnostik, 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 pelacakan (jika Anda dapat menangkap permintaan yang gagal)
  2. Jika Anda adalah pengguna Private Cloud, berikan informasi berikut:
    • Pesan error lengkap diamati
    • Nama lingkungan
    • Paket proxy API
    • Definisi server target (jika Anda menggunakan server target di endpoint)
    • Output alat pelacakan (jika Anda dapat menangkap permintaan yang gagal)