503 서비스 사용 불가 - SSL 핸드셰이크 실패

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

증상

클라이언트 애플리케이션이 HTTP 상태 코드 503 Service Unavailable를 가져옵니다. API에 대한 응답으로 오류 코드 messaging.adaptors.http.flow.SslHandshakeFailed 있습니다.

오류 메시지

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

HTTP/1.1 503 Service Unavailable

또한 다음과 같은 오류 메시지가 표시될 수 있습니다.

{
   "fault":{
      "faultstring":"SSL Handshake failed sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target",
      "detail":{
         "errorcode":"messaging.adaptors.http.flow.SslHandshakeFailed"
      }
   }
}

가능한 원인

오류 코드와 함께 상태 코드 503 Service Unavailable가 표시될 수 있습니다. SSL 실행 중 실패로 인한 messaging.adaptors.http.flow.SslHandshakeFailed 여러 시간 동안 Apigee Edge의 메시지 프로세서와 백엔드 서버 간의 핸드셰이크 프로세스를 있습니다. faultstring 의 오류 메시지는 일반적으로 이 오류를 일으켰던 고수준의 원인이 무엇인지를 파악해야 합니다.

faultstring에서 관찰된 오류 메시지에 따라 적절한 기술을 사용할 수 있습니다. 이 플레이북에서는 faultstring에서 SSL Handshake failed sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 오류 메시지가 표시되면 이 오류가 발생합니다.

이 오류는 Apigee Edge의 메시지 프로세서와 다음과 같습니다.

  • Apigee Edge 메시지 프로세서의 truststore가 다음과 같은 경우: <ph type="x-smartling-placeholder">
      </ph>
    • 백엔드 서버의 완전한 인증서와 일치하지 않는 인증서 체인이 포함되어 있습니다. 인증서 체인 또는
    • 백엔드 서버의 전체 인증서 체인을 포함하지 않습니다.
  • 백엔드 서버에서 제공하는 인증서 체인은 다음과 같습니다. <ph type="x-smartling-placeholder">
를 통해 개인정보처리방침을 정의할 수 있습니다. <ph type="x-smartling-placeholder">

이 문제의 가능한 원인은 다음과 같습니다.

원인 설명 다음에 관한 문제 해결 안내
메시지 프로세서의 트러스트 저장소에 있는 부정확하거나 불완전한 인증서 또는 인증서 체인 Apigee Edge 메시지 프로세서의 트러스트 저장소에 저장된 인증서 또는 체인이 백엔드 서버의 인증서 체인과 일치하지 않거나 백엔드 서버의 전체 인증서 체인을 포함하지 않습니다. Edge 프라이빗 및 퍼블릭 클라우드 사용자
백엔드 서버 인증서의 FQDN과 대상 엔드포인트의 호스트 이름이 일치하지 않음 백엔드 서버에서 제시한 인증서에 대상 엔드포인트에 지정된 호스트 이름과 일치하지 않는 FQDN이 포함되어 있습니다. Edge 프라이빗 및 퍼블릭 클라우드 사용자
백엔드 서버에서 제시한 부정확하거나 불완전한 인증서 또는 인증서 체인 백엔드 서버에서 제시한 인증서 체인이 잘못되었거나 완전하지 않습니다. Edge 프라이빗 및 퍼블릭 클라우드 사용자

일반적인 진단 단계

다음 도구/기술 중 하나를 사용하여 이 오류를 진단합니다.

API 모니터링

절차 #1: API 모니터링 사용

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

API 모니터링을 사용하여 오류를 진단하려면 다음 안내를 따르세요.

  1. <ph type="x-smartling-placeholder"></ph> 다음 계정으로 Apigee Edge UI에 로그인: 역할을 수행하는 것이 좋습니다.
  2. 문제를 조사하려는 조직으로 전환합니다.

  3. 분석 > API 모니터링 > 조사 페이지를 엽니다.
  4. 오류가 관찰된 특정 기간을 선택합니다.
  5. 시간을 기준으로 결함 코드를 표시합니다.

    <ph type="x-smartling-placeholder">
  6. 오류 코드가 있는 셀을 선택합니다. messaging.adaptors.http.flow.SslHandshakeFailed(아래 그림) 아래:

    ( 더 크게 보기)

  7. 오류 코드에 대한 정보 messaging.adaptors.http.flow.SslHandshakeFailed는 다음과 같이 표시됩니다. 다음과 같습니다.

    ( 더 크게 보기)

  8. 로그 보기 를 클릭하고 실패한 요청의 행을 펼칩니다.

    ( 더 크게 보기)

  9. 로그 창에서 다음 세부정보를 확인합니다. <ph type="x-smartling-placeholder">
      </ph>
    • 요청 메시지 ID
    • 상태 코드: 503
    • 오류 소스: target
    • 오류 코드: messaging.adaptors.http.flow.SslHandshakeFailed

Trace

절차 #2: Trace 도구 사용

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

Trace 도구를 사용하여 오류를 진단하는 방법은 다음과 같습니다.

  1. 추적 세션을 사용 설정하고 다음 중 하나를 수행합니다. <ph type="x-smartling-placeholder">
      </ph>
    • 오류 코드와 함께 503 Service Unavailable 오류 대기 발생 시간 messaging.adaptors.http.flow.SslHandshakeFailed 또는
    • 문제를 재현할 수 있는 경우 API를 호출하여 문제를 재현합니다. 503 Service Unavailable
  2. 모든 FlowInfos 표시가 사용 설정되어 있는지 확인합니다.

  3. 실패한 요청 중 하나를 선택하고 trace를 검토합니다.
  4. 추적의 여러 단계를 살펴보고 오류가 발생한 위치를 찾습니다.
  5. 오류는 일반적으로 Target Request Flow Started(대상 요청 흐름 시작됨) 단계 다음에 표시됩니다. 다음과 같습니다.

    ( 더 크게 보기)

  6. 트레이스에서 다음 값을 확인합니다. <ph type="x-smartling-placeholder">
      </ph>
    • 오류: SSL Handshake failed sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    • error.cause: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    • error.class: com.apigee.errors.http.server.ServiceUnavailableException
    • SSL Handshake failed sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 오류 값은 SSL 핸드셰이크가 실패했음을 나타냅니다. Apigee Edge의 메시지 프로세서가 백엔드 서버의 있습니다.
  7. 트레이스의 AX (애널리틱스 데이터 기록됨) 단계로 이동하여 클릭합니다.
  8. 아래로 스크롤하여 단계 세부정보 오류 헤더 섹션으로 이동한 후 X-Apigee-fault-codeX-Apigee-fault-source의 값 X-Apigee-Message-ID:

    ( 더 크게 보기)

  9. X-Apigee-fault-code, X-Apigee-fault-source, 및 X-Apigee-Message-ID:
  10. 오류 헤더
    X-Apigee-fault-code messaging.adaptors.http.flow.SslHandshakeFailed
    X-Apigee-fault-source target
    X-Apigee-Message-ID MESSAGE_ID

NGINX

절차 #3: NGINX 액세스 로그 사용

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

NGINX 액세스 로그를 사용하여 오류를 진단하려면 다음 안내를 따르세요.

  1. Private Cloud 사용자인 경우 NGINX 액세스 로그를 사용하여 HTTP 503 Service Unavailable에 대한 주요 정보입니다.
  2. NGINX 액세스 로그를 확인합니다.

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    <ph type="x-smartling-placeholder">
  3. 오류 코드와 함께 503 오류가 있는지 검색하여 확인합니다. 특정 기간 동안 messaging.adaptors.http.flow.SslHandshakeFailed ( 여전히 503로 실패하는 요청이 있는지 확인하세요.
  4. X-Apigee-fault-code가 일치하는 503 오류가 발견된 경우 messaging.adaptors.http.flow.SslHandshakeFailed의 값, X-Apigee-fault-source.의 값을 결정합니다.

    NGINX 액세스 로그의 샘플 503 오류:

    ( 더 크게 보기)

    NGINX 액세스 로그의 위 샘플 항목에는 다음과 같은 값이 있습니다. X-Apigee-fault-code X-Apigee-fault-code

    헤더
    X-Apigee-fault-code messaging.adaptors.http.flow.SslHandshakeFailed
    X-Apigee-fault-source target

메시지 프로세서 로그

절차 #4: 메시지 프로세서 로그 사용

<ph type="x-smartling-placeholder">
  1. API 모니터링, Trace 도구, 또는 NGINX 액세스 로그를 기록합니다.일반적인 진단 단계
  2. 메시지 프로세서 로그에서 특정 요청 메시지 ID 검색 (/opt/apigee/var/log/edge-message-processor/logs/system.log) 다음 현상은 다음 오류가 반환됩니다.

    org:myorg env:test api:MyProxy rev:1
    messageid:myorg-28247-3541813-1
    NIOThread@1 ERROR HTTP.CLIENT - HTTPClient$Context.handshakeFailed() :
    SSLClientChannel[Connected: Remote:X.X.X.X:443
    Local:192.168.194.140:55102]@64596 useCount=1
    bytesRead=0 bytesWritten=0 age=233ms  lastIO=233ms
    isOpen=true handshake failed, message: General SSLEngine problem
    

    위의 오류는 메시지 프로세서 간의 SSL 핸드셰이크가 실패했음을 나타냅니다. 백엔드 서버가 포함됩니다

    그러면 아래와 같이 자세한 스택 트레이스가 포함된 예외가 발생합니다.

    org:myorg env:test api:MyProxy rev:1
    messageid:myorg-28247-3541813-1
    NIOThread@1 ERROR ADAPTORS.HTTP.FLOW - RequestWriteListener.onException() :
    RequestWriteListener.onException(HTTPRequest@1522922c)
    javax.net.ssl.SSLHandshakeException: General SSLEngine problem
    	at sun.security.ssl.Handshaker.checkThrown(Handshaker.java:1478)
    	at sun.security.ssl.SSLEngineImpl.checkTaskThrown(SSLEngineImpl.java:535)
    	... <snipped>
    Caused by: javax.net.ssl.SSLHandshakeException: General SSLEngine problem
    	at sun.security.ssl.Alerts.getSSLException(Alerts.java:203)
    	at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1728)
    	... <snipped>
    Caused by: sun.security.validator.ValidatorException: PKIX path building failed:
    sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid
    certification path to requested target
    	at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:397)
    	at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:302)
    	... <snipped>
      

    다음과 같은 이유로 핸드셰이크 실패가 발생합니다.

    Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

    이는 Apigee Edge의 메시지 프로세서가 SSL 핸드셰이크가 실패했음을 나타냅니다. 백엔드 서버의 인증서를 확인할 수 없습니다.

원인: 메시지 프로세서의 트러스트 저장소에 잘못되거나 불완전한 인증서 또는 인증서 체인이 있음

진단

  1. API를 사용하여 관찰된 오류의 결함 코드, 오류 소스를 결정합니다. 일반 진단 단계를 참조하세요.
  2. 결함 코드messaging.adaptors.http.flow.SslHandshakeFailed이면 다음 방법 중 하나를 사용하여 오류 메시지를 확인하세요.
    • 아래의 설명에 따라 Trace 도구를 사용하여 error.cause를 찾습니다. 일반적인 진단 단계
    • 다음에 설명된 대로 메시지 프로세서 로그를 사용하여 예외를 찾으세요. 일반적인 진단 단계
    • 다음과 같이 API 호출에 대한 오류 응답에서 faultstring를 찾습니다. 오류 메시지
  3. 오류 메시지가 sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target"인 경우 SSL 핸드셰이크가 Apigee Edge의 메시지 프로세서가 백엔드 서버의 있습니다.

이 문제는 다음 두 단계로 디버그할 수 있습니다.

  1. 1단계: 백엔드 서버의 인증서 체인 결정
  2. 2단계: 메시지 프로세서의 트러스트 저장소에 저장된 인증서 체인 비교

1단계

1단계: 백엔드 서버의 인증서 체인 결정

다음 방법 중 하나를 사용하여 백엔드 서버의 인증서 체인을 확인합니다.

openssl

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

백엔드 서버의 호스트에 대해 openssl 명령어 실행 이름을 아래와 같이 입력합니다.

openssl s_client -connect BACKEND_SERVER_HOST_NAME:PORT#

위 명령어 출력의 인증서 체인을 확인합니다.

openssl 명령어 출력의 샘플 백엔드 서버 인증서 체인:

Certificate chain
 0 s:/CN=mocktarget.apigee.net
   i:/C=US/O=Google Trust Services LLC/CN=GTS CA 1D4
 1 s:/C=US/O=Google Trust Services LLC/CN=GTS CA 1D4
   i:/C=US/O=Google Trust Services LLC/CN=GTS Root R1
 2 s:/C=US/O=Google Trust Services LLC/CN=GTS Root R1
   i:/C=US/O=Google Trust Services LLC/CN=GTS Root R1

tcpdump

<ph type="x-smartling-placeholder">
  1. 퍼블릭 클라우드 사용자인 경우 백엔드 서버입니다
  2. Private Cloud 사용자인 경우 TCP/IP를 캡처할 수 있습니다. 백엔드 서버 또는 메시지 프로세서의 패킷을 보내고, 가능한 한 패킷이 백엔드 서버에서 복호화될 때 백엔드 서버에 전달됩니다.
  3. 다음을 사용하세요. <ph type="x-smartling-placeholder"></ph> tcpdump 명령어를 사용하여 TCP/IP 패킷을 캡처합니다.

    tcpdump -i any -s 0 host IP_ADDRESS -w FILE_NAME
    
    <ph type="x-smartling-placeholder">
  4. 다음을 사용하여 TCP/IP 패킷을 분석합니다. Wireshark 도구 또는 익숙한 유사한 도구를 사용합니다.

    Tcpdump 샘플 분석

    ( 더 크게 보기)

    • 패킷 #43: 메시지 프로세서 (소스)가 백엔드 서버 (대상)로 Client Hello 메시지를 전송합니다.
    • 패킷 #44: 백엔드 서버가 Client Hello 메시지를 전송합니다.
    • 패킷 #45: 백엔드 서버가 Server Hello 메시지가 표시됩니다.
    • 패킷 #46: 메시지 프로세서가 Server Hello 메시지와 인증서가 생성됩니다.
    • 패킷 #47: 메시지 프로세서가 FIN, ACK 패킷 #48RST, ACK가 따라옵니다.

      이는 곧 백엔드 서버 인증서 유효성 검사를 메시지 프로세서에 실패했습니다. 이것은 메시지 프로세서가 백엔드 서버의 인증서와 일치하거나 신뢰할 수 없는 인증서 백엔드 서버의 인증서를 (메시지 프로세서)의 트러스트 저장소입니다.

    • 패킷 #45로 돌아가서 인증서를 확인할 수 있습니다. 백엔드 서버에서 전송하는 체인

      ( 더 크게 보기)

    • 이 예에서는 서버가 리프 인증서를 전송했으며 common name (CN) = mocktarget.apigee.net 다음에 CN= GTS CA 1D4 및 루트 인증서가 포함된 중간 인증서 CN = GTX Root R1.

    서버의 인증 유효성 확인에 실패한 것이 확실하면 2단계: 백엔드 서버의 인증서 비교 및 메시지 프로세서의 트러스트 저장소에 저장된 인증서를 사용합니다.

2단계

2단계: 백엔드 서버의 인증서와 메시지 프로세서의 트러스트 저장소

  1. 백엔드 서버의 인증서 체인을 결정합니다.
  2. 다음을 사용하여 메시지 프로세서의 트러스트 저장소에 저장된 인증서를 확인합니다. 다음 단계를 따르세요. <ph type="x-smartling-placeholder">
      </ph>
    1. TrustStore 요소에서 truststore 참조 이름 가져오기 (TargetEndpointSSLInfo 섹션)

      TargetEndpoint의 샘플 SSLInfo 섹션을 살펴보겠습니다. 구성:

      <TargetEndpoint name="default">
      ...
         <HTTPTargetConnection>
            <Properties />
            <SSLInfo>
               <Enabled>true</Enabled>
               <ClientAuthEnabled>true</ClientAuthEnabled>
               <KeyStore>ref://myKeystoreRef</KeyStore>
               <KeyAlias>myKey</KeyAlias>
               <TrustStore>
                  ref://myCompanyTrustStoreRef
               </TrustStore>
            </SSLInfo>
         </HTTPTargetConnection>
         ...
      </TargetEndpoint>
      
    2. 위의 예에서 TrustStore 참조 이름은 다음과 같습니다. myCompanyTruststoreRef
    3. Edge UI에서 환경 > 참조. 특정 truststore 참조의 Reference 열 사용 중인 트러스트 저장소 이름을 지정합니다

      ( 더 크게 보기)

    4. 위의 예에서 트러스트 저장소 이름은 다음과 같습니다.

      myCompanyTruststoreRef: myCompanyTruststore

  3. 트러스트 저장소에 저장된 인증서 가져오기 (이전 단계에서 결정) 다음 API를 사용합니다.

    1. <ph type="x-smartling-placeholder"></ph> 키 저장소 또는 트러스트 저장소의 모든 인증서 가져오기. 이 API는 특정 트러스트 저장소에 있는 인증서를 사용합니다

      퍼블릭 클라우드 사용자:

      curl -v -X GET https//api.enterprise.apigee.com/v1/organizations/ORGANIZATION_NAME/environments/ENVIRONMENT_NAME/keystores/KEYSTORE_NAME/certs -H "Authorization: Bearer $TOKEN"
      

      Private Cloud 사용자:

      curl -v -X GET http://MANAGEMENT_HOST:PORT_#/v1/organizations/ORGANIZATION_NAME/environments/ENVIRONMENT_NAME/keystores/KEYSTORE_NAME/certs -H "Authorization: Bearer $TOKEN"
      

      위치:

      • ORGANIZATION_NAME는 조직의 이름입니다.
      • ENVIRONMENT_NAME은 환경 이름입니다.
      • KEYSTORE_NAME은 키 저장소의 이름입니다.
      • $TOKEN이 OAuth 2.0 액세스 토큰 받기
      • 이 예에서 사용된 curl 옵션은 다음에 설명되어 있습니다. curl 사용

      샘플 출력:

      트러스트 저장소 myCompanyTruststore 예시의 인증서는 다음과 같습니다.

      [
        "serverCert"
      ]
      

    2. <ph type="x-smartling-placeholder"></ph> 키 저장소 또는 트러스트 저장소에서 특정 인증서의 인증서 세부정보 가져오기 이 API는 특정 인증서에 대한 정보를 트러스트 저장소

      퍼블릭 클라우드 사용자:

      curl -v -X GET https//api.enterprise.apigee.com/v1/organizations/ORGANIZATION_NAME/environments/ENVIRONMENT_NAME/keystores/KEYSTORE_NAME/certs/CERT_NAME -H "Authorization: Bearer $TOKEN"
      

      Private Cloud 사용자

      curl -v -X GET http://MANAGEMENT_HOST:PORT_#>/v1/organizations/ORGANIZATION_NAME/environments/ENVIRONMENT_NAME/keystores/KEYSTORE_NAME/certs/CERT_NAME -H "Authorization: Bearer $TOKEN"
      

      위치:

      • ORGANIZATION_NAME는 조직의 이름입니다.
      • ENVIRONMENT_NAME은 환경 이름입니다.
      • KEYSTORE_NAME은 키 저장소의 이름입니다.
      • CERT_NAME은 인증서 이름입니다.
      • $TOKEN이 OAuth 2.0 액세스 토큰 받기
      • 이 예에서 사용된 curl 옵션은 다음에 설명되어 있습니다. curl 사용

      샘플 출력

      serverCert 세부정보에는 다음과 같은 제목과 발급기관이 표시됩니다.

      리프/엔티티 인증서:

      "subject": "CN=mocktarget.apigee.net",
      "issuer": "CN=GTS CA 1D4, O=Google Trust Services LLC, C=US",
      

      중급 인증서:

      "subject" : "CN=GTS CA 1D4, O=Google Trust Services LLC, C=US",
      "issuer" : "CN=GTS Root R1, O=Google Trust Services LLC, C=US",
      
  4. 1단계에서 받은 실제 서버 인증서와 3단계에서 가져온 truststore에 저장된 데이터 세트와 일치해야 합니다. 일치하지 않을 경우 문제를 일으킬 수 있습니다

    위의 예에서 한 번에 하나의 인증서를 살펴보겠습니다.

    1. 리프 인증서:

      백엔드 서버에서:

      s:/CN=mocktarget.apigee.net
      i:/C=US/O=Google Trust Services LLC/CN=GTS CA 1D4
      

      메시지 프로세서 (클라이언트)의 트러스트 저장소에서 다음을 실행합니다.

      "subject": "CN=mocktarget.apigee.net",
      "issuer": "CN=GTS CA 1D4, O=Google Trust Services LLC, C=US",
      

      트러스트 저장소에 저장된 리프 인증서가 백엔드의 리프 인증서와 일치합니다. 있습니다.

    2. 중급 인증서:

      백엔드 서버에서:

      s:/C=US/O=Google Trust Services LLC/CN=GTS CA 1D4
      i:/C=US/O=Google Trust Services LLC/CN=GTS Root R1
      

      메시지 프로세서 (클라이언트)의 트러스트 저장소에서 다음을 실행합니다.

      "subject" : "CN=GTS CA 1D4, O=Google Trust Services LLC, C=US",
      "issuer" : "CN=GTS Root R1, O=Google Trust Services LLC, C=US",
      

      트러스트 저장소에 저장된 중간 인증서가 인증서의 백엔드 서버입니다

    3. 루트 인증서:

      백엔드 서버에서:

      s:/C=US/O=Google Trust Services LLC/CN=GTS Root R1
      i:/C=US/O=Google Trust Services LLC/CN=GTS Root R1
      

      루트 인증서가 메시지 프로세서의 트러스트 저장소

    4. truststore에 루트 인증서가 누락되었으므로 메시지 프로세서에서 다음과 같은 예외가 발생합니다.

      sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
      

      오류 코드와 함께 503 Service Unavailable를 반환합니다. 클라이언트에게 messaging.adaptors.http.flow.SslHandshakeFailed 애플리케이션을 실행할 수 있습니다

를 통해 개인정보처리방침을 정의할 수 있습니다. <ph type="x-smartling-placeholder">

해상도

  1. 백엔드 서버의 적절하고 완전한 인증서 체인이 있는지 확인합니다.
  2. 퍼블릭 클라우드 사용자인 경우 다음 안내를 따르세요. <ph type="x-smartling-placeholder"></ph> 클라우드의 TLS 인증서를 업데이트하여 인증서를 Apigee Edge의 메시지 프로세서 truststore입니다.
  3. Private Cloud 사용자인 경우 다음 안내를 따르세요. <ph type="x-smartling-placeholder"></ph> 프라이빗 클라우드의 TLS 인증서 업데이트를 통해 인증서 업데이트: Apigee Edge의 메시지 프로세서 트러스트 저장소입니다.

원인: 백엔드 서버 인증서의 FQDN과 대상 엔드포인트의 호스트 이름이 일치하지 않습니다.

백엔드 서버가 FQDN을 포함하는 인증서 체인을 제공하는 경우 호스트 이름에 지정된 경우 Apigee Edge의 메시지 프로세스에서 오류를 반환합니다. SSL Handshake failed sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

진단

  1. 현재 관찰 중인 API 프록시에서 특정 대상 엔드포인트를 검사합니다. 백엔드 서버의 호스트 이름을 기록해 둡니다.

    샘플 TargetEndpoint:

    <TargetEndpoint name="default">
       …
       <HTTPTargetConnection>
          <Properties />
          <SSLInfo>
             <Enabled>true</Enabled>
             <TrustStore>ref://myTrustStoreRef</TrustStore>
          </SSLInfo>
          <URL>https://backend.company.com/resource</URL>
       </HTTPTargetConnection>
    </TargetEndpoint>
    

    위의 예에서 백엔드 서버의 호스트 이름은 backend.company.com입니다.

  2. openssl를 사용하여 백엔드 서버의 인증서에서 FQDN을 확인합니다. 명령어를 실행합니다.

    openssl s_client -connect BACKEND_SERVER_HOST_NAME>:PORT_#>
    

    예를 들면 다음과 같습니다.

    openssl s_client -connect backend.company.com:443
    

    Certificate chain 섹션을 검토하고 다음과 같이 지정된 FQDN을 확인합니다. 리프 인증서의 주체에 있는 CN 부분입니다.

    Certificate chain
     0 s:/CN=backend.apigee.net
       i:/C=US/O=Google Trust Services LLC/CN=GTS CA 1D4
     1 s:/C=US/O=Google Trust Services LLC/CN=GTS CA 1D4
       i:/C=US/O=Google Trust Services LLC/CN=GTS Root R1
     2 s:/C=US/O=Google Trust Services LLC/CN=GTS Root R1
       i:/C=US/O=Google Trust Services LLC/CN=GTS Root R1
    

    위의 예에서 백엔드 서버의 FQDN은 backend.apigee.net입니다.

  3. 1단계에서 얻은 백엔드 서버의 호스트 이름과 FQDN을 얻은 경우 일치하지 않는다면 그것이 오류의 원인입니다.
  4. 위에서 설명한 예에서 대상 엔드포인트의 호스트 이름은 backend.company.com 하지만 백엔드 서버의 인증서에 있는 FQDN 이름은 backend.apigee.net입니다. 일치하지 않기 때문에 이 오류가 발생합니다.

해상도

다음 방법 중 하나를 사용하여 이 문제를 해결할 수 있습니다.

올바른 FQDN

올바른 FQDN, 유효하고 완전한 인증서로 백엔드 서버의 키 저장소 업데이트 체인:

  1. 올바른 FQDN을 가진 백엔드 서버의 인증서가 없으면 적절한 CA (인증 기관)에서 적절한 인증서를 조달합니다.
  2. 서비스 계정 보안을 유효하고 완전한 백엔드 서버의 인증서 체인이어야 합니다.

    <ph type="x-smartling-placeholder">
  3. 올바른 FQDN을 가진 유효하고 완전한 인증서 체인이 있으면 호스트 이름과 동일한 리프 또는 엔티티 인증서에 있는 백엔드 서버 지정된 경우 백엔드 키 저장소를 전체 인증서 체인입니다
를 통해 개인정보처리방침을 정의할 수 있습니다. <ph type="x-smartling-placeholder">

올바른 백엔드 서버

올바른 백엔드 서버의 호스트 이름으로 대상 엔드포인트를 업데이트합니다.

  1. 호스트 이름이 대상 엔드포인트에 잘못 지정된 경우 대상 엔드포인트가 백엔드의 FQDN과 일치하는 올바른 호스트 이름을 갖도록 함 서버의 인증서를 받습니다
  2. API 프록시에 변경사항을 저장합니다.

    위에 설명된 예에서 백엔드 서버 호스트 이름이 잘못 백엔드 서버의 인증서에서 FQDN을 사용하여 문제를 해결할 수 있습니다. 다음과 같이 backend.apigee.net입니다.

    <TargetEndpoint name="default">
       …
       <HTTPTargetConnection>
          <Properties />
          <SSLInfo>
             <Enabled>true</Enabled>
             <TrustStore>ref://myTrustStoreRef</TrustStore>
          </SSLInfo>
          <URL>https://backend.apigee.net/resource</URL>
       </HTTPTargetConnection>
    </TargetEndpoint>
    

원인: 백엔드 서버에서 잘못되거나 불완전한 인증서 또는 인증서 체인을 제시함

진단

  1. openssl 명령어를 실행하여 백엔드 서버의 인증서 체인을 가져옵니다. 백엔드 서버의 호스트 이름에 다음과 같이 대조합니다.
    openssl s_client -connect BACKEND_SERVER_HOST_NAME:PORT_#
    

    위 명령어 출력의 Certificate chain를 확인합니다.

    openssl 명령어 결과의 샘플 백엔드 서버 인증서 체인:

    Certificate chain
     0 s:/CN=mocktarget.apigee.net
       i:/C=US/O=Google Trust Services LLC/CN=GTS CA 1D4
     1 s:/C=US/O=Google Trust Services LLC/CN=GTS CA 1D4
       i:/C=US/O=Google Trust Services LLC/CN=GTS Root R1
       
  2. 다음에 설명된 대로 올바르고 완전한 인증서 체인이 있는지 확인합니다. 인증서 체인 유효성 검사.
  3. 백엔드 서버에 대한 유효하고 완전한 인증서 체인이 없으면 그것이 문제의 원인입니다

    위에 표시된 샘플 백엔드 서버의 인증서 체인에서 루트 인증서는 없습니다. 따라서 이 오류가 발생합니다.

해상도

유효하고 완전한 인증서 체인으로 백엔드 서버의 키 저장소를 업데이트합니다.

  1. <ph type="x-smartling-placeholder"></ph> 유효하고 완전한 백엔드 서버의 인증서 체인이 있는지 확인합니다.

    <ph type="x-smartling-placeholder">
  2. 백엔드 서버의 키 저장소에서 유효하고 완전한 인증서 체인을 업데이트합니다.
를 통해 개인정보처리방침을 정의할 수 있습니다. <ph type="x-smartling-placeholder">

문제가 지속되면 (으)로 이동하세요. 진단 정보를 수집해야 합니다.

진단 정보 수집 필요

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

  • 퍼블릭 클라우드 사용자인 경우 다음 정보를 입력합니다. <ph type="x-smartling-placeholder">
      </ph>
    • 조직 이름
    • 환경 이름
    • API 프록시 이름
    • curl 명령어를 완료하여 오류를 재현합니다.
    • 오류를 보여주는 추적 파일
    • openssl 명령어의 출력:

      openssl s_client -connect BACKEND_SERVER_HOST_NAME:PORT_#

    • 백엔드 서버에서 캡처된 TCP/IP 패킷
  • Private Cloud 사용자인 경우 다음 정보를 입력합니다. <ph type="x-smartling-placeholder">
      </ph>
    • 전체 오류 메시지가 관찰됨
    • API 프록시 번들
    • 오류를 보여주는 추적 파일
    • 메시지 프로세서 로그 /opt/apigee/var/log/edge-message-processor/logs/system.log
    • openssl 명령어의 출력:
      openssl s_client -connect BACKEND_SERVER_HOST_NAME:PORT_#
    • 백엔드 서버 또는 메시지 프로세서에서 캡처된 TCP/IP 패킷
    • 출력 <ph type="x-smartling-placeholder"></ph> keystore 또는 truststore API의 모든 인증서와 얻은 각 인증서는 <ph type="x-smartling-placeholder"></ph> 키 저장소 또는 Truststore API에서 인증서 세부정보 가져오기

참조