Sie sehen die Dokumentation zu Apigee Edge.
Zur Apigee X-Dokumentation weitere Informationen
Symptom
Die Clientanwendung empfängt eine HTTP 400 Bad Request
-Antwort mit der Nachricht The plain HTTP request was sent to HTTPS port
.
Fehlermeldung
Die Clientanwendung erhält den folgenden Antwortcode:
HTTP/1.1 400 Bad Request
Darauf folgt die folgende HTML-Fehlerseite:
<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>
Mögliche Ursachen
Ursache | Beschreibung | Anleitungen zur Fehlerbehebung gelten für |
---|---|---|
HTTP-Anfrage an einen mit TLS konfigurierten virtuellen Host | Der Client sendet eine HTTP-Anfrage an einen mit TLS konfigurierten virtuellen Host | Nutzer von Edge Public und Private Cloud |
HTTP-Anfrage an einen TLS-konfigurierten Zielendpunkt | HTTP-Anfrage an einen TLS-fähigen Back-End-Server im Zielendpunkt. | Nutzer von Edge Public und Private Cloud |
Falsche Zielserverkonfiguration | Der Zielserver ist mit dem sicheren Port 443 konfiguriert, aber SSL ist nicht aktiviert. |
Nutzer von Edge Public und Private Cloud |
Ursache: HTTP-Anfrage an einen mit TLS konfigurierten virtuellen Host
Dieser Fehler tritt auf, wenn ein Client versucht, eine Verbindung zu einer API in Apigee herzustellen, und der erwähnte virtuelle Host für die Verwendung von SSL konfiguriert ist und stattdessen eine HTTP-Anfrage empfängt.
Diagnose
Da dieses Problem am Endpunkt Northbound auftritt und die API-Anfragen an der Interaktion des Einstiegspunkts zwischen der Clientanwendung und dem Router fehlschlagen, werden diese Fehlermeldungen nicht in den NGINX-Routerzugriffslogs protokolliert. Daher werden diese Anfragen nicht in Tools wie API-Monitoring und Trace erfasst.
-
Prüfen Sie Ihre API-Anfrage und prüfen Sie, ob Sie eine HTTP-Anfrage für einen Hostalias senden, der so konfiguriert ist, dass nur Anfragen über den sicheren Port
443
akzeptiert werden. Wenn ja, ist das die Ursache des Problems.Beispiel für eine falsche API-Anfrage:
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>
- Beachten Sie in der obigen Beispielanfrage, dass eine HTTP-Anfrage an den Hostalias
myorg-test.apigee.net
über den sicheren Port443
gesendet wird. Das ist die Ursache des Fehlers400 Bad Request
.
Auflösung
Du musst prüfen, ob der Client HTTP anstelle von HTTPS verwendet, und die richtige Anfrage wie unten gezeigt senden:
Beispiel für eine API-Anfrage:
curl https://org-test.apigee.net:443/400-demo
oder
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
Ursache: HTTP-Anfrage an einen TLS-konfigurierten Zielendpunkt
Dieser Fehler tritt auf, wenn Sie HTTP-Anfragen an einen TLS-fähigen Back-End-Server im Zielendpunkt eines API-Proxys falsch konfiguriert haben.
Diagnose
Führen Sie die folgenden Schritte aus, um den Fehler mit dem Trace-Tool zu diagnostizieren:
- Aktivieren Sie Trace in der Apigee-UI für den betroffenen API-Proxy.
- Stellen Sie Anfragen an den API-Proxy.
- Wählen Sie eine fehlgeschlagene API-Anfrage mit dem Antwortcode
400
aus. - Die verschiedenen Phasen durchgehen und herausfinden, wo der Fehler aufgetreten ist
-
In der Regel sehen Sie die Fehlerantwort
400
vom Back-End-Server. Das heißt, Sie sehen die Fehlerantwort400
in der Phase Antwort vom Zielserver erhalten, wie unten dargestellt: -
Bestimmen Sie den Zielendpunkt, für den die Anfrage gestellt wurde, indem Sie im Trace auf das Symbol AX (aufgezeichnete Analytics-Daten) klicken.
- Beachten Sie die target.url, die das Protokoll, den Host-Alias des Back-End-Servers und manchmal die Portnummer enthält. Der für die Ziel-URL verwendete Port ist
443
, das Protokoll ist jedoch HTTP. - Sehen Sie sich die Definition des Zielendpunkts an, um die Konfiguration zu verstehen.
-
Prüfen Sie, ob der Back-End-Serverhost sicher ist und einen sicheren Port wie
443
überwacht. Wenn Sie das Protokoll alshttp
im Element<URL>
verwenden, ist das die Ursache des Problems.Beispiel für eine Zielendpunktkonfiguration:
<?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>
Das obige Beispiel zeigt, dass Sie das HTTP-Protokoll verwenden, aber der verwendete Port der sichere Port
443
ist. Dies führt dazu, dass der Back-End-Server mit400 Bad Request
und der FehlermeldungThe plain HTTP request was sent to HTTPS port
antwortet.
Auflösung
-
Wenn dein Back-End-Server sicher/TLS-fähig ist, musst du das Protokoll als
https
im Element<URL>
des Zielendpunkts verwenden, wie im folgenden Beispiel gezeigt:Beispiel für eine Zielendpunktkonfiguration:
<HTTPTargetConnection> <Properties/> <URL>https://somehost.org:443/get</URL> </HTTPTargetConnection>
-
Wenn Ihr Back-End-Server nicht sicher ist, dann gilt:
- Erwähnen Sie nicht die Nummer des sicheren Ports wie
443
. - Sie müssen die Portnummer gar nicht angeben, wenn Ihr Back-End-Server einen nicht sicheren Standardport überwacht.
- Geben Sie die Portnummer an, wenn Sie einen anderen nicht sicheren Port verwenden, z. B.
9080
Beispiel für eine Zielendpunktkonfiguration:
<HTTPTargetConnection> <Properties/> <URL>http://somehost.org/get</URL> </HTTPTargetConnection> or <HTTPTargetConnection> <Properties/> <URL>http://somehost.org:9080/get</URL> </HTTPTargetConnection>
- Erwähnen Sie nicht die Nummer des sicheren Ports wie
Ursache: Falsche Zielserverkonfiguration
Wenn der Zielserver mit einem sicheren Port wie 443
konfiguriert ist, ohne SSL zu aktivieren, sendet der Message Processor von Apigee Edge HTTP-Anfragen an einen sicheren oder TLS-konfigurierten Zielserver, was zu diesem Problem führt.
Diagnose
Führen Sie die folgenden Schritte aus, um den Fehler mit dem Trace-Tool zu diagnostizieren:
- Aktivieren Sie Trace in der Apigee-UI für den betroffenen API-Proxy.
- Stellen Sie Anfragen an den API-Proxy.
- Wählen Sie eine der fehlgeschlagenen API-Anfragen mit dem Antwortcode
400
aus. - Die verschiedenen Phasen durchgehen und herausfinden, wo der Fehler aufgetreten ist
-
In der Regel sehen Sie die Fehlerantwort
400
vom Back-End-Server. Das heißt, Sie sehen die Fehlerantwort400
in der Phase Antwort vom Zielserver erhalten, wie unten dargestellt: -
Bestimmen Sie den Zielendpunkt, für den die Anfrage gestellt wurde, indem Sie im Trace auf das Symbol AX (aufgezeichnete Analytics-Daten) klicken.
-
Beachten Sie die Datei target.name, die für den Namen des Zielendpunkts steht.
Im obigen Beispiel für die Trace-Datei lautet der target.name default. Dies gibt an, dass der für diese Anfrage verwendete Zielendpunkt der Standardendpunkt ist.
-
Sehen Sie sich die Definition des Zielendpunkts an, um die Konfiguration zu verstehen.
Beispiel für eine Zielendpunktkonfiguration:
<?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>
Die obige Beispielkonfiguration für den Zielendpunkt zeigt, dass Sie einen Zielserver mit dem Namen
faulty-target
verwenden. -
Sobald Sie den Namen des Zielservers kennen, können Sie die Konfiguration des Zielservers mit einer der folgenden Methoden prüfen:
- Edge-Benutzeroberfläche
- Management API
Edge-Benutzeroberfläche
- Gehen Sie zu Apigee Edge > Admin > Environments > Target Servers (Apigee Edge > Admin > Umgebungen > Zielserver).
- Wählen Sie den vom API-Proxy identifizierten Zielserver aus und klicken Sie auf Bearbeiten.
- Prüfen Sie den für den Zielserver angegebenen Port und die SSL-Informationen.
-
Wenn der Zielserver mit einem sicheren Port konfiguriert ist (z. B.
443
), aber SSL nicht aktiviert ist, ist das die Ursache für das Problem.Wie Sie im Screenshot oben sehen können, wird als Port
443
verwendet, aber SSL ist in der Zielserverkonfiguration für diesen Port nicht aktiviert. Dadurch sendet der Message Processor von Apigee Edge HTTP-Anfragen an den sicheren Port443
. Daher wird der Fehler400 Bad Request
mit der MeldungThe plain HTTP request was sent to HTTPS port
angezeigt.
Management API
-
Führen Sie die Get target server API aus, um die Details zur spezifischen Zielserverkonfiguration abzurufen, wie unten gezeigt:
Public Cloud-Nutzer:
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-Nutzer:
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"
- Prüfen Sie den für den Zielserver angegebenen Port und die SSL-Informationen.
-
Wenn der Zielserver mit einem sicheren Port konfiguriert ist (z. B.
443
), aber der AbschnittSSLInfo
nicht definiert oder aktiviert ist, ist das die Ursache für dieses Problem.Beispiel für eine Zielserverkonfiguration:
{ "host" : "somehost.org", "isEnabled" : true, "name" : "faulty-target", "port" : 443 }
In der obigen Beispielausgabe sehen wir, dass der für die Zielverbindung verwendete Port
443
ist, aber es gibt keinenSSLInfo
-Konfigurationsblock.Dadurch sendet der Message Processor von Apigee Edge HTTP-Anfragen an den sicheren Port
443
. Daher wird der Fehler400 Bad Request
mit der MeldungThe plain HTTP request was sent to HTTPS port
angezeigt.
Auflösung
Wenn Ihr Zielserver sicher oder TLS-konfiguriert ist, müssen Sie SSL für den spezifischen Zielserver aktivieren.
Dazu stehen Ihnen folgende Optionen zur Verfügung:
- Edge-Benutzeroberfläche
- Management API
Edge-Benutzeroberfläche
- Rufen Sie den Zielserver unter Edge-UI > Admin > Umgebungen > Zielserver auf.
- Wählen Sie den gewünschten Zielserver aus und klicken Sie auf Bearbeiten.
- Wenn Ihr Zielserver sicher ist und einen Port wie
443
verwendet, aktivieren Sie SSL, indem Sie das Kästchen neben der SSL-Option anklicken. - Konfigurieren Sie Truststore, Ciphers und Protokolle. (Nur falls erforderlich)
Management API
Verwenden Sie die Management API, um den Zielserver zu konfigurieren, wie in der Dokumentation Zielserverkonfiguration aktualisieren beschrieben.
Erfassen von Diagnoseinformationen erforderlich
Wenn das Problem auch nach Befolgen der obigen Anleitung weiterhin besteht, stellen Sie die folgenden Diagnoseinformationen zusammen und wenden Sie sich an den Apigee Edge-Support.
- Wenn Sie die öffentliche Cloud nutzen, geben Sie die folgenden Informationen an:
- Name der Organisation
- Name der Umgebung
- Name des API-Proxys
- Führen Sie den curl-Befehl aus, um den Fehler zu reproduzieren
- Trace-Tool-Ausgabe (wenn Sie die fehlgeschlagene Anfrage erfassen konnten)
- Wenn Sie die Private Cloud nutzen, geben Sie die folgenden Informationen an:
- Vollständige Fehlermeldung festgestellt
- Name der Umgebung
- API-Proxy-Bundle
- Zielserverdefinition (wenn Sie auf Ihrem Endpunkt einen Zielserver verwenden)
- Trace-Tool-Ausgabe (wenn Sie die fehlgeschlagene Anfrage erfassen konnten)