Você está vendo a documentação do Apigee Edge.
Acesse a
documentação da Apigee X. informações
Sintoma
O aplicativo cliente recebe uma resposta HTTP 400 Bad Request
com a mensagem The plain HTTP request was sent to HTTPS port
.
Mensagem de erro
O aplicativo cliente recebe este código de resposta:
HTTP/1.1 400 Bad Request
Seguido pela página de erro HTML abaixo:
<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>
Causas possíveis
Causa | Descrição | Instruções de solução de problemas aplicáveis para |
---|---|---|
Solicitação HTTP para um host virtual configurado com TLS | O cliente envia uma solicitação HTTP para um host virtual configurado com TLS. | Usuários de nuvens públicas e privadas de borda |
Solicitação HTTP para um endpoint de destino configurado com TLS | Solicitação HTTP feita para um servidor de back-end com TLS ativado no endpoint de destino. | Usuários de nuvens públicas e privadas de borda |
Configuração incorreta do servidor de destino | O servidor de destino está configurado com a porta segura 443 , mas o SSL não está ativado. |
Usuários de nuvens públicas e privadas de borda |
Causa: solicitação HTTP para um host virtual configurado com TLS
Esse erro ocorre quando um cliente está tentando se conectar a uma API na Apigee e o host virtual mencionado está configurado para usar SSL e recebe uma solicitação HTTP.
Diagnóstico
Como esse problema ocorre no endpoint norte e as solicitações de API falham na interação do ponto de entrada entre o aplicativo cliente e o roteador, essas mensagens de erro não são incluídas nos registros de acesso do roteador NGINX. Portanto, essas solicitações não serão capturadas em ferramentas como o monitoramento de APIs e a ferramenta Trace.
-
Verifique sua solicitação de API e veja se você está fazendo uma solicitação HTTP para um alias de host configurado para aceitar solicitações somente na porta segura
443
. Se sim, essa é a causa do problema.Exemplo de solicitação de API incorreta:
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>
- No exemplo de solicitação acima, uma solicitação HTTP é feita para o alias de host
myorg-test.apigee.net
na porta segura443
. Essa é a causa do erro400 Bad Request
.
Resolução
Você precisa verificar se o cliente está usando HTTP em vez de HTTPs e fazer a solicitação correta, conforme mostrado abaixo:
Exemplo de solicitação de API:
curl https://org-test.apigee.net:443/400-demo
ou
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
Causa: solicitação HTTP para um endpoint de destino configurado por TLS
Esse erro ocorrerá se você tiver configurado incorretamente solicitações HTTP para um servidor de back-end ativado para TLS no endpoint de destino de um proxy de API.
Diagnóstico
Siga estas etapas para diagnosticar o erro usando a ferramenta de rastreamento:
- Ative o Trace na IU da Apigee para o proxy de API afetado.
- Fazer solicitações ao proxy da API.
- Selecione uma das solicitações de API que falharam com o código de resposta
400
. - Navegue pelas várias fases e determine onde a falha ocorreu.
-
Normalmente, você verá a resposta de erro
400
vindo do servidor de back-end. Ou seja, você vai receber a resposta de erro400
na fase Resposta recebida do servidor de destino, conforme mostrado abaixo: -
Determine o endpoint de destino para o qual a solicitação foi feita clicando no ícone AX (Analytics Data Recorded) no trace.
- Observe o target.url, que contém o protocolo, o alias de host do servidor de back-end e, às vezes, o número da porta. A porta usada para o URL de destino é
443
, mas o protocolo é HTTP. - Revise a definição do endpoint de destino para entender a configuração.
-
Verifique se o host do servidor de back-end é seguro e detecta em uma porta segura, como
443
. Se você usa o protocolo comohttp
no elemento<URL>
, essa é a causa do problema.Exemplo de configuração do endpoint de destino:
<?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>
O exemplo acima mostra que você está usando o protocolo HTTP, mas a porta usada é a porta segura
443
. Isso faz com que o servidor de back-end responda com400 Bad Request
e a mensagem de erroThe plain HTTP request was sent to HTTPS port
.
Resolução
-
Se o servidor de back-end for seguro/ativado para TLS, use o protocolo como
https
no elemento<URL>
do endpoint de destino, como mostrado no exemplo a seguir:Exemplo de configuração do endpoint de destino:
<HTTPTargetConnection> <Properties/> <URL>https://somehost.org:443/get</URL> </HTTPTargetConnection>
-
Se o servidor de back-end não for seguro, então:
- Não mencione o número da porta segura, como
443
. - Não é necessário mencionar o número da porta se o servidor de back-end detecta em uma porta não segura padrão.
- Mencione o número da porta se você estiver usando qualquer outra porta não segura, por exemplo:
9080
Exemplo de configuração do endpoint de destino:
<HTTPTargetConnection> <Properties/> <URL>http://somehost.org/get</URL> </HTTPTargetConnection> or <HTTPTargetConnection> <Properties/> <URL>http://somehost.org:9080/get</URL> </HTTPTargetConnection>
- Não mencione o número da porta segura, como
Causa: configuração incorreta do servidor de destino
Se o servidor de destino estiver configurado com uma porta segura, como 443
, sem ativar o SSL, ele fará com que o processador de mensagens do Apigee Edge envie solicitações HTTP para um servidor de destino seguro ou configurado com TLS, causando esse problema.
Diagnóstico
Siga estas etapas para diagnosticar o erro usando a ferramenta de rastreamento:
- Ative o Trace na IU da Apigee para o proxy de API afetado.
- Fazer solicitações ao proxy da API.
- Selecione uma das solicitações de API que apresentaram falha com o código de resposta
400
. - Navegue pelas várias fases e determine onde a falha ocorreu.
-
Normalmente, você vai ver a resposta de erro
400
vindo do servidor de back-end. Ou seja, você verá a resposta de erro400
na fase Resposta recebida do servidor de destino, conforme mostrado abaixo: -
Determine o endpoint de destino para o qual a solicitação foi feita clicando no ícone AX (Analytics Data Recorded) no trace.
-
Observe o target.name, que representa o nome do endpoint de destino.
No exemplo de arquivo de rastreamento acima, o target.name é default. Isso indica que o endpoint de destino usado para essa solicitação é padrão.
-
Revise a definição do endpoint de destino para entender a configuração.
Exemplo de configuração do endpoint de destino:
<?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>
O exemplo de configuração de endpoint de destino acima mostra que você está usando um servidor de destino chamado
faulty-target
. -
Quando você tiver o nome do servidor de destino, poderá usar um dos seguintes métodos para verificar a configuração dele:
- interface do Edge
- API Management
interface do Edge
- Navegue até Apigee Edge > Admin > Environments > Target Servers.
- Escolha o servidor de destino específico identificado no proxy de API e clique em Editar.
- Verifique a porta especificada para o servidor de destino e as informações de SSL.
-
Se o servidor de destino estiver configurado com uma porta segura (por exemplo:
443
), mas o SSL não estiver ativado, essa será a causa do problema.Como você pode ver na captura de tela acima, a porta usada é
443
, mas o SSL não está ativado para essa porta na configuração do servidor de destino. Isso faz com que o processador de mensagens do Apigee Edge envie solicitações HTTP para a porta segura443
. Portanto, você recebe o erro400 Bad Request
com a mensagemThe plain HTTP request was sent to HTTPS port
.
API Management
-
Execute a API Get target server para ver detalhes sobre a configuração específica do servidor de destino, conforme mostrado abaixo:
Usuário da nuvem pública:
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"
Usuário da nuvem privada:
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"
- Verifique a porta especificada para o servidor de destino e as informações de SSL.
-
Se o servidor de destino estiver configurado com uma porta segura (por exemplo:
443
), mas a seçãoSSLInfo
não estiver definida ou não estiver ativada, essa será a causa do problema.Exemplo de configuração do servidor de destino:
{ "host" : "somehost.org", "isEnabled" : true, "name" : "faulty-target", "port" : 443 }
No exemplo de saída acima, a porta usada para a conexão de destino é
443
, mas não há nenhum bloco de configuraçãoSSLInfo
.Isso faz com que o processador de mensagens do Apigee Edge envie solicitações HTTP para a porta segura
443
. Portanto, você recebe o erro400 Bad Request
com a mensagemThe plain HTTP request was sent to HTTPS port
.
Resolução
Se o servidor de destino for seguro ou configurado com TLS, será necessário ativar o SSL para o servidor de destino específico.
Para isso, use uma das seguintes opções:
- interface do Edge
- API Management
interface do Edge
- Navegue até o servidor de destino em IU de borda > Administrador > Ambientes > Servidores de destino.
- Escolha o servidor de destino específico e clique em Editar.
- Se o servidor de destino for seguro e usar uma porta como
443
, ative o SSL marcando a caixa de seleção ao lado da opção SSL. - Configure Truststore, Criptografias e Protocolos. (Apenas se necessário)
API Management
Use a API de gerenciamento para configurar o servidor de destino, conforme descrito no artigo Atualizar a configuração do servidor de destino.
É necessário coletar informações de diagnóstico
Se o problema persistir mesmo após seguir as instruções acima, colete as informações de diagnóstico a seguir e entre em contato com o suporte do Apigee Edge.
- Se você for usuário da nuvem pública, forneça as seguintes informações:
- Nome da organização
- Nome do ambiente
- Nome do proxy da API
- Concluir o comando curl para reproduzir o erro
- Saída da ferramenta de rastreamento (se você conseguiu capturar a solicitação com falha)
- Se você for usuário de uma nuvem privada, forneça as seguintes informações:
- Mensagem de erro completa observada
- Nome do ambiente
- Pacote de proxy de API
- Definição do servidor de destino (se você estiver usando o servidor de destino no endpoint)
- Saída da ferramenta de rastreamento (se você conseguiu capturar a solicitação com falha)