Apigee Edge 문서를 보고 있습니다.
Apigee X 문서로 이동하세요. info
증상
클라이언트 애플리케이션은 API 호출의 응답으로 오류 코드 messaging.adaptors.http.flow.SslHandshakeFailed와 함께 HTTP 상태 코드 503 Service Unavailable를 받습니다.
오류 메시지
클라이언트 애플리케이션은 다음 응답 코드를 받습니다.
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"
}
}
}가능한 원인
Apigee Edge의 메시지 프로세서와 백엔드 서버 간의 SSL 핸드셰이크 프로세스 중에 여러 가지 이유로 실패하여 오류 코드 messaging.adaptors.http.flow.SslHandshakeFailed와 함께 상태 코드 503 Service Unavailable가 표시될 수 있습니다. 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의 메시지 프로세서와 백엔드 서버 사이의 SSL 핸드셰이크 프로세스 중에 발생합니다.
- Apigee Edge의 메시지 프로세서의 truststore가 다음을 충족하는 경우:
- 백엔드 서버의 전체 인증서 체인과 일치하지 않는 인증서 체인을 포함하는 경우
- 백엔드 서버의 전체 인증서 체인을 포함하지 않는 경우
- 백엔드 서버에서 제공된 인증서 체인이 다음을 충족하는 경우:
- 대상 엔드포인트에 지정된 호스트 이름과 일치하지 않는 정규화된 도메인 이름 (FQDN)을 포함하는 경우
- 잘못되었거나 완전하지 않은 인증서 체인을 포함하는 경우
이 문제의 가능한 원인은 다음과 같습니다.
| 원인 | 설명 | 다음에 관한 문제 해결 안내 |
|---|---|---|
| 메시지 프로세서의 트러스트 저장소에 잘못되었거나 불완전한 인증서 또는 인증서 체인이 있음 | Apigee Edge의 메시지 프로세서 트러스트스토어에 저장된 인증서 또는 인증서 체인이 백엔드 서버의 인증서 체인과 일치하지 않거나 백엔드 서버의 전체 인증서 체인을 포함하지 않습니다. | Edge Private 및 Public Cloud 사용자 |
| 백엔드 서버의 인증서에 있는 FQDN과 대상 엔드포인트의 호스트 이름이 일치하지 않음 | 백엔드 서버에서 제공한 인증서에 대상 엔드포인트에 지정된 호스트 이름과 일치하지 않는 FQDN이 포함되어 있습니다. | Edge Private 및 Public Cloud 사용자 |
| 백엔드 서버에서 제공한 인증서 또는 인증서 체인이 잘못되었거나 완전하지 않음 | 백엔드 서버에서 제공된 인증서 체인이 잘못되었거나 불완전합니다. | Edge Private 및 Public Cloud 사용자 |
일반적인 진단 단계
다음 도구/기법 중 하나를 사용하여 이 오류를 진단하세요.
API 모니터링
절차 1: API 모니터링 사용
API 모니터링을 사용하여 오류를 진단하려면 다음 단계를 따르세요.
- 적절한 역할이 있는 사용자로 Apigee Edge UI에 로그인합니다.
문제를 조사하려는 조직으로 전환합니다.
- 분석 > API 모니터링 > 조사 페이지로 이동합니다.
- 오류가 발생한 구체적인 기간을 선택합니다.
시간에 대한 오류 코드를 표시합니다.
아래와 같이 오류 코드
messaging.adaptors.http.flow.SslHandshakeFailed가 있는 셀을 선택합니다.( 큰 이미지 보기)

결함 코드
messaging.adaptors.http.flow.SslHandshakeFailed에 관한 정보가 아래와 같이 표시됩니다.( 큰 이미지 보기)

로그 보기 를 클릭하고 실패한 요청의 행을 펼칩니다.
( 큰 이미지 보기)
- 로그 창에서 다음 세부정보를 확인합니다.
- 요청 메시지 ID
- 상태 코드:
503 - 결함 소스:
target - 오류 코드:
messaging.adaptors.http.flow.SslHandshakeFailed
Trace
절차 2: Trace 도구 사용
Trace 도구를 사용하여 오류를 진단하려면 다음 단계를 따르세요.
- 추적 세션을 사용 설정하고 다음 중 하나를 사용합니다.
- 오류 코드
messaging.adaptors.http.flow.SslHandshakeFailed이(가) 있는503 Service Unavailable오류가 발생할 때까지 기다리거나 - 문제를 재현할 수 있는 경우 API를 호출하여 문제를 재현합니다.
503 Service Unavailable
- 오류 코드
모든 FlowInfo 표시가 사용 설정되어 있는지 확인합니다.

- 실패한 요청 중 하나를 선택하고 트레이스를 검사합니다.
- 트레이스의 여러 단계를 탐색하여 장애가 발생한 위치를 찾습니다.
일반적으로 아래와 같이 Target Request Flow Started 단계 후에 오류가 표시됩니다.
( 큰 이미지 보기)

- 트레이스에서 다음 값을 확인합니다.
- 오류:
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값은 Apigee Edge의 메시지 프로세서가 백엔드 서버의 인증서를 검증할 수 없어 SSL 핸드셰이크가 실패했음을 나타냅니다.
- 오류:
- 트레이스에서 AX (분석 데이터 기록됨) 단계로 이동하여 클릭합니다.
단계 세부정보 오류 헤더 섹션으로 스크롤하여 아래와 같이 X-Apigee-fault-code, X-Apigee-fault-source, X-Apigee-Message-ID 값을 확인합니다.
( 큰 이미지 보기)

- X-Apigee-fault-code, X-Apigee-fault-source, X-Apigee-Message-ID 값을 확인합니다.
| 오류 헤더 | 값 |
|---|---|
| X-Apigee-fault-code | messaging.adaptors.http.flow.SslHandshakeFailed |
| X-Apigee-fault-source | target |
| X-Apigee-Message-ID | MESSAGE_ID |
NGINX
절차 3: NGINX 액세스 로그 사용
NGINX 액세스 로그를 사용하여 오류를 진단하려면 다음 단계를 따르세요.
- 비공개 클라우드 사용자인 경우 NGINX 액세스 로그를 사용하여 HTTP
503 Service Unavailable에 관한 주요 정보를 확인할 수 있습니다. NGINX 액세스 로그를 확인합니다.
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log- 특정 기간(문제가 과거에 발생한 경우) 동안 오류 코드
messaging.adaptors.http.flow.SslHandshakeFailed이 있는503오류가 있는지 또는503로 인해 여전히 실패하는 요청이 있는지 검색합니다. X-Apigee-fault-code가
messaging.adaptors.http.flow.SslHandshakeFailed값과 일치하는503오류가 발견되면 X-Apigee-fault-source 값을 확인합니다.NGINX 액세스 로그의 503 오류 샘플:
( 큰 이미지 보기)
위의 NGINX 액세스 로그 샘플 항목에는 X-Apigee-fault-code 및 X-Apigee-fault-source에 다음 값이 있습니다.
헤더 값 X-Apigee-fault-code messaging.adaptors.http.flow.SslHandshakeFailedX-Apigee-fault-source target
메시지 프로세서 로그
절차 4: 메시지 프로세서 로그 사용
- 일반적인 진단 단계에 설명된 대로 API 모니터링, Trace 도구 또는 NGINX 액세스 로그를 사용하여 실패한 요청 중 하나의 메시지 ID를 확인합니다.
메시지 프로세서 로그(
/opt/apigee/var/log/edge-message-processor/logs/system.log)에서 특정 요청 메시지 ID를 검색합니다. 다음 오류가 표시될 수 있습니다.org:myorg env:test api:MyProxy rev:1
messageid:myorg-28247-3541813-1NIOThread@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-1NIOThread@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 targetat 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 핸드셰이크가 실패했음을 나타냅니다.
원인: 메시지 프로세서의 트러스트 저장소에 잘못되었거나 불완전한 인증서 또는 인증서 체인이 있음
진단
- 일반적인 진단 단계에 설명된 대로 API 모니터링, Trace 도구 또는 NGINX 액세스 로그를 사용하여 관찰된 오류의 오류 코드, 오류 소스를 확인합니다.
- 오류 코드가
messaging.adaptors.http.flow.SslHandshakeFailed인 경우 다음 방법 중 하나를 사용하여 오류 메시지를 확인합니다. - 일반적인 진단 단계에 설명된 대로 추적 도구를 사용하여 error.cause를 찾습니다.
- 일반적인 진단 단계에 설명된 대로 메시지 프로세서 로그를 사용하여 예외를 찾습니다.
- 오류 메시지에 표시된 API 호출에 대한 오류 응답에서
faultstring를 찾습니다. - 오류 메시지가
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단계: 백엔드 서버의 인증서 체인 확인
- 2단계: 메시지 프로세서의 트러스트 저장소에 저장된 인증서 체인 비교
1단계
1단계: 백엔드 서버의 인증서 체인 확인
다음 방법 중 하나를 사용하여 백엔드 서버의 인증서 체인을 확인합니다.
openssl
다음과 같이 백엔드 서버의 호스트 이름에 대해 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
- 공개 클라우드 사용자인 경우 백엔드 서버에서 TCP/IP 패킷을 캡처합니다.
- 비공개 클라우드 사용자인 경우 백엔드 서버 또는 메시지 프로세서에서 TCP/IP 패킷을 캡처할 수 있습니다. 패킷이 백엔드 서버에서 복호화되므로 백엔드 서버에서 캡처하는 것이 좋습니다.
다음 tcpdump 명령어를 사용하여 TCP/IP 패킷을 캡처합니다.
tcpdump -i any -s 0 host IP_ADDRESS -w FILE_NAME
Wireshark 도구 또는 익숙한 유사 도구를 사용하여 TCP/IP 패킷을 분석합니다.
Tcpdump 샘플 분석
( 큰 이미지 보기)
- 패킷 43: 메시지 프로세서 (소스)가 백엔드 서버 (대상)에
Client Hello메시지를 전송했습니다. - 패킷 44: 백엔드 서버가 메시지 프로세서로부터
Client Hello메시지를 수신했음을 확인합니다. - 패킷 45: 백엔드 서버가 인증서와 함께
Server Hello메시지를 전송합니다. - 패킷 46: 메시지 프로세서가
Server Hello메시지와 인증서의 수신을 확인합니다. 패킷 47: 메시지 프로세서가
FIN, ACK메시지를 보내고 패킷 48에서RST, ACK을 보냅니다.이는 메시지 프로세서에 의한 백엔드 서버 인증서 검증이 실패했음을 나타냅니다. 메시지 프로세서에 백엔드 서버의 인증서와 일치하는 인증서가 없거나 (메시지 프로세서의) 트러스트 저장소에서 사용 가능한 인증서로 백엔드 서버의 인증서를 신뢰할 수 없기 때문입니다.
뒤로 돌아가 패킷 #45를 검토하고 백엔드 서버에서 전송한 인증서 체인을 확인할 수 있습니다.
( 큰 이미지 보기)
- 이 예시에서 서버는
common name (CN) = mocktarget.apigee.net가 포함된 리프 인증서를 전송한 후CN= GTS CA 1D4가 포함된 중간 인증서와CN = GTX Root R1가 포함된 루트 인증서를 전송합니다.
서버의 인증 유효성 검사가 실패했음을 확인한 경우 2단계: 백엔드 서버의 인증서와 메시지 프로세서의 트러스트 저장소에 저장된 인증서 비교로 이동합니다.
- 패킷 43: 메시지 프로세서 (소스)가 백엔드 서버 (대상)에
2단계
2단계: 백엔드 서버의 인증서와 메시지 프로세서의 트러스트스토어에 저장된 인증서 비교
- 백엔드 서버의 인증서 체인을 확인합니다.
- 다음 단계를 사용하여 메시지 프로세서의 트러스트 저장소에 저장된 인증서를 확인합니다.
TargetEndpoint의SSLInfo섹션에 있는TrustStore요소에서 트러스트 저장소 참조 이름을 가져옵니다.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>- 위 예시에서
TrustStore참조 이름은myCompanyTruststoreRef입니다. Edge UI에서 환경 > 참조를 선택합니다. 특정 신뢰 저장소 참조의 참조 열에 있는 이름을 확인합니다. 이것이 트러스트 저장소 이름이 됩니다.
( 큰 이미지 보기)
위 예시에서 트러스트 저장소 이름은 다음과 같습니다.
myCompanyTruststoreRef:
myCompanyTruststore
다음 API를 사용하여 트러스트 저장소에 저장된 인증서 (이전 단계에서 결정됨)를 가져옵니다.
키 저장소 또는 트러스트 저장소의 모든 인증서를 가져옵니다. 이 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 액세스 토큰 가져오기에 설명된 대로 OAuth 2.0 액세스 토큰으로 설정됩니다.
- 이 예시에서 사용된
curl옵션은 curl 사용에 설명되어 있습니다.
샘플 출력:
예시 신뢰 저장소
myCompanyTruststore의 인증서는 다음과 같습니다.[ "serverCert" ]
-
키 저장소 또는 트러스트 저장소에서 특정 인증서의 인증서 세부정보를 가져옵니다.
이 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 액세스 토큰 가져오기에 설명된 대로 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",
1단계에서 획득한 실제 서버 인증서와 3단계에서 획득한 트러스트스토어에 저장된 인증서가 일치하는지 확인합니다. 일치하지 않으면 문제의 원인이 됩니다.
위 예시에서 인증서를 하나씩 살펴보겠습니다.
- 리프 인증서:
백엔드 서버에서:
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",
트러스트 저장소에 저장된 리프 인증서가 백엔드 서버의 인증서와 일치합니다.
- 중간 인증서:
백엔드 서버에서:
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",
트러스트 저장소에 저장된 중간 인증서가 백엔드 서버의 인증서와 일치합니다.
- 루트 인증서:
백엔드 서버에서:
s:/C=US/O=Google Trust Services LLC/CN=GTS Root R1 i:/C=US/O=Google Trust Services LLC/CN=GTS Root R1
루트 인증서가 메시지 프로세서의 트러스트 저장소에 완전히 누락되었습니다.
트러스트 저장소에 루트 인증서가 누락되어 메시지 프로세서에서 다음 예외를 발생시킵니다.
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
오류 코드
messaging.adaptors.http.flow.SslHandshakeFailed와 함께503 Service Unavailable를 클라이언트 애플리케이션에 반환합니다.
- 리프 인증서:
해상도
- 백엔드 서버의 올바르고 완전한 인증서 체인이 있는지 확인합니다.
- 퍼블릭 클라우드 사용자인 경우 클라우드용 TLS 인증서 업데이트의 안내에 따라 인증서를 Apigee Edge의 메시지 프로세서 트러스트 저장소로 업데이트합니다.
- 프라이빗 클라우드 사용자인 경우 Private Cloud용 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 오류를 반환합니다.
진단
- 이 오류가 관찰되는 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입니다. 아래와 같이
openssl명령어를 사용하여 백엔드 서버의 인증서에서 FQDN을 확인합니다.openssl s_client -connect BACKEND_SERVER_HOST_NAME>:PORT_#>
예를 들면 다음과 같습니다.
openssl s_client -connect backend.company.com:443
Certificate chain섹션을 검사하고 리프 인증서의 주체에 CN의 일부로 지정된 FQDN을 기록합니다.Certificate chain 0 s:/
CN=backend.apigee.neti:/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입니다.- 1단계에서 가져온 백엔드 서버의 호스트 이름과 2단계에서 가져온 FQDN이 일치하지 않으면 오류가 발생한 것입니다.
- 위에서 설명한 예시에서 대상 엔드포인트의 호스트 이름은
backend.company.com입니다. 하지만 백엔드 서버의 인증서에 있는 FQDN 이름은backend.apigee.net입니다. 일치하지 않으므로 이 오류가 표시됩니다.
해상도
다음 방법 중 하나를 사용하여 이 문제를 해결할 수 있습니다.
올바른 FQDN
올바른 FQDN, 유효하고 완전한 인증서 체인으로 백엔드 서버의 키 저장소를 업데이트합니다.
- 올바른 FQDN이 있는 백엔드 서버의 인증서가 없는 경우 적절한 CA (인증 기관)에서 적절한 인증서를 조달합니다.
- 리프 또는 엔티티 인증서에 백엔드 서버의 올바르고 완전한 인증서 체인이 있고 이 인증서 체인이 대상 엔드포인트에 지정된 호스트 이름과 동일한 경우 완전한 인증서 체인으로 백엔드의 키 저장소를 업데이트합니다.
올바른 백엔드 서버
올바른 백엔드 서버의 호스트 이름으로 타겟 엔드포인트를 업데이트합니다.
- 대상 엔드포인트에 호스트 이름이 잘못 지정된 경우 백엔드 서버 인증서의 FQDN과 일치하는 올바른 호스트 이름을 갖도록 대상 엔드포인트를 업데이트합니다.
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>
원인: 백엔드 서버에서 제공한 인증서 또는 인증서 체인이 잘못되었거나 완전하지 않음
진단
- 다음과 같이 백엔드 서버의 호스트 이름에 대해
openssl명령어를 실행하여 백엔드 서버의 인증서 체인을 가져옵니다.openssl s_client -connect BACKEND_SERVER_HOST_NAME:PORT_#
위 명령어의 출력에서
Certificate chain를 확인합니다.openssl 명령어 출력의 샘플 백엔드 서버 인증서 체인:
Certificate chain 0 s:/
CN=mocktarget.apigee.neti:/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 - 인증서 체인 검증에 설명된 대로 적절하고 완전한 인증서 체인이 있는지 확인합니다.
백엔드 서버의 유효하고 완전한 인증서 체인이 없으면 이 문제가 발생합니다.
위의 샘플 백엔드 서버의 인증서 체인에는 루트 인증서가 누락되어 있습니다. 따라서 다음과 같은 오류가 발생합니다.
해상도
유효하고 완전한 인증서 체인으로 백엔드 서버의 키 저장소를 업데이트합니다.
- 백엔드 서버의 키 저장소에서 유효하고 완전한 인증서 체인을 업데이트합니다.
문제가 계속되면 진단 정보를 수집해야 함으로 이동합니다.
진단 정보 수집 필요
위 안내를 따른 후에도 문제가 지속되면 다음 진단 정보를 수집한 후 Apigee Edge 지원팀에 연락합니다.
- 퍼블릭 클라우드 사용자인 경우 다음 정보를 제공하세요.
- 조직 이름
- 환경 이름
- API 프록시 이름
curl명령어를 완료하여 오류 재현- 오류를 보여주는 추적 파일
openssl명령어의 출력:openssl s_client -connect BACKEND_SERVER_HOST_NAME:PORT_#- 백엔드 서버에서 캡처된 TCP/IP 패킷
- 프라이빗 클라우드 사용자인 경우 다음 정보를 제공하세요.
- 확인된 전체 오류 메시지
- API 프록시 번들
- 오류를 보여주는 추적 파일
- 메시지 프로세서 로그
/opt/apigee/var/log/edge-message-processor/logs/system.log openssl명령어의 출력:openssl s_client -connect BACKEND_SERVER_HOST_NAME:PORT_#- 백엔드 서버 또는 메시지 프로세서에서 캡처된 TCP/IP 패킷
- 키 저장소 또는 트러스트 저장소의 모든 인증서 가져오기 API의 출력과 키 저장소 또는 트러스트 저장소에서 인증서 세부정보 가져오기 API를 사용하여 획득한 각 인증서의 세부정보