TLS 오류로 API 호출 실패

ApigeeApigee 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 보안 비밀 누락

진단

  1. 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 Hybrid 조직의 환경 그룹에 대해 에서 apigee-watcher가 Kubernetes 보안 비밀을 찾을 수 없음을 나타냅니다.
  2. 다음 명령어를 사용하여 Kubernetes 보안 비밀이 실제로 누락되었는지 확인합니다.
    kubectl -n apigee get secrets | grep MY_HYBRID_PROJECT-ENV_GROUP
    <no output>
    이 예시에서는 MY_HYBRID_PROJECT-ENV_GROUP의 Kubernetes 보안 비밀이 없음을 보여줍니다. 잘못 삭제되었을 수 있습니다.

해결 방법

overrides.yaml 파일에서 TLS 인증서와 주요 파일 정보를 사용하여 누락된 Kubernetes 보안 비밀을 다시 만들 수 있습니다.

  1. 다음 명령어를 실행하여 누락된 보안 비밀을 다시 만듭니다.
    apigeectl apply -f overrides/overrides.yaml --settings virtualhosts

    위 명령어의 결과는 보안 비밀이 생성되었음을 보여줍니다.

    secret/MY_HYBRID_PROJECT-ENV_GROUP created
  2. 다음 명령어를 사용하여 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 지원팀에 제공하세요.

  1. 오류가 표시되는 전체 curl 상세 출력입니다.
  2. 오류가 표시된 머신에서 tcpdump를 캡처한 후 민감한 정보와 IP 주소를 삭제하여 공유합니다.
  3. 네트워크팀에 문의하여 Apigee 지원팀과 공유할 수 있도록 전체 네트워크 토폴로지와 네트워크 흐름을 준비합니다.