400 잘못된 요청 - 일반 HTTP 요청이 HTTPS 포트로 전송됨

현재 Apigee Edge 문서가 표시되고 있습니다.
Apigee X 문서로 이동
정보

증상

클라이언트 애플리케이션은 The plain HTTP request was sent to HTTPS port 메시지가 포함된 HTTP 400 Bad Request 응답을 수신합니다.

오류 메시지

클라이언트 애플리케이션은 다음과 같은 응답 코드를 가져옵니다.

HTTP/1.1 400 Bad Request

그 다음에 아래 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>

가능한 원인

원인 설명 다음에 관한 문제 해결 안내
TLS로 구성된 가상 호스트에 대한 HTTP 요청 클라이언트가 TLS로 구성된 가상 호스트에 HTTP 요청을 전송합니다. Edge 퍼블릭 및 프라이빗 클라우드 사용자
TLS로 구성된 대상 엔드포인트에 대한 HTTP 요청 대상 엔드포인트의 TLS 지원 백엔드 서버에 전송된 HTTP 요청입니다. Edge 퍼블릭 및 프라이빗 클라우드 사용자
잘못된 대상 서버 구성 대상 서버가 보안 포트 443으로 구성되어 있지만 SSL이 사용 설정되지 않았습니다. Edge 퍼블릭 및 프라이빗 클라우드 사용자

원인: TLS로 구성된 가상 호스트에 대한 HTTP 요청

이 오류는 클라이언트가 Apigee에서 API에 연결하려고 할 때 언급된 가상 호스트가 SSL을 사용하도록 구성되어 있고 대신 HTTP 요청을 수신할 때 발생합니다.

진단

이 문제는 Northbound 엔드포인트에서 발생하고, API 요청은 클라이언트 애플리케이션과 라우터 간의 진입점 상호작용에서 실패하므로 NGINX 라우터 액세스 로그에 기록되지 않습니다. 따라서 이러한 요청은 API 모니터링 및 Trace 도구와 같은 도구에서는 캡처되지 않습니다.

  1. API 요청을 확인하고 보안 포트 443에서만 요청을 수락하도록 구성된 호스트 별칭에 대해 HTTP 요청을 하고 있는지 확인합니다. 그렇다면 이것이 문제의 원인입니다.

    잘못된 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>
    
  2. 위의 샘플 요청에서 HTTP 요청은 보안 포트 443의 호스트 별칭 myorg-test.apigee.net에 전송됩니다. 400 Bad Request 오류의 원인입니다.

해상도

클라이언트가 HTTPS 대신 HTTP를 사용하는지 확인하고 아래와 같이 올바른 요청을 해야 합니다.

샘플 API 요청:

curl https://org-test.apigee.net:443/400-demo

또는

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

원인: TLS로 구성된 대상 엔드포인트에 HTTP 요청

이 오류는 API 프록시의 대상 엔드포인트에서 TLS 지원 백엔드 서버에 대한 HTTP 요청을 잘못 구성한 경우에 발생합니다.

진단

Trace 도구를 사용하여 오류를 진단하려면 다음 단계를 따르세요.

  1. Apigee UI에서 영향을 받는 API 프록시에 대해 Trace를 사용 설정합니다.
  2. API 프록시에 요청합니다.
  3. 400 응답 코드로 실패한 API 요청 중 하나를 선택합니다.
  4. 다양한 단계를 살펴보고 오류가 발생한 위치를 확인합니다.
  5. 일반적으로 백엔드 서버에서 400 오류 응답이 표시됩니다. 즉, 아래와 같이 응답이 대상 서버에서 수신된 응답 단계에 400 오류 응답이 표시됩니다.

  6. trace에서 AX(애널리틱스 데이터 기록됨) 아이콘을 클릭하여 요청이 이루어진 대상 엔드포인트를 확인합니다.

  7. target.url을 확인합니다. 여기에는 프로토콜, 백엔드 서버 호스트 별칭 및 포트 번호가 포함됩니다. 대상 URL에 사용되는 포트는 443이지만 프로토콜은 HTTP입니다.
  8. 대상 엔드포인트의 정의를 검토하여 구성을 파악하세요.
  9. 백엔드 서버 호스트가 안전하고 443과 같은 보안 포트에서 리슨하는지 확인합니다. <URL> 요소에서 http로 프로토콜을 사용하는 경우 이로 인해 문제가 발생합니다.

    샘플 대상 엔드포인트 구성:

    <?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>
    

    위의 예시에서는 HTTP 프로토콜을 사용하지만 사용된 포트는 보안 포트 443임을 보여줍니다. 이렇게 하면 백엔드 서버가 400 Bad Request 및 오류 메시지 The plain HTTP request was sent to HTTPS port로 응답합니다.

해상도

  1. 백엔드 서버가 보안/TLS를 사용 설정한 경우 다음 예와 같이 대상 엔드포인트의 <URL> 요소에서 https로 프로토콜을 사용해야 합니다.

    샘플 대상 엔드포인트 구성:

    <HTTPTargetConnection>
        <Properties/>
        <URL>https://somehost.org:443/get</URL>
    </HTTPTargetConnection>
    
  2. 백엔드 서버가 안전하지 않은 경우:

    • 443과 같은 보안 포트 번호는 언급하지 마세요.
    • 백엔드 서버가 비보안 표준 포트에서 수신 대기하는 경우 포트 번호를 언급할 필요가 없습니다.
    • 보안되지 않은 다른 포트를 사용하는 경우 포트 번호를 언급합니다. 예: 9080

    샘플 대상 엔드포인트 구성:

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

원인: 잘못된 대상 서버 구성

대상 서버가 SSL을 사용 설정하지 않고 443와 같은 보안 포트로 구성된 경우 Apigee Edge의 메시지 프로세서가 보안 또는 TLS로 구성된 대상 서버로 HTTP 요청을 보내서 이 문제를 일으킵니다.

진단

Trace 도구를 사용하여 오류를 진단하려면 다음 단계를 따르세요.

  1. Apigee UI에서 영향을 받는 API 프록시에 대해 Trace를 사용 설정합니다.
  2. API 프록시에 요청합니다.
  3. 400 응답 코드로 실패한 API 요청 중 하나를 선택합니다.
  4. 다양한 단계를 살펴보고 오류가 발생한 위치를 확인합니다.
  5. 일반적으로 백엔드 서버에서 400 오류 응답이 수신됩니다. 즉, 아래와 같이 응답이 대상 서버에서 수신됨 단계에 400 오류 응답이 표시됩니다.

  6. trace에서 AX(애널리틱스 데이터 기록됨) 아이콘을 클릭하여 요청이 이루어진 대상 엔드포인트를 확인합니다.

  7. target.name은 대상 엔드포인트 이름을 나타냅니다.

    위의 트레이스 파일 예에서 target.namedefault입니다. 이 요청에 사용되는 대상 엔드포인트가 기본값임을 나타냅니다.

  8. 대상 엔드포인트의 정의를 검토하여 구성을 파악하세요.

    샘플 대상 엔드포인트 구성:

    <?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>
    

    위의 샘플 대상 엔드포인트 구성은 faulty-target이라는 대상 서버를 사용 중임을 보여줍니다.

  9. 대상 서버 이름이 있으면 다음 방법 중 하나를 사용하여 대상 서버 구성을 확인할 수 있습니다.

    • Edge UI
    • Management API

Edge UI

  1. Apigee Edge > 관리 > 환경 > 대상 서버로 이동합니다.
  2. API 프록시에서 식별된 특정 대상 서버를 선택하고 수정을 클릭합니다.
  3. 대상 서버에 지정된 포트와 SSL 정보를 확인합니다.
  4. 대상 서버가 보안 포트로 구성되어 있지만 (예: 443) SSL이 사용 설정되지 않은 경우, 이로 인해 이 문제가 발생합니다.

    위 스크린샷에서 볼 수 있듯이 사용된 포트는 443이지만 대상 서버 구성에서 해당 포트에 대해 SSL이 사용 설정되지 않았습니다. 이렇게 하면 Apigee Edge의 메시지 프로세서가 보안 포트 443으로 HTTP 요청을 전송합니다. 따라서 The plain HTTP request was sent to HTTPS port 메시지와 함께 400 Bad Request 오류가 발생합니다.

Management API

  1. 아래와 같이 Get target server API를 실행하여 특정 대상 서버 구성에 대한 세부정보를 가져옵니다.

    퍼블릭 클라우드 사용자:

    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 사용자:

    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. 대상 서버에 지정된 포트와 SSL 정보를 확인합니다.
  3. 대상 서버가 보안 포트로 구성되었지만 (예: 443) SSLInfo 섹션이 정의되지 않았거나 사용 설정되지 않은 경우, 이로 인해 이 문제가 발생합니다.

    샘플 대상 서버 구성:

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

    위의 샘플 출력에서 대상 연결에 사용되는 포트가 443이지만 SSLInfo 구성 블록이 없음을 알 수 있습니다.

    이렇게 하면 Apigee Edge의 메시지 프로세서가 보안 포트 443으로 HTTP 요청을 보냅니다. 따라서 The plain HTTP request was sent to HTTPS port 메시지와 함께 400 Bad Request 오류가 발생합니다.

해상도

대상 서버가 보안되거나 TLS로 구성된 경우 특정 대상 서버에 SSL을 사용 설정해야 합니다.

다음 옵션 중 하나를 사용하면 됩니다.

  • Edge UI
  • Management API

Edge UI

  1. Edge UI > 관리 > 환경 > 대상 서버에서 대상 서버로 이동합니다.
  2. 특정 대상 서버를 선택하고 Edit(수정)을 클릭합니다.
  3. 대상 서버가 안전하고 443과 같은 포트를 사용하는 경우 SSL 옵션 옆의 체크박스를 선택하여 SSL을 사용 설정하세요.
  4. Truststore, Ciphers, 프로토콜을 구성합니다. (필요한 경우에만)

Management API

관리 API를 사용하여 대상 서버 구성 업데이트 문서에 설명된 대로 대상 서버를 구성합니다.

진단 정보 수집 필요

위의 안내를 따른 후에도 문제가 지속되면 다음 진단 정보를 수집한 다음 Apigee Edge 지원팀에 문의하세요.

  1. Public Cloud 사용자인 경우 다음 정보를 제공합니다.
    • 조직 이름
    • 환경 이름
    • API 프록시 이름
    • curl 명령어를 완료하여 오류를 재현하세요.
    • 추적 도구 출력 (실패한 요청을 캡처할 수 있는 경우)
  2. Private Cloud 사용자인 경우 다음 정보를 제공합니다.
    • 전체 오류 메시지가 관찰됨
    • 환경 이름
    • API 프록시 번들
    • 대상 서버 정의 (엔드포인트에서 대상 서버를 사용하는 경우)
    • 추적 도구 출력 (실패한 요청을 캡처할 수 있는 경우)