Przeglądasz dokumentację Apigee Edge.
Przejdź do
Dokumentacja 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 otrzymuje ten kod odpowiedzi:
HTTP/1.1 400 Bad Request
A następnie 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 przez TLS | Klient wysyła żądanie HTTP do hosta wirtualnego skonfigurowanego przez TLS | Użytkownicy chmury publicznej i prywatnej Edge |
Żądanie HTTP do docelowego punktu końcowego skonfigurowanego przez TLS | Żądanie HTTP wysłane do serwera backendu z włączonym protokołem TLS w docelowym punkcie końcowym. | Użytkownicy chmury publicznej i prywatnej Edge |
Nieprawidłowa konfiguracja serwera docelowego | Serwer docelowy jest skonfigurowany z bezpiecznym portem 443 , ale SSL nie jest włączony. |
Użytkownicy chmury publicznej i prywatnej Edge |
Przyczyna: żądanie HTTP do hosta wirtualnego skonfigurowanego przez TLS
Ten błąd występuje, gdy klient próbuje połączyć się z interfejsem API w Apigee, gdy host wirtualny jest skonfigurowany pod kątem używania protokołu SSL i otrzymuje żądanie HTTP.
Diagnostyka
Ten problem występuje w W kierunku północnym punkt końcowy i żądania API kończą się niepowodzeniem na interakcji z punktem wejścia między aplikacji klienckiej i routera, te komunikaty o błędach nie są rejestrowane w routerze NGINX dzienników dostępu. W związku z tym żądania te nie będą rejestrowane w narzędziach takich jak API Monitoring czy w narzędziu śledzenia.
-
Potwierdź żądanie do interfejsu API i sprawdź, czy wysyłasz żądanie HTTP dla aliasu hosta, skonfigurowano do akceptowania żądań tylko na bezpiecznym porcie
443
. Jeśli tak, i to jest przyczyna problemu.Przykład nieprawidłowego żądania 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 jest wysyłane do aliasu hosta
myorg-test.apigee.net
na bezpiecznym porcie443
. To jest przyczyna400 Bad Request
błąd.
Rozdzielczość
Sprawdź, czy klient używa protokołu HTTP, a nie HTTP, i wyślij prawidłowe żądanie: 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 przez TLS
Ten błąd występuje, jeśli żądania HTTP zostały nieprawidłowo skonfigurowane do backendu z włączonym protokołem TLS serwer w docelowym punkcie końcowym serwera proxy interfejsu API.
Diagnostyka
Aby zdiagnozować błąd za pomocą narzędzia śledzenia, wykonaj te czynności:
- 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 kodem odpowiedzi
400
. - Przejdź przez różne fazy i określ, gdzie wystąpił błąd.
-
Zwykle odpowiedź o błędzie
400
pochodzi z serwera backendu. Oznacza to, że w fazie Otrzymanie odpowiedzi pojawi się błąd400
z serwera docelowego, jak poniżej: -
Aby określić docelowy punkt końcowy, do którego przesłano żądanie, kliknij AX. (Analytics Data Recorded) w śladzie.
- Zapisz parametr target.url, który zawiera protokół, alias hosta serwera backendu
a czasem też numer portu. Port używany do
docelowy adres URL to
443
, ale protokół to HTTP. - Aby zrozumieć konfigurację, sprawdź definicję docelowego punktu końcowego.
-
Sprawdź, czy host serwera backendu jest bezpieczny i nasłuchuje na bezpiecznym porcie, takim jak
443
. Jeśli używasz protokołu jakohttp
w elemencie<URL>
, i to jest przyczyną 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>
Przykład powyżej pokazuje, że używasz protokołu HTTP, ale używany port jest bezpieczny. port
443
. Dzięki temu serwer backendu w odpowiedzi przesyła400 Bad Request
i komunikat o błędzieThe plain HTTP request was sent to HTTPS port
Rozdzielczość
-
Jeśli Twój serwer backendu jest zabezpieczony/włączony TLS, sprawdź, czy używasz protokołu
https
w elemencie<URL>
docelowego punktu końcowego, jak pokazano na następujący przykład:Przykładowa konfiguracja docelowego punktu końcowego:
<HTTPTargetConnection> <Properties/> <URL>https://somehost.org:443/get</URL> </HTTPTargetConnection>
-
Jeśli serwer backendu jest niezabezpieczony:
- Nie wspominaj o numerze bezpiecznego portu, np.
443
. - Nie musisz wcale podawać numeru portu, jeśli serwer backendu nasłuchuje standardowy, niebezpieczny port
- Podaj numer portu, jeśli korzystasz z 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 bezpiecznym portem, takim jak 443
, bez włączania
SSL, to sprawia, że procesor komunikatów Apigee Edge wysyła żądania HTTP do bezpiecznego lub
Serwer docelowy skonfigurowany jako TLS, który prowadzi do tego problemu.
Diagnostyka
Aby zdiagnozować błąd za pomocą narzędzia śledzenia, wykonaj te czynności:
- 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 kodem odpowiedzi
400
. - Przejdź przez różne fazy i określ, gdzie wystąpił błąd.
-
Zwykle zwracana jest odpowiedź o błędzie
400
z serwera backendu. Oznacza to, że na etapie Otrzymanie odpowiedzi pojawi się błąd400
z serwera docelowego, jak poniżej: -
Aby określić docelowy punkt końcowy, do którego przesłano żądanie, kliknij AX. (Analytics Data Recorded) w śladzie.
-
Zapisz wartość target.name, która reprezentuje nazwę docelowego punktu końcowego.
W powyższym przykładowym pliku śledzenia parametr target.name to default. Oznacza to, że docelowy punkt końcowy używany w tym żądaniu jest domyślny.
-
Aby zrozumieć konfigurację, sprawdź definicję docelowego punktu końcowego.
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 określeniu nazwy serwera docelowego możesz użyć jednej z poniższych metod, aby: Sprawdź konfigurację serwera docelowego:
- Interfejs Edge
- interfejs API zarządzania Google Analytics
Interfejs Edge
- Przejdź do Apigee Edge > Administracja > Środowiska > Serwery docelowe.
- Wybierz konkretny serwer docelowy określony przez serwer proxy interfejsu API i kliknij Edytuj.
- Sprawdź port określony dla serwera docelowego i informacje o protokole SSL.
-
Jeśli serwer docelowy jest skonfigurowany z bezpiecznym portem (na przykład:
443
): ale protokół SSL nie jest włączony, to właśnie jest przyczyną problemu.Jak widać na zrzucie ekranu powyżej, używany port to
443
, ale protokół SSL nie jest włączone dla tego portu w konfiguracji serwera docelowego. Spowoduje to wyświetlenie komunikatu Apigee Edge Procesor wysyłający żądania HTTP do bezpiecznego portu443
. W związku z tym uzyskasz błąd400 Bad Request
z komunikatemThe plain HTTP request was sent to HTTPS port
.
interfejs API zarządzania Google Analytics
-
Wykonaj Pobierz interfejs API serwera docelowego, aby uzyskać szczegółowe informacje o konkretnej konfiguracji serwera docelowego. jak poniżej:
Użytkownik Public Cloud:
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 określony dla serwera docelowego i informacje o protokole SSL.
-
Jeśli serwer docelowy jest skonfigurowany z bezpiecznym portem (na przykład:
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 powyższych przykładowych danych wyjściowych widać, że port połączenia docelowego to
443
, ale nie ma bloku konfiguracjiSSLInfo
.Spowoduje to, że procesor wiadomości Apigee Edge będzie 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 Twój serwer docelowy jest zabezpieczony lub skonfigurowany pod kątem TLS, musisz włączyć SSL dla określonego serwera serwera docelowego.
Aby to zrobić, użyj jednej z tych opcji:
- Interfejs Edge
- interfejs API zarządzania Google Analytics
Interfejs Edge
- Przejdź do serwera docelowego w interfejsie brzegowym 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 w zaznacz pole wyboru obok opcji SSL. - Skonfiguruj Truststore, Ciphers i Protokoły. (tylko jeśli wymagane)
interfejs API zarządzania Google Analytics
Skonfiguruj serwer docelowy przy użyciu interfejsu API zarządzania zgodnie z opisem w Zaktualizuj dokumentację konfiguracji serwera docelowego.
Musi zbierać informacje diagnostyczne
Jeśli po wykonaniu powyższych czynności problem nie ustąpi, zwróć uwagę na informacje diagnostyczne, a następnie skontaktuj się z zespołem pomocy Apigee Edge.
- Jeśli jesteś użytkownikiem Public Cloud, 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ć dane dla nieudanego żądania)
- Jeśli jesteś użytkownikiem Private Cloud, podaj te informacje:
- Zaobserwowano pełny komunikat o błędzie
- Nazwa środowiska
- Pakiet serwerów 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ć dane dla nieudanego żądania)