Apigee 및 Apigee Hybrid 문서입니다.
Apigee Edge 문서 보기
증상
TLS 연결 오류로 Apigee Hybrid API 요청이 실패합니다. 이러한 오류는 일반적으로 연결 재설정 및 알림 핸드셰이크 실패입니다.
오류 메시지
아래 표시된 오류와 유사한 TLS 또는 동일하지 않은 다른 오류와 함께 API 호출이 실패합니다.
* TLSv1.2 (OUT), TLS handshake, Client hello (1): * LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to example.apis.com:443 * Closing connection 0 curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to example.apis.com:443
* (304) (OUT), TLS handshake, Client hello (1): * Recv failure: Connection reset by peer * LibreSSL/3.3.6: error:02FFF036:system library:func(4095):Connection reset by peer * Closing connection curl: (35) Recv failure: Connection reset by peer
* (304) (OUT), TLS handshake, Client hello (1): * LibreSSL/3.3.6: error:1404B410:SSL routines:ST_CONNECT:sslv3 alert handshake failure * Closing connection curl: (35) LibreSSL/3.3.6: error:1404B410:SSL routines:ST_CONNECT:sslv3 alert handshake failure
가능한 원인
원인 | 설명 | 다음에 관한 문제 해결 안내 |
---|---|---|
인그레스 Kubernetes 보안 비밀 누락 | org-envgroup 의 Kubernetes 보안 비밀이 Apigee 네임스페이스에서 누락되었습니다. |
Apigee Hybrid |
잘못된 형식의 SSL 인증서 | 재정의 파일의 virtualhosts 섹션을 가리키는 SSL 인증서의 형식이 잘못되었습니다. | Apigee Hybrid |
SSL 키가 SSL 인증서와 일치하지 않음 | SSL 키가 재정의 파일의 virtualhosts 섹션을 가리키는 SSL 인증서와 일치하지 않습니다. | Apigee Hybrid |
원인: 인그레스 Kubernetes 보안 비밀 누락
진단
- Apigee 네임스페이스에서
apigee-watcher
포드 로그를 분석하고 오류가 있는지 확인합니다.
다음과 같은 오류가 관찰될 수 있습니다.
NOT_FOUND: failed to get secret "MY_HYBRID_PROJECT-ENV_GROUP" in namespace "apigee": secrets "MY_HYBRID_PROJECT-ENV_GROUP" not found
각 항목의 의미는 다음과 같습니다.MY_HYBRID_PROJECT
는 Apigee Hybrid 조직의 이름입니다.ENV_GROUP
은 환경 그룹의 이름입니다.
apigee-watcher
가 Kubernetes 보안 비밀을 찾을 수 없음을 나타냅니다. - 다음 명령어를 사용하여 Kubernetes 보안 비밀이 실제로 누락되었는지 확인합니다.
kubectl -n apigee get secrets | grep MY_HYBRID_PROJECT-ENV_GROUP
<no output>
이 예시에서는MY_HYBRID_PROJECT-ENV_GROUP
의 Kubernetes 보안 비밀이 없음을 보여줍니다. 잘못 삭제되었을 수 있습니다.
해결 방법
overrides.yaml
파일에서 TLS 인증서와 주요 파일 정보를 사용하여 누락된 Kubernetes 보안 비밀을 다시 만들 수 있습니다.
- 다음 명령어를 실행하여 누락된 보안 비밀을 다시 만듭니다.
apigeectl apply -f overrides/overrides.yaml --settings virtualhosts
위 명령어의 결과는 보안 비밀이 생성되었음을 보여줍니다.
secret/MY_HYBRID_PROJECT-ENV_GROUP created
- 다음 명령어를 사용하여 Kubernetes 보안 비밀이 성공적으로 생성되었는지 확인합니다.
kubectl -n apigee get secrets | grep MY_HYBRID_PROJECT-ENV_GROUP
이 명령어의 출력은 다음과 같이 표시됩니다.
MY_HYBRID_PROJECT-ENV_GROUP Opaque 2 7s
문제가 계속되면 진단 정보를 수집해야 함으로 이동합니다.
원인: 잘못된 형식의 SSL 인증서
진단
먼저 인증서 파일이 .PEM 파일인지 확인합니다. 올바른 형식의 SSL 인증서가 apigee-ingressgateway
에 로드되었는지 확인하려면 다음 단계를 따르세요.
옵션 1: 키/인증서 쌍에 설명된 대로 인증서/키 쌍을 사용하여 단방향 TLS를 구성한 경우 다음을 실행합니다.
openssl x509 -in $CERT_FILE -text -noout
출력 예시(오류 없음):
Certificate: Data: Version: 1 (0x0) Serial Number: 1 (0x1) Signature Algorithm: sha1WithRSAEncryption Issuer: C = US, O = xyz, OU = abc, CN = INTERIM-CN Validity Not Before: Dec 18 09:40:23 2023 GMT Not After : May 1 09:40:23 2025 GMT Subject: C = US, O = xyz, OU = abc, CN = shrey.example.com Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public-Key: (2048 bit) Modulus: Trimmed Exponent: 65537 (0x10001) Signature Algorithm: sha1WithRSAEncryption Trimmed
옵션 2: Kubernetes 보안 비밀에 설명된 대로 Kubernetes 보안 비밀을 사용하여 단방향 TLS를 구성한 경우 다음을 실행합니다.
kubectl -n apigee get secret <$SECRET_NAME> -o jsonpath='{.data.cert}'| base64 -d > certfile ; openssl x509 -in certfile -text -noout kubectl -n apigee get secret <$SECRET_NAME> -o jsonpath='{.data.cert}'| base64 -d | openssl x509 -noout -text
출력 예시(오류 없음):
Certificate: Data: Version: 1 (0x0) Serial Number: 1 (0x1) Signature Algorithm: sha1WithRSAEncryption Issuer: C = US, O = xyz, OU = abc, CN = INTERIM-CN Validity Not Before: Dec 18 09:40:23 2023 GMT Not After : May 1 09:40:23 2025 GMT Subject: C = US, O = xyz, OU = abc, CN = shrey.example.com Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public-Key: (2048 bit) Modulus: Trimmed Exponent: 65537 (0x10001) Signature Algorithm: sha1WithRSAEncryption Trimmed
위 명령어의 출력이 다음과 같을 경우
unable to load certificate 136613728412992:error:0D078095:asn1 encoding routines:asn1_item_embed_d2i:sequence not constructed:../crypto/asn1/tasn_dec.c:321:Type=X509 136613728412992:error:0906700D:PEM routines:PEM_ASN1_read_bio:ASN1 lib:../crypto/pem/pem_oth.c:33:
다음과 같은 오류의 경우
error loading certificates 8360934016:error:09FFF066:PEM routines:CRYPTO_internal:bad end line
해결 방법 섹션을 참조하세요.
해결 방법
오류는 인증서 파일의 형식 오류에 따라 다를 수 있습니다. 필요한 경우 인증서 오류를 수정합니다.
출력에 오류 대신 인증서가 표시되면 원인: SSL 키가 SSL 인증서와 일치하지 않음을 고려하세요.
원인: SSL 키가 SSL 인증서와 일치하지 않음
진단
옵션 1: 키/인증서 쌍에 설명된 대로 인증서/키 쌍을 사용하여 단방향 TLS를 구성한 경우 다음을 실행합니다.
diff -q <(openssl rsa -noout -modulus -in $KEY_FILE ) <(openssl x509 -noout -modulus -in $CERT_FILE)
출력 예시(오류 없음):
diff -q <(openssl rsa -noout -modulus -in my_server.key ) <(openssl x509 -noout -modulus -in my_server.pem) <No output>
옵션 2: Kubernetes 보안 비밀에 설명된 대로 Kubernetes 보안 비밀을 사용하여 단방향 TLS를 구성한 경우 다음을 실행합니다.
diff -q <(kubectl -n apigee get secrets $SECRET_NAME -o jsonpath='{.data.key}'| base64 -d | openssl rsa -noout -modulus) <(kubectl -n apigee get secrets $SECRET_NAME -o jsonpath='{.data.cert}'| base64 -d | openssl x509 -noout -modulus)
출력 예시(오류 없음):
diff -q <(kubectl -n apigee get secrets my-apigee-hybrid-env-grp -o jsonpath='{.data.key}'| base64 -d | openssl rsa -noout -modulus) <(kubectl -n apigee get secrets my-apigee-hybrid-env-grp -o jsonpath='{.data.cert}'| base64 -d | openssl x509 -noout -modulus) <No output>
위 명령어의 출력에 다음과 같은 오류가 표시되는 경우:
unable to load Private Key 133504499987776:error:09091064:PEM routines:PEM_read_bio_ex:bad base64 decode:../crypto/pem/pem_lib.c:949: Files /dev/fd/63 and /dev/fd/62 differ
SSL 키가 SSL 인증서와 일치하지 않으므로 해결 방법 섹션을 참조하세요.
해결 방법
올바른 비공개 키와 해당 SSL 인증서를 제공해야 합니다. 모든 비공개 키 및 SSL 인증서 문제를 해결합니다.
명령어의 출력이 표시되지 않으면 SSL 인증서와 SSL 키가 일치하는 것입니다.
진단 정보 수집 필요
이 페이지의 안내를 따른 후에도 문제가 지속되면 다음 진단 정보를 수집하여 Apigee 지원팀에 제공하세요.
- 오류가 표시되는 전체
curl
상세 출력입니다. - 오류가 표시된 머신에서
tcpdump
를 캡처한 후 민감한 정보와 IP 주소를 삭제하여 공유합니다. - 네트워크팀에 문의하여 Apigee 지원팀과 공유할 수 있도록 전체 네트워크 토폴로지와 네트워크 흐름을 준비합니다.