Przeglądasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X. Informacje
Krótki opis problemu
Aplikacja kliencka otrzymuje odpowiedź HTTP 400 Bad Request
z komunikatem The plain HTTP request was sent to HTTPS port
.
Komunikat o błędzie
Aplikacja kliencka pobiera ten kod odpowiedzi:
HTTP/1.1 400 Bad Request
Po tej stronie wyświetla się poniższa strona błędu HTML:
<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>
Możliwe przyczyny
Przyczyna | Opis | Instrukcje rozwiązywania problemów dotyczące |
---|---|---|
Żądanie HTTP do hosta wirtualnego skonfigurowanego w TLS | Klient wysyła żądanie HTTP do hosta wirtualnego skonfigurowanego TLS | Użytkownicy chmury publicznej i prywatnej usługi Edge |
Żądanie HTTP do docelowego punktu końcowego skonfigurowanego w TLS | Żądanie HTTP wysłane do serwera backendu z obsługą TLS w docelowym punkcie końcowym. | Użytkownicy chmury publicznej i prywatnej usługi Edge |
Nieprawidłowa konfiguracja serwera docelowego | Serwer docelowy jest skonfigurowany z bezpiecznym portem 443 , ale SSL nie jest włączone. |
Użytkownicy chmury publicznej i prywatnej usługi Edge |
Przyczyna: żądanie HTTP do hosta wirtualnego skonfigurowanego w TLS
Ten błąd występuje, gdy klient próbuje połączyć się z interfejsem API w Apigee, a wspomniany host wirtualny jest skonfigurowany do używania protokołu SSL i zamiast tego otrzymuje żądanie HTTP.
Diagnostyka
Ponieważ ten problem występuje w punkcie końcowym Northbound, a żądania do interfejsu API kończą się niepowodzeniem w trakcie interakcji między aplikacją kliencką a routerem, te komunikaty o błędach nie są logowane w logach dostępu do routera NGINX. Dlatego żądania te nie będą rejestrowane w narzędziach takich jak monitorowanie interfejsów API czy narzędzie do śledzenia.
-
Zweryfikuj żądanie do interfejsu API i sprawdź, czy wysyłasz żądanie HTTP dla aliasu hosta, który jest skonfigurowany tak, aby akceptować żądania tylko z bezpiecznego portu
443
. Jeśli tak, to ono jest przyczyną problemu.Przykładowe nieprawidłowe żądanie do interfejsu API:
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>
- W tym przykładowym żądaniu HTTP zostanie wysłane żądanie HTTP do aliasu hosta
myorg-test.apigee.net
na bezpiecznym porcie443
. To jest przyczyna błędu400 Bad Request
.
Rozdzielczość
Sprawdź, czy klient używa protokołu HTTP, a nie HTTP, i wyślij prawidłowe żądanie, jak pokazano poniżej:
Przykładowe żądanie do interfejsu API:
curl https://org-test.apigee.net:443/400-demo
lub
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
Przyczyna: żądanie HTTP do docelowego punktu końcowego skonfigurowanego na podstawie TLS
Ten błąd występuje, jeśli żądania HTTP są nieprawidłowo skonfigurowane do serwera backendu z obsługą TLS w docelowym punkcie końcowym serwera proxy interfejsu API.
Diagnostyka
Aby zdiagnozować błąd za pomocą narzędzia do śledzenia:
- Włącz Trace w interfejsie Apigee dla serwera proxy interfejsu API, którego dotyczy problem.
- Wysyłaj żądania do serwera proxy interfejsu API.
- Wybierz jedno z żądań do interfejsu API, które zakończyły się niepowodzeniem z użyciem kodu odpowiedzi
400
. - Przejdź przez różne fazy i ustal, gdzie wystąpił błąd.
-
Zazwyczaj odpowiedź o błędzie
400
jest wysyłana z serwera backendu. Oznacza to, że w etapie Odpowiedź otrzymana z serwera docelowego zobaczysz odpowiedź o błędzie400
, jak pokazano poniżej: -
Ustal docelowy punkt końcowy, do którego zgłoszono żądanie, klikając w logu czasu ikonę AX (rejestrowane dane Analytics).
- Zapisz wartość target.url, która zawiera protokół, alias hosta serwera backendu, a czasem numer portu. Port używany w docelowym adresie URL to
443
, ale protokół to HTTP. - Sprawdź definicję docelowego punktu końcowego, aby zrozumieć konfigurację.
-
Sprawdź, czy host serwera backendu jest bezpieczny i nasłuchuje na bezpiecznym porcie, takim jak
443
. Jeśli w elemencie<URL>
używasz protokołu jakohttp
, to jest przyczyną tego problemu.Przykładowa konfiguracja docelowego punktu końcowego:
<?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>
Powyższy przykład pokazuje, że używasz protokołu HTTP, ale użyty port to bezpieczny port
443
. Spowoduje to wysłanie odpowiedzi serwera backendu400 Bad Request
i komunikatu o błędzieThe plain HTTP request was sent to HTTPS port
.
Rozdzielczość
-
Jeśli Twój serwer backendu jest bezpieczny/włączony przez TLS, sprawdź, czy używasz protokołu jako
https
w elemencie<URL>
docelowego punktu końcowego, jak pokazano w poniższym przykładzie:Przykładowa konfiguracja docelowego punktu końcowego:
<HTTPTargetConnection> <Properties/> <URL>https://somehost.org:443/get</URL> </HTTPTargetConnection>
-
Jeśli serwer backendu jest niebezpieczny:
- Nie wspominaj o numerze bezpiecznego portu, np.
443
. - Jeśli serwer backendu nasłuchuje na standardowym niezabezpieczonym porcie, nie musisz podawać numeru portu.
- Podaj numer portu, jeśli używasz innego niezabezpieczonego portu, na przykład:
9080
Przykładowa konfiguracja docelowego punktu końcowego:
<HTTPTargetConnection> <Properties/> <URL>http://somehost.org/get</URL> </HTTPTargetConnection> or <HTTPTargetConnection> <Properties/> <URL>http://somehost.org:9080/get</URL> </HTTPTargetConnection>
- Nie wspominaj o numerze bezpiecznego portu, np.
Przyczyna: nieprawidłowa konfiguracja serwera docelowego
Jeśli serwer docelowy jest skonfigurowany z zabezpieczonym portem, na przykład 443
, bez włączania SSL, to powoduje, że procesor wiadomości Apigee Edge wysyła żądania HTTP do bezpiecznego serwera docelowego skonfigurowanego pod kątem protokołu TLS, co prowadzi do tego problemu.
Diagnostyka
Aby zdiagnozować błąd za pomocą narzędzia do śledzenia:
- Włącz Trace w interfejsie Apigee dla serwera proxy interfejsu API, którego dotyczy problem.
- Wysyłaj żądania do serwera proxy interfejsu API.
- Wybierz jedno z żądań do interfejsu API, które zakończyły się niepowodzeniem z użyciem kodu odpowiedzi
400
. - Przejdź przez różne fazy i ustal, gdzie wystąpił błąd.
-
Zazwyczaj wyświetla się
400
odpowiedź o błędzie z serwera backendu. Oznacza to, że w etapie Odpowiedź otrzymana z serwera docelowego zobaczysz odpowiedź o błędzie400
, jak pokazano poniżej: -
Ustal docelowy punkt końcowy, do którego zgłoszono żądanie, klikając w logu czasu ikonę AX (rejestrowane dane Analytics).
-
Zwróć uwagę na wartość target.name, która reprezentuje nazwę docelowego punktu końcowego.
W przykładowym pliku śledzenia powyżej pole target.name to default. Wskazuje on, że docelowy punkt końcowy używany dla tego żądania jest domyślny.
-
Sprawdź definicję docelowego punktu końcowego, aby zrozumieć konfigurację.
Przykładowa konfiguracja docelowego punktu końcowego:
<?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>
Powyższa przykładowa konfiguracja docelowego punktu końcowego pokazuje, że używasz serwera docelowego o nazwie
faulty-target
. -
Po ustaleniu nazwy serwera docelowego możesz użyć jednej z tych metod, aby sprawdzić konfigurację serwera docelowego:
- Interfejs Edge
- interfejs API zarządzania Google Analytics
Interfejs Edge
- Otwórz Apigee Edge > Administracja > Środowiska > Serwery docelowe.
- Wybierz konkretny serwer docelowy określony przez serwer proxy interfejsu API i kliknij Edytuj.
- Sprawdź port podany dla serwera docelowego i informacje SSL.
-
Jeśli serwer docelowy jest skonfigurowany z bezpiecznym portem (np.
443
), ale protokół SSL nie jest włączony, to jest przyczyną tego problemu.Jak widać na zrzucie ekranu powyżej, używany port to
443
, ale w konfiguracji serwera docelowego nie włączono SSL dla tego portu. Powoduje to, że procesor wiadomości w Apigee Edge wysyła żądania HTTP do bezpiecznego portu443
. Dlatego pojawia się błąd400 Bad Request
z komunikatemThe plain HTTP request was sent to HTTPS port
.
interfejs API zarządzania Google Analytics
-
Uruchom interfejs API pobierania serwera docelowego, aby uzyskać szczegółowe informacje o konkretnej konfiguracji serwera docelowego, jak pokazano poniżej:
Użytkownik chmury publicznej:
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"
Użytkownik 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"
- Sprawdź port podany dla serwera docelowego i informacje SSL.
-
Jeśli serwer docelowy jest skonfigurowany z bezpiecznym portem (np.
443
), ale sekcjaSSLInfo
nie jest zdefiniowana lub jest wyłączona, to jest przyczyną tego problemu.Przykładowa konfiguracja serwera docelowego:
{ "host" : "somehost.org", "isEnabled" : true, "name" : "faulty-target", "port" : 443 }
W przykładowych danych wyjściowych powyżej widać, że port używany na potrzeby połączenia docelowego to
443
, ale nie ma bloku konfiguracjiSSLInfo
.Powoduje to, że procesor wiadomości w Apigee Edge wysyła żądania HTTP do bezpiecznego portu
443
. Dlatego pojawia się błąd400 Bad Request
z komunikatemThe plain HTTP request was sent to HTTPS port
.
Rozdzielczość
Jeśli serwer docelowy jest bezpieczny lub ma skonfigurowany protokół TLS, musisz włączyć SSL dla konkretnego serwera docelowego.
W tym celu użyj jednej z następujących opcji:
- Interfejs Edge
- interfejs API zarządzania Google Analytics
Interfejs Edge
- Otwórz serwer docelowy w sekcji Interfejs użytkownika Edge > Administracja > Środowiska > Serwery docelowe.
- Wybierz konkretny serwer docelowy i kliknij Edytuj.
- Jeśli serwer docelowy jest bezpieczny i używa portu takiego jak
443
, włącz SSL, zaznaczając pole wyboru obok opcji SSL. - Skonfiguruj Truststore, Ciphery i protokoły. (Tylko wtedy, gdy jest wymagane)
interfejs API zarządzania Google Analytics
Skonfiguruj serwer docelowy za pomocą interfejsu API zarządzania zgodnie z opisem w dokumentacji aktualizowania konfiguracji serwera docelowego.
Musisz zebrać informacje diagnostyczne
Jeśli problem nie ustąpi mimo wykonania powyższych instrukcji, zbierz poniższe informacje diagnostyczne i skontaktuj się z zespołem pomocy Apigee Edge.
- Jeśli jesteś użytkownikiem chmury publicznej, podaj te informacje:
- Nazwa organizacji
- Nazwa środowiska
- Nazwa serwera proxy interfejsu API
- Wykonaj polecenie curl, aby odtworzyć błąd
- Dane wyjściowe narzędzia do śledzenia (jeśli udało Ci się przechwycić nieudane żądanie)
- Jeśli jesteś użytkownikiem Private Cloud, podaj te informacje:
- Zaobserwowano pełny komunikat o błędzie
- Nazwa środowiska
- Pakiet proxy interfejsu API
- Definicja serwera docelowego (jeśli w punkcie końcowym używasz serwera docelowego)
- Dane wyjściowe narzędzia do śledzenia (jeśli udało Ci się przechwycić nieudane żądanie)