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

<ph type="x-smartling-placeholder"></ph> 현재 Apigee Edge 문서를 보고 있습니다.
Apigee X 문서.
정보

증상

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

오류 메시지

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

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 요청을 전송합니다. 에지 퍼블릭 및 프라이빗 클라우드 사용자
TLS로 구성된 대상 엔드포인트에 대한 HTTP 요청 대상 엔드포인트의 TLS 사용 백엔드 서버에 대한 HTTP 요청입니다. 에지 퍼블릭 및 프라이빗 클라우드 사용자
잘못된 대상 서버 구성 대상 서버가 보안 포트 443(으)로 구성되어 있지만 SSL이 사용 설정되지 않았습니다. 에지 퍼블릭 및 프라이빗 클라우드 사용자

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

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

진단

이 문제는 <ph type="x-smartling-placeholder"></ph> Northbound 엔드포인트와 API 요청이 라우터에 감지되는 경우 이러한 오류 메시지는 NGINX 라우터에 기록되지 않습니다. 액세스할 수 있습니다 따라서 이러한 요청은 API 모니터링 및 바로 추적 도구입니다

  1. API 요청을 확인하고 보안 포트 443에서만 요청을 수락하도록 구성되어 있습니다. 만약 그렇다면, 그것이 문제의 원인입니다

    잘못된 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

해상도

클라이언트가 HTTP 대신 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
<ph type="x-smartling-placeholder">

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

이 오류는 TLS 사용 백엔드에 대한 HTTP 요청을 잘못 구성한 경우에 발생합니다. 대상 엔드포인트에 배포됩니다

진단

<ph type="x-smartling-placeholder">

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

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

  6. 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>
    
    <ph type="x-smartling-placeholder">
  2. 백엔드 서버가 안전하지 않은 경우:

    • 443와 같은 보안 포트 번호는 언급하지 마세요.
    • 백엔드 서버가 리슨하는 경우 포트 번호는 전혀 언급할 필요가 없습니다. 표준 비보안 포트
    • 다음과 같이 안전하지 않은 다른 포트를 사용하는 경우 포트 번호를 언급하세요. 9080

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

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

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

대상 서버가 사용 설정되지 않고 443 등의 보안 포트로 구성된 경우 SSL을 사용하면 Apigee Edge의 메시지 프로세서가 안전한 또는 이 문제를 일으키는 TLS 구성 대상 서버

진단

<ph type="x-smartling-placeholder">

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

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

  6. 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. 다음을 실행합니다. <ph type="x-smartling-placeholder"></ph> 대상 서버 가져오기 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의 메시지 프로세서가 보안 포트로 HTTP 요청을 보냅니다. 443 따라서 다음 메시지와 함께 400 Bad Request 오류가 발생합니다. The plain HTTP request was sent to HTTPS port

해상도

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

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

  • Edge UI
  • Management API

Edge UI

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

Management API

관리 API를 사용하여 <ph type="x-smartling-placeholder"></ph> 대상 서버 구성 문서를 업데이트합니다.

진단 정보 수집 필요

위의 안내를 따른 후에도 문제가 지속되면 다음을 수집합니다. Apigee Edge 지원팀에 문의하세요.

  1. 퍼블릭 클라우드 사용자는 다음 정보를 입력합니다. <ph type="x-smartling-placeholder">
      </ph>
    • 조직 이름
    • 환경 이름
    • API 프록시 이름
    • curl 명령어를 완료하여 오류를 재현하세요.
    • 추적 도구 출력 (실패한 요청을 캡처할 수 있었던 경우)
  2. Private Cloud 사용자인 경우 다음 정보를 입력합니다. <ph type="x-smartling-placeholder">
      </ph>
    • 전체 오류 메시지가 관찰됨
    • 환경 이름
    • API 프록시 번들
    • 대상 서버 정의 (엔드포인트에서 대상 서버를 사용하는 경우)
    • 추적 도구 출력 (실패한 요청을 캡처할 수 있었던 경우)