TLS エラーで API 呼び出しが失敗する

現在、ApigeeApigee ハイブリッドのドキュメントを表示しています。
Apigee Edge ドキュメントを表示する

症状

TLS 接続エラーで Apigee ハイブリッド 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

考えられる原因

原因 説明 トラブルシューティングの実施対象
Ingress Kubernetes Secret がない org-envgroup の Kubernetes Secret が Apigee 名前空間にありません。 Apigee ハイブリッド
SSL 証明書の形式が正しくない オーバーライド ファイルの virtualhosts セクションで参照されている SSL 証明書の形式が正しくありません。 Apigee ハイブリッド
SSL 鍵が SSL 証明書と一致しない SSL 鍵が、オーバーライド ファイルの virtualhosts セクションで参照されている SSL 証明書と一致しません。 Apigee ハイブリッド

原因: Ingress Kubernetes Secret がない

診断

  1. apigee 名前空間内の apigee-watcher Pod のログを分析し、エラーがあるかどうかを確認します。

    次のようなエラーが発生することがあります。
    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 ハイブリッド組織の名前です。
    • ENV_GROUP は、環境グループの名前です。
    前述のエラーは、apigee-watcher が Apigee ハイブリッド組織の上の環境グループの Kubernetes Secret を見つけられなかったことを示します。
  2. 次のコマンドを使用して、Kubernetes Secret が実際に欠落していることを確認します。
    kubectl -n apigee get secrets | grep MY_HYBRID_PROJECT-ENV_GROUP
    <no output>
    この例は、MY_HYBRID_PROJECT-ENV_GROUP の Kubernetes Secret が存在しないことを示しています。誤って削除された可能性があります。

解決策

overrides.yaml ファイルの TLS 証明書と鍵ファイル情報を使用して、欠落している Kubernetes Secret を再作成できます。

  1. 次のコマンドを実行して、欠落している Secret を再作成します。
    apigeectl apply -f overrides/overrides.yaml --settings virtualhosts

    上のコマンドの出力には、Secret が作成されたことが示されます。

    secret/MY_HYBRID_PROJECT-ENV_GROUP created
  2. 次のコマンドを使用して、Kubernetes Secret が正常に作成されたことを確認します。
    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 Secret で説明されているように Kubernetes Secret を使用して一方向 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 Secret で説明されているように Kubernetes Secret を使用して一方向 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 サポートと共有するネットワーク トポロジ全体とネットワーク フローの準備を整えてください。