400 Hatalı istek - HTTPS bağlantı noktasına gönderilen düz HTTP isteği

Apigee Edge belgelerini görüntülüyorsunuz.
Apigee X belgelerine gidin.
bilgi

Belirti

İstemci uygulaması, HTTP 400 Bad Request yanıtını The plain HTTP request was sent to HTTPS port mesajıyla birlikte alır.

Hata mesajı

İstemci uygulaması aşağıdaki yanıt kodunu alır:

HTTP/1.1 400 Bad Request

Ardından aşağıdaki HTML hata sayfası gösterilir:

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

Olası nedenler

Neden Açıklama Aşağıdaki ürünler için geçerli sorun giderme talimatları
TLS yapılandırılmış bir sanal ana makineye HTTP isteği İstemci, TLS yapılandırılmış bir sanal ana makineye HTTP isteği gönderir. Edge Public ve Private Cloud kullanıcıları
TLS yapılandırılmış bir hedef uç noktasına HTTP isteği Hedef uç noktasında TLS'nin etkin olduğu bir arka uç sunucusuna HTTP isteği gönderildi. Edge Public ve Private Cloud kullanıcıları
Yanlış hedef sunucu yapılandırması Hedef sunucu 443 güvenli bağlantı noktasıyla yapılandırılmış ancak SSL etkinleştirilmemiş. Edge Public ve Private Cloud kullanıcıları

Neden: TLS yapılandırılmış bir sanal ana makineye HTTP isteği gönderiliyor.

Bu hata, bir istemci Apigee'deki bir API'ye bağlanmaya çalışırken ve söz konusu sanal ana makine SSL kullanacak şekilde yapılandırılmışken bunun yerine bir HTTP isteği aldığında oluşur.

Teşhis

Bu sorun Northbound uç noktasında meydana geldiği ve API istekleri, istemci uygulaması ile yönlendirici arasındaki giriş noktası etkileşiminde başarısız olduğu için bu hata mesajları NGINX yönlendirici erişim günlüklerine kaydedilmez. Bu nedenle, bu istekler API İzleme ve İzleme Aracı gibi araçlarda yakalanmaz.

  1. API isteğinizi doğrulayın ve yalnızca güvenli bağlantı noktası 443 üzerinden istekleri kabul edecek şekilde yapılandırılmış bir ana makine takma adı için HTTP isteği gönderip göndermediğinizi kontrol edin. Bu durumda sorun bundan kaynaklanıyor demektir.

    Hatalı API isteği örneği:

    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. Yukarıdaki örnek istekte, güvenli bağlantı noktası 443 üzerinde ana makine takma adına myorg-test.apigee.net bir HTTP isteği gönderildiğini unutmayın. Bu durum, 400 Bad Request hatasına neden olur.

Çözünürlük

İstemcinin HTTPS yerine HTTP kullandığını doğrulamanız ve aşağıda gösterildiği gibi doğru isteği yapmanız gerekir:

Örnek API isteği:

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

veya

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

Neden: TLS yapılandırılmış bir hedef uç noktasına HTTP isteği gönderilmesi

Bu hata, bir API proxy'sinin hedef uç noktasında TLS etkin bir arka uç sunucusuna HTTP isteklerini yanlış yapılandırdıysanız oluşur.

Teşhis

İzleme aracını kullanarak hatayı teşhis etmek için aşağıdaki adımları uygulayın:

  1. Etkilenen API proxy'si için Apigee kullanıcı arayüzünde İzleme'yi etkinleştirin.
  2. API proxy'sine istek gönderme
  3. 400 yanıt koduyla başarısız olan API isteklerinden birini seçin.
  4. Çeşitli aşamalar arasında gezinin ve hatanın nerede oluştuğunu belirleyin.
  5. Genellikle arka uç sunucusundan 400 hata yanıtı gelir. Yani, aşağıdaki örnekte gösterildiği gibi Hedef sunucudan yanıt alındı aşamasında 400 hata yanıtını görürsünüz:

  6. İzleme işleminde AX (Analytics Verileri Kaydedildi) simgesini tıklayarak isteğin yapıldığı hedef uç noktayı belirleyin.

  7. Protokolü, arka uç sunucusu ana makine takma adını ve bazen bağlantı noktası numarasını içeren target.url'ye dikkat edin. Hedef URL için kullanılan bağlantı noktası 443 ancak protokol HTTP.
  8. Yapılandırmayı anlamak için hedef uç noktanın tanımını inceleyin.
  9. Arka uç sunucusu ana makinesinin güvenli olduğunu ve 443 gibi güvenli bir bağlantı noktasında dinleme yaptığını doğrulayın. <URL> öğesinde protokolü http olarak kullanıyorsanız bu sorunun nedeni budur.

    Hedef uç nokta yapılandırması örneği:

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

    Yukarıdaki örnekte HTTP protokolünü kullandığınız ancak kullanılan bağlantı noktasının güvenli bağlantı noktası 443 olduğu gösterilmektedir. Bu durum, arka uç sunucusunun 400 Bad Request ile yanıt vermesine ve The plain HTTP request was sent to HTTPS port hata mesajının gösterilmesine neden olur.

Çözünürlük

  1. Arka uç sunucunuz güvenli/TLS etkinse aşağıdaki örnekte gösterildiği gibi hedef uç noktanın <URL> öğesinde protokolü https olarak kullandığınızdan emin olun:

    Hedef uç nokta yapılandırması örneği:

    <HTTPTargetConnection>
        <Properties/>
        <URL>https://somehost.org:443/get</URL>
    </HTTPTargetConnection>
  2. Arka uç sunucunuz güvenli değilse:

    • 443 gibi güvenli bağlantı noktası numarasından bahsetmeyin.
    • Arka uç sunucunuz standart olmayan güvenli bir bağlantı noktasını dinliyorsa bağlantı noktası numarasını hiç belirtmeniz gerekmez.
    • Güvenli olmayan başka bir bağlantı noktası kullanıyorsanız bağlantı noktası numarasını belirtin. Örneğin: 9080

    Hedef uç nokta yapılandırması örneği:

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

Neden: Hedef sunucu yapılandırması yanlış

Hedef sunucu, SSL etkinleştirilmeden 443 gibi güvenli bir bağlantı noktasıyla yapılandırılmışsa bu durum, Apigee Edge'in mesaj işlemcisinin güvenli veya TLS yapılandırılmış bir hedef sunucuya HTTP istekleri göndermesine neden olarak bu soruna yol açar.

Teşhis

İzleme aracını kullanarak hatayı teşhis etmek için aşağıdaki adımları uygulayın:

  1. Etkilenen API proxy'si için Apigee kullanıcı arayüzünde İzleme'yi etkinleştirin.
  2. API proxy'sine istek gönderme
  3. 400 yanıt koduyla başarısız olan API isteklerinden birini seçin.
  4. Çeşitli aşamalar arasında gezinin ve hatanın nerede oluştuğunu belirleyin.
  5. Genellikle arka uç sunucusundan gelen 400 hata yanıtını görürsünüz. Yani, aşağıdaki örnekte gösterildiği gibi Hedef sunucudan yanıt alındı aşamasında 400 hata yanıtını görürsünüz:

  6. İzleme işleminde AX (Analytics Verileri Kaydedildi) simgesini tıklayarak isteğin yapıldığı hedef uç noktayı belirleyin.

  7. Hedef uç nokta adını temsil eden target.name değerini not edin.

    Yukarıdaki örnek izleme dosyasında target.name değeri default'tur. Bu, istek için kullanılan hedef uç noktanın varsayılan olduğunu gösterir.

  8. Yapılandırmayı anlamak için hedef uç noktanın tanımını inceleyin.

    Hedef uç nokta yapılandırması örneği:

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

    Yukarıdaki örnek hedef uç nokta yapılandırması, faulty-target adlı bir hedef sunucu kullandığınızı gösterir.

  9. Hedef sunucu adını aldıktan sonra hedef sunucu yapılandırmasını kontrol etmek için aşağıdaki yöntemlerden birini kullanabilirsiniz:

    • Edge kullanıcı arayüzü
    • Yönetim API'si

Edge kullanıcı arayüzü

  1. Apigee Edge > Yönetici > Ortamlar > Hedef Sunucular'a gidin.
  2. API proxy'sinden tanımlanan hedef sunucuyu seçin ve Düzenle'yi tıklayın.
  3. Hedef sunucu için belirtilen bağlantı noktasını ve SSL bilgilerini doğrulayın.
  4. Hedef sunucu güvenli bir bağlantı noktasıyla (örneğin: 443) yapılandırılmışsa ancak SSL etkinleştirilmemişse bu sorunun nedeni budur.

    Yukarıdaki ekran görüntüsünde görebileceğiniz gibi, kullanılan bağlantı noktası 443 ancak hedef sunucu yapılandırmasında bu bağlantı noktası için SSL etkinleştirilmemiş. Bu durum, Apigee Edge'in Mesaj İşleyicisi'nin güvenli bağlantı noktasına 443 HTTP istekleri göndermesine neden olur. Bu nedenle, The plain HTTP request was sent to HTTPS port mesajıyla birlikte 400 Bad Request hatasını alırsınız.

Yönetim API'si

  1. Belirli hedef sunucu yapılandırmasıyla ilgili ayrıntıları almak için aşağıdaki gibi Get target server API'sini yürütün:

    Herkese açık bulut kullanıcısı:

    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"
    

    Private Cloud kullanıcısı:

    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. Hedef sunucu için belirtilen bağlantı noktasını ve SSL bilgilerini doğrulayın.
  3. Hedef sunucu güvenli bir bağlantı noktasıyla (örneğin: 443) yapılandırılmışsa ancak SSLInfo bölümü tanımlanmamışsa veya etkinleştirilmemişse bu sorun bundan kaynaklanıyor olabilir.

    Hedef sunucu yapılandırması örneği:

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

    Yukarıdaki örnek çıktıda, hedef bağlantı için kullanılan bağlantı noktasının 443 olduğu ancak SSLInfo yapılandırma bloğunun olmadığı görülüyor.

    Bu durum, Apigee Edge'in Mesaj İşleyicisi'nin güvenli bağlantı noktasına HTTP istekleri göndermesine neden olur 443. Bu nedenle, 400 Bad Request hata mesajını alırsınız. The plain HTTP request was sent to HTTPS port.

Çözünürlük

Hedef sunucunuz güvenliyse veya TLS yapılandırılmışsa belirli hedef sunucu için SSL'yi etkinleştirmeniz gerekir.

Bu işlemi aşağıdaki seçeneklerden birini kullanarak yapabilirsiniz:

  • Edge kullanıcı arayüzü
  • Yönetim API'si

Edge kullanıcı arayüzü

  1. Edge kullanıcı arayüzü > Yönetici > Ortamlar > Hedef Sunucular'da hedef sunucuya gidin.
  2. İlgili hedef sunucuyu seçin ve Düzenle'yi tıklayın.
  3. Hedef sunucunuz güvenliyse ve 443 gibi bir bağlantı noktası kullanıyorsa SSL seçeneğinin yanındaki onay kutusunu işaretleyerek SSL'yi etkinleştirin.
  4. Truststore, Ciphers ve Protocols'u yapılandırın. (Yalnızca gerekliyse)

Yönetim API'si

Hedef sunucuyu yapılandırmak için yönetim API'sini kullanın. Bu işlem, � Hedef sunucu yapılandırmasını güncelleme dokümanında açıklanmıştır.

Teşhis bilgilerini toplamalıdır

Yukarıdaki talimatları uyguladıktan sonra sorun devam ederse aşağıdaki teşhis bilgilerini toplayın ve Apigee Edge Destek Ekibi ile iletişime geçin.

  1. Herkese Açık Bulut kullanıcısıysanız aşağıdaki bilgileri sağlayın:
    • Kuruluş adı
    • Ortam adı
    • API proxy'sinin adı
    • Hatayı yeniden oluşturmak için kullanılan curl komutunun tamamı
    • İzleme aracı çıkışı (başarısız olan istek için yakalayabildiyseniz)
  2. Private Cloud kullanıcısıysanız aşağıdaki bilgileri sağlayın:
    • Gözlemlenen hata mesajının tamamı
    • Ortam adı
    • API proxy paketi
    • Hedef sunucu tanımı (uç noktanızda hedef sunucu kullanıyorsanız)
    • İzleme aracı çıkışı (başarısız olan istek için yakalayabildiyseniz)