503 Service indisponible – Échec de handshake SSL

Vous consultez la documentation Apigee Edge.
Accédez à la documentation Apigee X.

Problème constaté

L'application cliente reçoit un code d'état HTTP 503 Service Unavailable avec le code d'erreur messaging.adaptors.http.flow.SslHandshakeFailed en réponse aux appels d'API.

Message d'erreur

L'application cliente reçoit le code de réponse suivant :

HTTP/1.1 503 Service Unavailable

De plus, le message d'erreur suivant peut s'afficher :

{
   "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"
      }
   }
}

Causes possibles

Vous pouvez obtenir le code d'état 503 Service Unavailable avec le code d'erreur messaging.adaptors.http.flow.SslHandshakeFailed en raison d'un échec lors du processus de handshake SSL entre le processeur de messages d'Apigee Edge et le serveur de backend pour plusieurs raisons. Le message d'erreur dans faultstring indique généralement une cause possible de haut niveau ayant entraîné cette erreur.

En fonction du message d'erreur observé dans faultstring, vous devez utiliser les techniques appropriées pour résoudre le problème. Ce guide explique comment résoudre ce problème si le message d'erreur 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 s'affiche dans faultstring.

Cette erreur se produit lors du processus de handshake SSL entre le processeur de messages d'Apigee Edge et le serveur de backend :

  • Si le truststore du processeur de messages d'Apigee Edge :
    • Contient une chaîne de certificats qui ne correspond pas à la chaîne de certificats complète du serveur backend, OU
    • Ne contient pas la chaîne de certificats complète du serveur backend
  • Si la chaîne de certificats présentée par le serveur de backend :
    • Contient un nom de domaine complet (FQDN) qui ne correspond pas au nom d'hôte spécifié dans le point de terminaison cible
    • Contient une chaîne de certificats incorrecte ou incomplète

Voici les causes possibles de ce problème :

Cause Description Instructions de dépannage applicables
Chaîne de certificats ou certificat incorrect ou incomplet dans le truststore du processeur de messages Le certificat et/ou sa chaîne stockés dans le truststore du Processeur de messages d'Apigee Edge ne correspondent pas à la chaîne de certificats du serveur backend ou ne contiennent pas la chaîne de certificats complète du serveur backend. Utilisateurs du cloud public et privé Edge
Le nom de domaine complet du certificat du serveur backend ne correspond pas au nom d'hôte du point de terminaison cible. Le certificat présenté par le serveur backend contient un nom de domaine complet qui ne correspond pas au nom d'hôte spécifié dans le point de terminaison cible. Utilisateurs d'Edge Private Cloud et Edge Public Cloud
Certificat ou chaîne de certificats incorrects/incomplets présentés par le serveur de backend La chaîne de certificats présentée par le serveur de backend est incorrecte ou incomplète. Utilisateurs d'Edge Private Cloud et Edge Public Cloud

Étapes de diagnostic courantes

Utilisez l'un des outils/techniques suivants pour diagnostiquer cette erreur :

Surveillance des API

Procédure 1 : Utiliser la surveillance des API

Pour diagnostiquer l'erreur à l'aide d'API Monitoring :

  1. Connectez-vous à l'UI Apigee Edge en tant qu'utilisateur disposant d'un rôle approprié.
  2. Basculez vers l'organisation dans laquelle vous souhaitez examiner le problème.

  3. Accédez à la page Analyser > API Monitoring > Examiner.
  4. Sélectionnez la période spécifique au cours de laquelle vous avez observé les erreurs.
  5. Représentez graphiquement Code d'erreur par rapport à Heure.

  6. Sélectionnez une cellule contenant le code d'erreur messaging.adaptors.http.flow.SslHandshakeFailed, comme indiqué ci-dessous :

    ( Agrandir l'image)

  7. Les informations sur le code d'erreur messaging.adaptors.http.flow.SslHandshakeFailed s'affichent comme indiqué ci-dessous :

    ( Agrandir l'image)

  8. Cliquez sur Afficher les journaux , puis développez la ligne correspondant à la demande ayant échoué.

    ( Agrandir l'image)

  9. Dans la fenêtre Journaux, notez les informations suivantes :
    • ID du message de demande
    • Code d'état : 503
    • Source de la défaillance : target
    • Code d'erreur : messaging.adaptors.http.flow.SslHandshakeFailed

Trace

Procédure 2 : Utiliser l'outil Trace

Pour diagnostiquer l'erreur à l'aide de l'outil Trace :

  1. Activez la session de trace et l'une des options suivantes :
    • Attendez que l'erreur 503 Service Unavailable se produise avec le code d'erreur messaging.adaptors.http.flow.SslHandshakeFailed.
    • Si vous pouvez reproduire le problème, effectuez l'appel d'API pour le reproduire. 503 Service Unavailable
  2. Assurez-vous que l'option Afficher toutes les FlowInfos est activée :

  3. Sélectionnez l'une des requêtes ayant échoué et examinez la trace.
  4. Parcourez les différentes phases de la trace et identifiez l'emplacement de l'échec.
  5. L'erreur se trouve généralement après la phase Target Request Flow Started (Flux de requête cible démarré), comme indiqué ci-dessous :

    ( Agrandir l'image)

  6. Notez les valeurs suivantes à partir de la trace :
    • Erreur : 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
    • La valeur de l'erreur 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 indique que le handshake SSL a échoué, car le processeur de messages d'Apigee Edge n'a pas pu valider le certificat du serveur de backend.
  7. Accédez à la phase AX (données Analytics enregistrées) dans la trace, puis cliquez dessus.
  8. Faites défiler la page jusqu'à la section En-têtes d'erreur liés aux détails de la phase et déterminez les valeurs de X-Apigee-fault-code, X-Apigee-fault-source et X-Apigee-Message-ID, comme indiqué ci-dessous :

    ( Agrandir l'image)

  9. Notez les valeurs de X-Apigee-fault-code, X-Apigee-fault-source et X-Apigee-Message-ID :
  10. En-têtes d'erreur Valeur
    X-Apigee-fault-code messaging.adaptors.http.flow.SslHandshakeFailed
    X-Apigee-fault-source target
    X-Apigee-Message-ID MESSAGE_ID

NGINX

Procédure 3 : Utiliser les journaux d'accès NGINX

Pour diagnostiquer l'erreur à l'aide des journaux d'accès NGINX :

  1. Si vous êtes un utilisateur Private Cloud, vous pouvez utiliser les journaux d'accès NGINX pour déterminer les informations clés sur HTTP 503 Service Unavailable.
  2. Vérifiez les journaux d'accès NGINX :

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

  3. Recherchez les éventuelles erreurs 503 avec le code d'erreur messaging.adaptors.http.flow.SslHandshakeFailed pendant une durée spécifique (si le problème s'est produit dans le passé) ou s'il existe des requêtes qui échouent toujours avec 503.
  4. Si vous trouvez des erreurs 503 avec le X-Apigee-fault-code correspondant à la valeur de messaging.adaptors.http.flow.SslHandshakeFailed, déterminez la valeur de X-Apigee-fault-source.

    Exemple d'erreur 503 dans le journal d'accès NGINX :

    ( Agrandir l'image)

    L'exemple d'entrée ci-dessus du journal d'accès NGINX présente les valeurs suivantes pour X-Apigee-fault-code et X-Apigee-fault-source :

    En-têtes Valeur
    X-Apigee-fault-code messaging.adaptors.http.flow.SslHandshakeFailed
    X-Apigee-fault-source target

Journaux du processeur de messages

Procédure 4 : Utiliser les journaux du processeur de messages

  1. Déterminez l'ID de message de l'une des requêtes ayant échoué à l'aide d'API Monitoring, de l'outil Trace ou des journaux d'accès NGINX, comme expliqué dans Étapes de diagnostic courantes.
  2. Recherchez l'ID du message de requête spécifique dans le journal du processeur de messages (/opt/apigee/var/log/edge-message-processor/logs/system.log). L'erreur suivante peut s'afficher :

    org:myorg env:test api:MyProxy rev:1
    messageid:myorg-28247-3541813-1
    NIOThread@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
    

    L'erreur ci-dessus indique que le handshake SSL a échoué entre le processeur de messages et le serveur de backend.

    Une exception avec une trace de la pile détaillée s'affichera ensuite, comme indiqué ci-dessous :

    org:myorg env:test api:MyProxy rev:1
    messageid:myorg-28247-3541813-1
    NIOThread@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 target
    	at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:397)
    	at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:302)
    	... <snipped>
      

    Notez que l'échec de l'établissement de la liaison est dû aux raisons suivantes :

    Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

    Cela indique que le handshake SSL a échoué, car le processeur de messages d'Apigee Edge n'a pas pu valider le certificat du serveur de backend.

Cause : certificat ou chaîne de certificats incorrects/incomplets dans le truststore du processeur de messages

Diagnostic

  1. Déterminez le code d'erreur et la source de l'erreur observée à l'aide de la surveillance des API, de l'outil Trace ou des journaux d'accès NGINX, comme expliqué dans Étapes de diagnostic courantes.
  2. Si le code d'erreur est messaging.adaptors.http.flow.SslHandshakeFailed, déterminez le message d'erreur à l'aide de l'une des méthodes suivantes :
  3. Si le message d'erreur est sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target", cela indique que le handshake SSL a échoué, car le processeur de messages d'Apigee Edge n'a pas pu valider le certificat du serveur de backend.

Vous pouvez déboguer ce problème en deux phases :

  1. Phase 1 : Déterminez la chaîne de certificats du serveur de backend
  2. Phase 2 : Comparez la chaîne de certificats stockée dans le truststore du Message Processor.

Phase 1

Phase 1 : Déterminez la chaîne de certificats du serveur de backend

Utilisez l'une des méthodes suivantes pour déterminer la chaîne de certificats du serveur de backend :

openssl

Exécutez la commande openssl sur le nom d'hôte du serveur de backend comme suit :

openssl s_client -connect BACKEND_SERVER_HOST_NAME:PORT#

Notez la chaîne de certificats à partir du résultat de la commande ci-dessus :

Exemple de chaîne de certificats de serveur de backend à partir du résultat de la commande 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

  1. Si vous êtes un utilisateur du cloud public, capturez les paquets TCP/IP sur le serveur de backend.
  2. Si vous êtes un utilisateur du cloud privé, vous pouvez capturer les paquets TCP/IP sur le serveur backend ou le processeur de messages. Dans l'idéal, capturez-les sur le serveur de backend, car les paquets y sont déchiffrés.
  3. Utilisez la commande tcpdump suivante pour capturer les paquets TCP/IP :

    tcpdump -i any -s 0 host IP_ADDRESS -w FILE_NAME
    
  4. Analysez les paquets TCP/IP à l'aide de l'outil Wireshark ou d'un outil similaire que vous connaissez.

    Exemple d'analyse de Tcpdump

    ( Agrandir l'image)

    • Paquet 43 : le processeur de messages (source) a envoyé un message Client Hello au serveur backend (destination).
    • Paquet 44 : le serveur backend accuse réception du message Client Hello du processeur de messages.
    • Paquet 45 : le serveur backend envoie le message Server Hello ainsi que son certificat.
    • Paquet 46 : le processeur de messages accuse réception du message Server Hello et du certificat.
    • Paquet 47 : le processeur de messages envoie un message FIN, ACK suivi de RST, ACK dans le paquet 48.

      Cela indique que la validation du certificat du serveur de backend par le processeur de messages a échoué. En effet, le processeur de messages ne dispose d'aucun certificat correspondant à celui du serveur de backend ou ne peut pas faire confiance au certificat du serveur de backend avec les certificats disponibles dans son truststore (celui du processeur de messages).

    • Vous pouvez revenir en arrière et examiner le paquet 45 pour déterminer la chaîne de certificats envoyée par le serveur backend.

      ( Agrandir l'image)

    • Dans cet exemple, vous pouvez voir que le serveur a envoyé un certificat de feuille avec common name (CN) = mocktarget.apigee.net, suivi d'un certificat intermédiaire avec CN= GTS CA 1D4 et d'un certificat racine avec CN = GTX Root R1.

    Si vous avez déterminé que la validation du certificat du serveur a échoué, passez à la phase 2 : comparer le certificat du serveur backend et les certificats stockés dans le truststore du processeur de messages.

Phase 2

Phase 2 : Comparez le certificat du serveur backend et les certificats stockés dans le truststore du processeur de messages.

  1. Déterminez la chaîne de certificats du serveur de backend.
  2. Déterminez le certificat stocké dans le truststore du processeur de messages en procédant comme suit :
    1. Obtenez le nom de référence du truststore à partir de l'élément TrustStore dans la section SSLInfo du TargetEndpoint.

      Examinons un exemple de section SSLInfo dans une configuration TargetEndpoint :

      <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>
    2. Dans l'exemple ci-dessus, le nom de référence TrustStore est myCompanyTruststoreRef.
    3. Dans l'interface utilisateur Edge, sélectionnez Environnements > Références. Notez le nom dans la colonne Référence pour la référence spécifique du truststore. Il s'agit du nom de votre truststore.

      ( Agrandir l'image)

    4. Dans l'exemple ci-dessus, le nom du truststore est le suivant :

      myCompanyTruststoreRef : myCompanyTruststore

  3. Obtenez les certificats stockés dans le truststore (déterminé à l'étape précédente) à l'aide des API suivantes :

    1. Obtenez tous les certificats pour un keystore ou un truststore. Cette API liste tous les certificats du truststore spécifique.

      Utilisateur du cloud public :

      curl -v -X GET https//api.enterprise.apigee.com/v1/organizations/ORGANIZATION_NAME/environments/ENVIRONMENT_NAME/keystores/KEYSTORE_NAME/certs -H "Authorization: Bearer $TOKEN"
      

      Utilisateur 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"
      

      Où :

      • ORGANIZATION_NAME est le nom de l'organisation.
      • ENVIRONMENT_NAME est le nom de l'environnement.
      • KEYSTORE_NAME est le nom du keystore.
      • $TOKEN est défini sur votre jeton d'accès OAuth 2.0, comme décrit dans la section Obtenir un jeton d'accès OAuth 2.0.
      • Les options curl utilisées dans cet exemple sont décrites dans Utiliser curl.

      Exemple de résultat :

      Les certificats du truststore de l'exemple myCompanyTruststore sont les suivants :

      [
        "serverCert"
      ]
    2. Obtenez les détails d'un certificat spécifique à partir d'un Keystore ou d'un Truststore. Cette API renvoie des informations sur un certificat spécifique dans le truststore spécifique.

      Utilisateur du cloud public :

      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"
      

      Utilisateur du 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"
      

      Où :

      • ORGANIZATION_NAME est le nom de l'organisation.
      • ENVIRONMENT_NAME est le nom de l'environnement.
      • KEYSTORE_NAME est le nom du keystore.
      • CERT_NAME est le nom du certificat.
      • $TOKEN est défini sur votre jeton d'accès OAuth 2.0, comme décrit dans la section Obtenir un jeton d'accès OAuth 2.0.
      • Les options curl utilisées dans cet exemple sont décrites dans Utiliser curl.

      Exemple de résultat

      Les détails de serverCert affichent le sujet et l'émetteur comme suit :

      Certificat de feuille/d'entité :

      "subject": "CN=mocktarget.apigee.net",
      "issuer": "CN=GTS CA 1D4, O=Google Trust Services LLC, C=US",

      Certificat intermédiaire :

      "subject" : "CN=GTS CA 1D4, O=Google Trust Services LLC, C=US",
      "issuer" : "CN=GTS Root R1, O=Google Trust Services LLC, C=US",
  4. Vérifiez que le certificat de serveur réel obtenu à l'étape 1 et le certificat stocké dans le truststore obtenu à l'étape 3 correspondent. Si elles ne correspondent pas, il s'agit de la cause du problème.

    Dans l'exemple ci-dessus, examinons un certificat à la fois :

    1. Certificat feuille :

      Depuis le serveur de backend :

      s:/CN=mocktarget.apigee.net
      i:/C=US/O=Google Trust Services LLC/CN=GTS CA 1D4

      À partir du truststore du processeur de messages (client) :

      "subject": "CN=mocktarget.apigee.net",
      "issuer": "CN=GTS CA 1D4, O=Google Trust Services LLC, C=US",

      Le certificat feuille stocké dans le truststore correspond à celui du serveur backend.

    2. Certificat intermédiaire :

      Depuis le serveur de backend :

      s:/C=US/O=Google Trust Services LLC/CN=GTS CA 1D4
      i:/C=US/O=Google Trust Services LLC/CN=GTS Root R1

      À partir du truststore du processeur de messages (client) :

      "subject" : "CN=GTS CA 1D4, O=Google Trust Services LLC, C=US",
      "issuer" : "CN=GTS Root R1, O=Google Trust Services LLC, C=US",

      Le certificat intermédiaire stocké dans le truststore correspond à celui du serveur de backend.

    3. Certificat racine :

      Depuis le serveur de backend :

      s:/C=US/O=Google Trust Services LLC/CN=GTS Root R1
      i:/C=US/O=Google Trust Services LLC/CN=GTS Root R1

      Le certificat racine est totalement absent du truststore du processeur de messages.

    4. Étant donné que le certificat racine est manquant dans le truststore, le processeur de messages génère l'exception suivante :

      sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

      et renvoie 503 Service Unavailable avec le code d'erreur messaging.adaptors.http.flow.SslHandshakeFailed aux applications clientes.

Solution

  1. Assurez-vous de disposer de la chaîne de certificats appropriée et complète du serveur backend.
  2. Si vous êtes un utilisateur du cloud public, suivez les instructions de la section Mettre à jour un certificat TLS pour le cloud afin de mettre à jour le certificat dans le truststore du processeur de messages d'Apigee Edge.
  3. Si vous êtes un utilisateur du cloud privé, suivez les instructions de la section Mettre à jour un certificat TLS pour le cloud privé afin de mettre à jour le certificat dans le truststore du processeur de messages Apigee Edge.

Cause : le nom de domaine complet du certificat du serveur de backend ne correspond pas au nom d'hôte du point de terminaison cible.

Si le serveur backend présente une chaîne de certificats contenant un FQDN qui ne correspond pas au nom d'hôte spécifié dans le point de terminaison cible, le processeur de messages d'Apigee Edge renvoie l'erreur 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.

Diagnostic

  1. Examinez le point de terminaison cible spécifique du proxy d'API dans lequel vous constatez cette erreur et notez le nom d'hôte du serveur backend :

    Exemple de TargetEndpoint :

    <TargetEndpoint name="default">
       …
       <HTTPTargetConnection>
          <Properties />
          <SSLInfo>
             <Enabled>true</Enabled>
             <TrustStore>ref://myTrustStoreRef</TrustStore>
          </SSLInfo>
          <URL>https://backend.company.com/resource</URL>
       </HTTPTargetConnection>
    </TargetEndpoint>

    Dans l'exemple ci-dessus, le nom d'hôte du serveur de backend est backend.company.com.

  2. Déterminez le nom de domaine complet dans le certificat du serveur backend à l'aide de la commande openssl, comme indiqué ci-dessous :

    openssl s_client -connect BACKEND_SERVER_HOST_NAME>:PORT_#>
    

    Exemple :

    openssl s_client -connect backend.company.com:443
    

    Examinez la section Certificate chain et notez le nom de domaine complet spécifié dans le nom commun (CN) du sujet du certificat feuille.

    Certificate chain
     0 s:/CN=backend.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
    

    Dans l'exemple ci-dessus, le nom de domaine complet du serveur de backend est backend.apigee.net.

  3. Si le nom d'hôte du serveur backend obtenu à l'étape 1 et le nom de domaine complet obtenu à l'étape 2 ne correspondent pas, il s'agit de la cause de l'erreur.
  4. Dans l'exemple ci-dessus, le nom d'hôte du point de terminaison cible est backend.company.com. Toutefois, le nom de domaine complet dans le certificat du serveur backend est backend.apigee.net. Comme ils ne correspondent pas, vous obtenez cette erreur.

Solution

Pour résoudre ce problème, vous pouvez utiliser l'une des méthodes suivantes :

Nom de domaine complet correct

Mettez à jour le keystore du serveur de backend avec le nom de domaine complet correct, ainsi qu'une chaîne de certificats valide et complète :

  1. Si vous ne disposez pas d'un certificat de serveur de backend avec le nom de domaine complet approprié, procurez-vous le certificat approprié auprès d'une autorité de certification.
  2. Vérifiez que vous disposez d'une chaîne de certificats de serveur backend valide et complète.

  3. Une fois que vous disposez de la chaîne de certificats valide et complète avec le nom de domaine complet correct du serveur backend dans le certificat de feuille ou d'entité, qui est identique au nom d'hôte spécifié dans le point de terminaison cible, mettez à jour le keystore du backend avec la chaîne de certificats complète.

Corriger le serveur backend

Mettez à jour le point de terminaison cible avec le nom d'hôte du serveur backend approprié :

  1. Si le nom d'hôte a été spécifié de manière incorrecte dans le point de terminaison cible, mettez à jour le point de terminaison cible pour qu'il comporte le nom d'hôte correct correspondant au nom de domaine complet dans le certificat du serveur backend.
  2. Enregistrez les modifications apportées au proxy d'API.

    Dans l'exemple ci-dessus, si le nom d'hôte du serveur backend a été spécifié de manière incorrecte, vous pouvez le corriger en utilisant le nom de domaine complet du certificat du serveur backend, c'est-à-dire backend.apigee.net, comme suit :

    <TargetEndpoint name="default">
       …
       <HTTPTargetConnection>
          <Properties />
          <SSLInfo>
             <Enabled>true</Enabled>
             <TrustStore>ref://myTrustStoreRef</TrustStore>
          </SSLInfo>
          <URL>https://backend.apigee.net/resource</URL>
       </HTTPTargetConnection>
    </TargetEndpoint>

Cause : certificat ou chaîne de certificats incorrects/incomplets présentés par le serveur de backend

Diagnostic

  1. Obtenez la chaîne de certificats du serveur de backend en exécutant la commande openssl sur le nom d'hôte du serveur de backend, comme suit :
    openssl s_client -connect BACKEND_SERVER_HOST_NAME:PORT_#
    

    Notez le Certificate chain dans le résultat de la commande ci-dessus.

    Exemple de chaîne de certificats de serveur de backend à partir du résultat de la commande 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. Vérifiez que vous disposez de la chaîne de certificats appropriée et complète, comme expliqué dans la section Valider la chaîne de certificats.
  3. Si vous ne disposez pas de la chaîne de certificats valide et complète pour le serveur backend, il s'agit de la cause de ce problème.

    Dans l'exemple de chaîne de certificats du serveur de backend ci-dessus, le certificat racine est manquant. Par conséquent, vous obtenez cette erreur.

Solution

Mettez à jour le keystore du serveur backend avec une chaîne de certificats valide et complète :

  1. Vérifiez que vous disposez d'une chaîne de certificats de serveur de backend valide et complète.

  2. Mettez à jour la chaîne de certificats valide et complète dans le keystore du serveur backend.

Si le problème persiste, consultez la page Vous devez collecter des informations de diagnostic.

Vous devez collecter des informations de diagnostic

Si le problème persiste, même après avoir suivi les instructions ci-dessus, rassemblez les informations de diagnostic suivantes, puis contactez l'assistance Apigee Edge :

  • Si vous êtes un utilisateur du cloud public, veuillez fournir les informations suivantes :
    • Nom de l'organisation
    • Nom de l'environnement
    • Nom du proxy d'API
    • Commande curl complète pour reproduire l'erreur
    • Fichier de trace affichant l'erreur
    • Résultat de la commande openssl :

      openssl s_client -connect BACKEND_SERVER_HOST_NAME:PORT_#

    • Paquets TCP/IP capturés sur le serveur de backend
  • Si vous êtes un utilisateur du cloud privé, fournissez les informations suivantes :
    • Message d'erreur complet observé
    • Bundle de proxy d'API
    • Fichier de trace affichant l'erreur
    • Journaux du processeur de messages /opt/apigee/var/log/edge-message-processor/logs/system.log
    • Résultat de la commande openssl :
      openssl s_client -connect BACKEND_SERVER_HOST_NAME:PORT_#
    • Paquets TCP/IP capturés sur le serveur de backend ou le processeur de messages.
    • Sortie de l'API Get all certificates for a keystore or truststore (Obtenir tous les certificats pour un keystore ou un truststore), ainsi que les détails de chaque certificat obtenu à l'aide de l'API Get Cert Details from a Keystore or Truststore (Obtenir les détails d'un certificat à partir d'un keystore ou d'un truststore).

Références