API-Aufrufe schlagen mit TLS-Fehlern fehl

Sie lesen gerade die Dokumentation zu Apigee und Apigee Hybrid.
Apigee Edge-Dokumentation aufrufen.

Symptom

Apigee Hybrid API-Anfragen schlagen mit TLS-Verbindungsfehlern fehl. Diese Fehler werden in der Regel durch Zurücksetzen der Verbindung und durch Fehler bei Benachrichtigungen beim Handshake verursacht.

Fehlermeldungen

API-Aufrufe schlagen mit TLS ähnlich dem unten gezeigten Fehler fehl, oder andere, aber nicht identische Fehler:

* 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

Mögliche Ursachen

Ursache Beschreibung Anleitungen zur Fehlerbehebung gelten für
Fehlendes Ingress-Kubernetes-Secret Das Kubernetes-Secret für org-envgroup fehlt im Apigee-Namespace. Apigee hybrid
Falsch formatiertes SSL-Zertifikat Das SSL-Zertifikat, auf das im Abschnitt "virtualhosts" der Überschreibungsdatei verwiesen wird, ist falsch formatiert. Apigee hybrid
Die SSL-Schlüssel stimmen nicht mit dem SSL-Zertifikat überein Die SSL-Schlüssel stimmen nicht mit dem SSL-Zertifikat überein, auf das im Abschnitt "virtualhosts" der Überschreibungsdatei verwiesen wird. Apigee hybrid

Ursache: Fehlendes Kubernetes-Secret für Ingress

Diagnose

  1. Analysieren Sie die Logs von apigee-watcher-Pods im Apigee-Namespace und prüfen Sie, ob Fehler vorliegen.

    Möglicherweise wird ein Fehler wie der folgende angezeigt:
    NOT_FOUND: failed to get secret "MY_HYBRID_PROJECT-ENV_GROUP"
    in namespace "apigee": secrets "MY_HYBRID_PROJECT-ENV_GROUP" not found
    Wobei:
    • MY_HYBRID_PROJECT ist der Name der Apigee Hybrid-Organisation.
    • ENV_GROUP ist der Name der Umgebungsgruppe.
    Der obige Fehler gibt an, dass apigee-watcher das Kubernetes-Secret für die oben erwähnte Umgebungsgruppe der Apigee Hybrid-Organisation nicht finden konnte.
  2. Prüfen Sie mit dem folgenden Befehl, ob die Kubernetes-Secrets tatsächlich fehlen:
    kubectl -n apigee get secrets | grep MY_HYBRID_PROJECT-ENV_GROUP
    <no output>
    In diesem Beispiel werden keine Kubernetes-Secrets für MY_HYBRID_PROJECT-ENV_GROUP angezeigt. Diese könnten fälschlicherweise gelöscht worden sein.

Lösung

Sie können die fehlenden Kubernetes-Secrets mithilfe der Informationen zu TLS-Zertifikaten und -Schlüsseldateien aus der Datei overrides.yaml neu erstellen:

  1. Führen Sie den folgenden Befehl aus, um die fehlenden Secrets neu zu erstellen:
    apigeectl apply -f overrides/overrides.yaml --settings virtualhosts

    Die Ausgabe des obigen Befehls sollte zeigen, dass das Secret erstellt wurde:

    secret/MY_HYBRID_PROJECT-ENV_GROUP created
  2. Prüfen Sie mit dem folgenden Befehl, ob die Kubernetes-Secrets erfolgreich erstellt wurden:
    kubectl -n apigee get secrets | grep MY_HYBRID_PROJECT-ENV_GROUP

    Die Ausgabe dieses Befehls sollte wie folgt aussehen:

    MY_HYBRID_PROJECT-ENV_GROUP                   Opaque                2      7s

Wenn das Problem weiterhin besteht, lesen Sie unten den Abschnitt Erfassen von Diagnoseinformationen erforderlich.

Ursache: Falsch formatiertes SSL-Zertifikat

Diagnose

Prüfen Sie zuerst, ob die Zertifikatsdatei eine PEM-Datei ist. Mit den im Folgenden aufgeführten Schritten können Sie prüfen, ob das korrekt formatierte SSL-Zertifikat in apigee-ingressgateway geladen wurde.

Wenn Sie das One-Way-TLS mit einem Zertifikat/Schlüsselpaar konfiguriert haben, wie unter Option 1: Schlüssel/Zertifikat-Paar beschrieben, Folgendes ausführen:

openssl x509 -in $CERT_FILE -text -noout

Beispielausgabe (ohne Fehler):

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

Wenn Sie eine One-Way-TLS mit einem Kubernetes-Secret konfiguriert haben, wie unter Option 2: Kubernetes-Secret beschrieben, führen Sie Folgendes aus:

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

Beispielausgabe (ohne Fehler):

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

Wenn die Ausgabe des obigen Befehls so aussieht

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:

Bei Fehlern wie

error loading certificates
8360934016:error:09FFF066:PEM routines:CRYPTO_internal:bad end line

Weitere Informationen finden Sie im Abschnitt Lösung.

Lösung

Die Fehler können je nach Formatfehler in der Zertifikatsdatei unterschiedlich sein. Beheben Sie gegebenenfalls den Zertifikatsfehler.

Wenn die Ausgabe anstelle eines Fehlers das Zertifikat anzeigt, berücksichtigen Sie die Ursache: Die SSL-Schlüssel stimmen nicht mit dem SSL-Zertifikat überein.

Ursache: Die SSL-Schlüssel stimmen nicht mit dem SSL-Zertifikat überein

Diagnose

Wenn Sie das One-Way-TLS mit Zertifikat/Schlüsselpaar konfiguriert haben, wie unter Option 1: Schlüssel/Zertifikat-Paar beschrieben, führen Sie Folgendes aus:

diff -q <(openssl rsa -noout -modulus -in $KEY_FILE ) <(openssl x509 -noout -modulus -in $CERT_FILE)

Beispielausgabe (ohne Fehler):

diff -q <(openssl rsa -noout -modulus -in my_server.key ) <(openssl x509 -noout -modulus -in my_server.pem)
<No output>

Wenn Sie eine One-Way-TLS mit Kubernetes-Secret konfiguriert haben, wie unter Option 2: Kubernetes-Secret beschrieben, führen Sie Folgendes aus:

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)

Beispielausgabe (ohne Fehler):

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>

Wenn die Ausgabe des obigen Befehls einen Fehler wie den folgenden anzeigt:

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

stimmen die SSL-Schlüssel nicht mit dem SSL-Zertifikat überein und lesen Sie den Abschnitt Lösung.

Lösung

Stellen Sie sicher, dass Sie die richtigen privaten Schlüssel und die entsprechenden SSL-Zertifikate angeben. Beheben Sie alle Probleme mit privaten Schlüsseln und SSL-Zertifikaten.

Wenn Sie keine Ausgabe des Befehls sehen, stimmen das SSL-Zertifikat und der SSL-Schlüssel überein.

Erfassen von Diagnoseinformationen erforderlich

Wenn das Problem nach Befolgen der Anleitung auf dieser Seite weiterhin besteht, sammeln Sie die folgenden Diagnoseinformationen und senden Sie sie an den Apigee-Support:

  1. Die gesamte ausführliche Ausgabe von curl, in der der Fehler angezeigt wird.
  2. Erfassen Sie eine tcpdump auf dem Computer, auf dem die Fehler angezeigt werden, und geben Sie diese frei. Entfernen Sie dazu alle vertraulichen Informationen und IP-Adressen.
  3. Halten Sie die gesamte Netzwerktopologie und den Netzwerkfluss bereit, nachdem Sie sich mit Ihrem Netzwerkteam in Verbindung gesetzt haben, um sie mit dem Apigee-Support zu teilen.