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ı, The plain HTTP request was sent to HTTPS port mesajını içeren bir HTTP 400 Bad Request yanıtı 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ı gelir:

<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 Şunun için geçerli sorun giderme talimatları:
TLS ile yapılandırılmış bir sanal ana makineye HTTP isteği İstemci, TLS ile yapılandırılmış bir sanal ana makineye HTTP isteği gönderir Edge Herkese Açık ve Özel Bulut kullanıcıları
TLS yapılandırılmış hedef uç noktasına HTTP isteği Hedef uç noktadaki TLS özellikli bir arka uç sunucusuna yapılan HTTP isteği. Edge Herkese Açık ve Özel Bulut kullanıcıları
Hatalı hedef sunucu yapılandırması Hedef sunucu, 443 güvenli bağlantı noktasıyla yapılandırılmış ancak SSL etkin değil. Edge Herkese Açık ve Özel Bulut kullanıcıları

Neden: TLS ile yapılandırılmış bir sanal ana makineye HTTP isteği

Bu hata, bir istemci Apigee'deki bir API'ye bağlanmaya çalıştığında ve bahsedilen sanal ana makine SSL kullanacak şekilde yapılandırıldığında ve bunun yerine HTTP isteği aldığında ortaya çıkar.

Teşhis

Bu sorun Northbound uç noktasında meydana geldiği ve istemci uygulaması ile Yönlendirici arasındaki giriş noktası etkileşiminde API istekleri 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 istekleri yalnızca 443 güvenli bağlantı noktasında kabul edecek şekilde yapılandırılmış bir ana makine takma adı için HTTP isteği yapıp yapmadığınıza bakın. Öyleyse sorunun nedeni budur.

    Örnek yanlış API isteğ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, 443 güvenli bağlantı noktası üzerinde ana makine takma adına myorg-test.apigee.net bir HTTP isteğinin gönderildiğini unutmayın. 400 Bad Request hatasının nedeni budur.

Çözünürlük

İstemcinin HTTP yerine HTTP kullanıp kullanmadığı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 ile yapılandırılmış hedef uç noktasına HTTP isteği

Bu hata, bir API Proxy'sinin hedef uç noktasında, TLS özellikli bir arka uç sunucusuna gönderilen HTTP isteklerini yanlış yapılandırdıysanız ortaya çıkar.

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 Trace'i etkinleştirin.
  2. API Proxy'sine istek gönderin.
  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 meydana geldiğini belirleyin.
  5. Genellikle 400 hata yanıtını arka uç sunucudan görürsünüz. Yani Hedef sunucudan alınan yanıt aşamasında 400 hata yanıtını aşağıda gösterildiği gibi görürsünüz:

  6. İzdeki AX (Analytics Verileri Kaydı) 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 adresini not edin. Hedef URL için kullanılan bağlantı noktası 443, ancak protokol HTTP'dir.
  8. Yapılandırmayı anlamak için hedef uç noktanın tanımını inceleyin.
  9. Arka uç sunucu ana makinesinin güvenli olduğunu ve 443 gibi güvenli bir bağlantı noktasında dinleme yaptığını doğrulayın. Protokolü <URL> öğesinde http olarak kullanıyorsanız sorunun nedeni budur.

    Örnek hedef uç nokta yapılandırması:

    <?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 örnek, HTTP protokolünü kullandığınızı ancak kullanılan bağlantı noktasının 443 güvenli bağlantı noktası olduğunu göstermektedir. Bu, arka uç sunucusunun 400 Bad Request ve The plain HTTP request was sent to HTTPS port hata mesajı ile yanıt vermesine neden olur.

Çözünürlük

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

    Örnek hedef uç nokta yapılandırması:

    <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 güvenli olmayan standart bir bağlantı noktasında dinleme yapıyorsa bağlantı noktası numarasını belirtmeniz gerekmez
    • Güvenli olmayan başka bir bağlantı noktası kullanıyorsanız bağlantı noktası numarasını belirtin. Örneğin: 9080

    Örnek hedef uç nokta yapılandırması:

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

Neden: Yanlış hedef sunucu yapılandırması

Hedef sunucu, SSL etkinleştirilmeden 443 gibi güvenli bir bağlantı noktasıyla yapılandırılmışsa bu sorun, Apigee Edge'in Mesaj İşleyicisinin HTTP isteklerini güvenli veya TLS ile yapılandırılmış bir hedef sunucuya göndermesine neden olur.

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 Trace'i etkinleştirin.
  2. API Proxy'sine istek gönderin.
  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 meydana geldiğini belirleyin.
  5. Tipik olarak 400 hata yanıtının arka uç sunucudan geldiğini görürsünüz. Bu durumda, 400 hata yanıtını Hedef sunucudan alınan aşamasında aşağıda gösterildiği gibi görürsünüz:

  6. İzdeki AX (Analytics Verileri Kaydı) simgesini tıklayarak isteğin yapıldığı hedef uç noktayı belirleyin.

  7. Hedef uç nokta adını temsil eden target.name ifadesini not edin.

    Yukarıdaki örnek izleme dosyasında target.name varsayılan'dır. Bu değer, 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.

    Örnek hedef uç nokta yapılandırması:

    <?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östermektedir.

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

    • Edge kullanıcı arayüzü
    • Management API'si

Edge kullanıcı arayüzü

  1. Apigee Edge > Yönetici > Ortamlar > Hedef Sunucular'a gidin.
  2. API proxy'sinden tanımlanan belirli 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 yapılandırılmışsa (örneğin: 443) ancak SSL etkin değilse 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ştirilmedi. Bu durum, Apigee Edge'in Mesaj İşleyicisinin 443 güvenli bağlantı noktasına 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ıyorsunuz.

Management API'si

  1. Belirli hedef sunucu yapılandırmasıyla ilgili ayrıntıları aşağıda gösterildiği gibi almak için Hedef sunucu alma API'sini çalıştırı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 yapılandırılmışsa (örneğin: 443) ancak SSLInfo bölümü tanımlanmamışsa veya etkinleştirilmemişse sorunun nedeni budur.

    Örnek hedef sunucu yapılandırması:

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

    Yukarıdaki örnek çıkışta, hedef bağlantı için kullanılan bağlantı noktasının 443 olduğunu ancak SSLInfo yapılandırma bloğu olmadığını görüyoruz.

    Bu durum, Apigee Edge'in Mesaj İşleyicisinin HTTP isteklerini 443 güvenli bağlantı noktasına 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.

Çözünürlük

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

Bunu, aşağıdaki seçeneklerden birini kullanarak yapabilirsiniz:

  • Edge kullanıcı arayüzü
  • Management 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 Protokoller'i yapılandırın. (Yalnızca gerekliyse)

Management API'si

Hedef sunucu yapılandırmasını güncelleme belgelerinde açıklandığı gibi, hedef sunucuyu yapılandırmak için Management API'yi kullanın.

Teşhis bilgileri toplanmalıdır

Yukarıdaki talimatları uyguladıktan sonra da sorun devam ederse aşağıdaki teşhis bilgilerini toplayıp 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'si adı
    • Hatayı yeniden oluşturmak için curl komutunu tamamlayın
    • İzleme aracı çıkışı (başarısız istek için yakalayabildiyseniz)
  2. Private Cloud kullanıcısıysanız aşağıdaki bilgileri sağlayın:
    • Tam hata mesajı gözlemlendi
    • Ortam adı
    • API proxy paketi
    • Hedef sunucu tanımı (uç noktanızda hedef sunucu kullanıyorsanız)
    • İzleme aracı çıkışı (başarısız istek için yakalayabildiyseniz)