503 Service Unavailable - SSL handshake エラー

Apigee Edge のドキュメントを表示しています。
Apigee X のドキュメントに移動します。
情報

症状

クライアント アプリケーションが、API 呼び出しに対するレスポンスとして、エラーコード messaging.adaptors.http.flow.SslHandshakeFailed 付きの HTTP ステータス コード 503 Service Unavailable を受け取ります。

エラー メッセージ

クライアント アプリケーションは、次のレスポンス コードを受け取ります。

HTTP/1.1 503 Service Unavailable

さらに、次のエラー メッセージも確認できます。

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

考えられる原因

Apigee Edge の Message Processor とバックエンド サーバー間の SSL handshake プロセス中に、さまざまな理由で失敗すると、エラーコード messaging.adaptors.http.flow.SslHandshakeFailed でステータス コード 503 Service Unavailable が返されることがあります。faultstring のエラー メッセージは通常、このエラーの原因となった可能性のある上位レベルの原因を示します。

faultstring で確認されたエラー メッセージに応じて、適切な手法を使用して問題のトラブルシューティングを行う必要があります。このプレイブックでは、faultstringSSL Handshake failed sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target というエラー メッセージが表示された場合に、このエラーをトラブルシューティングする方法について説明します。

このエラーは、Apigee Edge の Message Processor とバックエンド サーバー間の SSL handshake プロセス中に発生します。

  • Apigee Edge の Message Processor のtruststoreが次のようになっている場合:
    • バックエンド サーバーの完全な証明書チェーンと一致しない証明書チェーンが含まれている。
    • バックエンド サーバーの完全な証明書チェーンが含まれていない
  • バックエンド サーバーによって提示される証明書チェーンが:
    • ターゲット エンドポイントで指定されたホスト名と一致しない 完全修飾ドメイン名 (FQDN)が含まれている
    • 不正確または不完全な証明書チェーンが含まれている

この問題には、次の原因が考えられます。

原因 説明 トラブルシューティングの実施対象
Message Processor のトラストストア内の証明書または証明書チェーンが正しくない/不完全である Apigee Edge の Message Processor のトラストストアに保存されている証明書/チェーンがバックエンド サーバーの証明書チェーンと一致しないか、バックエンド サーバーの完全な証明書チェーンが含まれていません。 Edge Private Cloud と Public Cloud のユーザー
バックエンド サーバーの証明書の FQDN とターゲット エンドポイントのホスト名が一致しない バックエンド サーバーから提示された証明書に、ターゲット エンドポイントで指定されたホスト名と一致しない FQDN が含まれています。 Edge Private Cloud と Public Cloud のユーザー
バックエンド サーバーによって提示された証明書または証明書チェーンが正しくないか、不完全である バックエンド サーバーによって提示される証明書チェーンが正しくないか、不完全です。 Edge Private Cloud と Public Cloud のユーザー

共通の診断手順

次のいずれかのツールまたは手法を使用して、このエラーを診断します。

API Monitoring

手順 1: API Monitoring を使用する

API Monitoring を使用してエラーを診断するには:

  1. 適切なロールを持つユーザーとして Apigee Edge UI にログインします。
  2. 問題の調査対象となる組織に切り替えます。

  3. [Analyze] > [API Monitoring] > [Investigate] ページに移動します。
  4. エラーが発生した特定の期間を選択します。
  5. 障害コード時間をプロットします。

  6. 以下に示すように、障害コード messaging.adaptors.http.flow.SslHandshakeFailed が含まれるセルを選択します。

    大きい画像を表示

  7. 障害コード messaging.adaptors.http.flow.SslHandshakeFailed に関する情報は、次のように表示されます。

    大きい画像を表示

  8. [ログを表示 ] をクリックし、失敗したリクエストの行を開きます。

    大きい画像を表示

  9. [ログ] ウィンドウで、次の詳細を確認します。
    • リクエスト メッセージ ID
    • ステータス コード: 503
    • 障害の発生元: target
    • 障害コード: messaging.adaptors.http.flow.SslHandshakeFailed

トレース

手順 2: Trace ツールを使用する

Trace ツールを使用してエラーを診断するには:

  1. トレース セッションと、次のいずれかを有効にします。
    • エラーコード messaging.adaptors.http.flow.SslHandshakeFailed503 Service Unavailable エラーが発生するまで待つ。
    • 問題を再現できる場合は、API 呼び出しを行って問題を再現します。503 Service Unavailable
  2. [Show all FlowInfos] が有効になっていることを確認します。

  3. 失敗したリクエストのいずれかを選択し、トレースを確認します。
  4. トレースのさまざまなフェーズを調べて、障害が発生した場所を特定します。
  5. 通常、エラーは次の図に示すように、フェーズ Target Request Flow Started の後に表示されます。

    大きい画像を表示

  6. トレースから次の値をメモします。
    • エラー: 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
    • エラー 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 の値は、Apigee Edge の Message Processor がバックエンド サーバーの証明書を検証できなかったため、SSL ハンドシェイクが失敗したことを示しています。
  7. トレースの [AX](Analytics Data Recorded)フェーズに移動してクリックします。
  8. [Phase Details Error Headers] セクションまでスクロールし、次の図に示すように、X-Apigee-fault-codeX-Apigee-fault-sourceX-Apigee-Message-ID の値を確認します。

    大きい画像を表示

  9. X-Apigee-fault-codeX-Apigee-fault-sourceX-Apigee-Message-ID の値をメモします。
  10. エラー ヘッダー
    X-Apigee-fault-code messaging.adaptors.http.flow.SslHandshakeFailed
    X-Apigee-fault-source target
    X-Apigee-Message-ID MESSAGE_ID

NGINX

手順 3: NGINX アクセスログを使用する

NGINX アクセスログを使用してエラーを診断するには:

  1. Private Cloud ユーザーの場合は、NGINX アクセスログを使用して、HTTP 503 Service Unavailable に関する重要な情報を確認できます。
  2. NGINX アクセスログを確認します。

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

  3. 特定の期間にエラーコード messaging.adaptors.http.flow.SslHandshakeFailed503 エラーが発生しているかどうか(過去に問題が発生した場合)、または 503 で失敗しているリクエストがまだあるかどうかを検索します。
  4. X-Apigee-fault-code messaging.adaptors.http.flow.SslHandshakeFailed の値と一致する 503 エラーが見つかった場合は、X-Apigee-fault-source の値を特定します。

    NGINX アクセスログの 503 エラーの例:

    大きい画像を表示

    上記の NGINX アクセスログのエントリ例では、X-Apigee-fault-codeX-Apigee-fault-source に次の値が設定されています。

    ヘッダー
    X-Apigee-fault-code messaging.adaptors.http.flow.SslHandshakeFailed
    X-Apigee-fault-source target

Message Processor ログ

手順 4: Message Processor のログを使用する

  1. 一般的な診断手順の説明に従って、API Monitoring、Trace ツール、NGINX アクセスログを使用して、失敗したリクエストのいずれかのメッセージ ID を特定します。
  2. Message Processor のログ(/opt/apigee/var/log/edge-message-processor/logs/system.log)で特定のリクエスト メッセージ ID を検索します。次のエラーが表示されることがあります。

    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
    

    上記のエラーは、Message Processor とバックエンド サーバーの間で SSL handshake が失敗したことを示しています。

    その後、次のように詳細なスタック トレースを含む例外が続きます。

    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>
      

    ハンドシェイクの失敗の原因は次のとおりです。

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

    これは、Apigee Edge の Message Processor がバックエンド サーバーの証明書を検証できなかったため、SSL handshake が失敗したことを示します。

原因: Message Processor のトラストストア内の証明書または証明書チェーンが正しくないか、不完全である

診断

  1. 一般的な診断手順で説明されているように、API Monitoring、Trace ツール、NGINX アクセスログを使用して、観測されたエラーの障害コード障害ソースを特定します。
  2. Fault Codemessaging.adaptors.http.flow.SslHandshakeFailed の場合は、次のいずれかの方法でエラー メッセージを特定します。
    • 一般的な診断手順で説明されているように、Trace ツールを使用して error.cause を見つけます。
    • 共通の診断手順の説明に沿って、Message Processor のログを使用して例外を見つけます。
    • エラー メッセージに示されているように、API 呼び出しに対するエラー レスポンスから faultstring を見つけます。
  3. エラー メッセージが sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target" の場合、Apigee Edge の Message Processor がバックエンド サーバーの証明書を検証できなかったため、SSL handshake が失敗したことを示します。

この問題は次の 2 つのフェーズでデバッグできます。

  1. フェーズ 1: バックエンド サーバーの証明書チェーンを特定する
  2. フェーズ 2: Message Processor のトラストストアに保存されている証明書チェーンを比較する

フェーズ 1

フェーズ 1: バックエンド サーバーの証明書チェーンを特定する

バックエンド サーバーの証明書チェーンを特定するには、次のいずれかの方法を使用します。

openssl

次のように、バックエンド サーバーのホスト名に対して openssl コマンドを実行します。

openssl s_client -connect BACKEND_SERVER_HOST_NAME:PORT#

上記のコマンドの出力から証明書チェーンをメモします。

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. Public Cloud ユーザーは、バックエンド サーバー上で TCP/IP パケットをキャプチャします。
  2. Private Cloud ユーザーは、バックエンド サーバーまたは Message Processor 上で TCP/IP パケットをキャプチャできます。バックエンド サーバー上ではパケットが復号化されるため、バックエンド サーバー上でパケットをキャプチャすることをおすすめします。
  3. 次の tcpdump コマンドを使用して、TCP/IP パケットをキャプチャします。

    tcpdump -i any -s 0 host IP_ADDRESS -w FILE_NAME
    
  4. Wireshark ツールまたは使い慣れた類似のツールを使用して、TCP/IP パケットを分析します。

    Tcpdump の分析例

    大きい画像を表示

    • パケット 43: Message Processor(送信元)が Client Hello メッセージをバックエンド サーバー(宛先)に送信しました。
    • パケット 44: バックエンド サーバーが、Message Processor からの Client Hello メッセージを受信したことを確認応答します。
    • パケット 45: バックエンド サーバーが自身の証明書とともに Server Hello メッセージを送信します。
    • パケット 46: Message Processor が Server Hello メッセージと証明書を受信したことを確認応答します。
    • パケット 47: Message Processor は FIN, ACK メッセージを送信し、パケット 48RST, ACK を送信します。

      これは、Message Processor によるバックエンド サーバー証明書の検証が失敗したことを示します。これは、Message Processor にバックエンド サーバーの証明書と一致する証明書がないか、Message Processor のトラストストアにある証明書でバックエンド サーバーの証明書を信頼できないためです。

    • パケット 45 に戻って、バックエンド サーバーから送信された証明書チェーンを確認できます。

      大きい画像を表示

    • この例では、サーバーが common name (CN) = mocktarget.apigee.net のリーフ証明書を送信し、その後に CN= GTS CA 1D4 の中間証明書と CN = GTX Root R1 のルート証明書を送信していることがわかります。

    サーバーの証明書の検証が失敗したことを確認したら、フェーズ 2: バックエンド サーバーの証明書と Message Processor のトラストストアに保存されている証明書を比較するに進みます。

フェーズ 2

フェーズ 2: バックエンド サーバーの証明書と Message Processor のトラストストアに保存されている証明書を比較する

  1. バックエンド サーバーの証明書チェーンを特定します
  2. 次の手順で、メッセージ プロセッサのトラストストアに保存されている証明書を特定します。
    1. TargetEndpointSSLInfo セクションの TrustStore 要素からトラストストアの参照名を取得します。

      以下は TargetEndpoint 構成の SSLInfo セクションの例です。

      <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. 上記の例では、TrustStore 参照名は myCompanyTruststoreRef です。
    3. Edge UI で、[Environments] > [References] を選択します。目的のトラストストア参照の [Reference] 列にある名前をメモします。これがトラストストアの名前になります。

      大きい画像を表示

    4. 上記の例では、トラストストア名は次のとおりです。

      myCompanyTruststoreRef: myCompanyTruststore

  3. 次の API を使用して、前の手順で特定したトラストストアに保存されている証明書を取得します。

    1. キーストアまたはトラストストアの証明書をすべて取得します。この API により、特定のトラストストアの証明書の一覧が出力されます。

      パブリック クラウド ユーザー:

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

      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"
      

      ここで:

      • ORGANIZATION_NAME は組織の名前です
      • ENVIRONMENT_NAME は、環境の名前です。
      • KEYSTORE_NAME はキーストアの名前です
      • OAuth 2.0 アクセス トークンの取得の説明に従って、$TOKEN が OAuth 2.0 アクセス トークンに設定されている
      • この例で使用されている curl オプションについては、curl を使用するをご覧ください。

      出力例:

      サンプル トラストストア myCompanyTruststore の証明書は次のとおりです。

      [
        "serverCert"
      ]
    2. キーストアまたはトラストストアから特定の証明書の証明書の詳細を取得します。 この API は、特定のトラストストアにある特定の証明書に関する情報を返します。

      パブリック クラウド ユーザー:

      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"
      

      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"
      

      ここで:

      • ORGANIZATION_NAME は組織の名前です
      • ENVIRONMENT_NAME は、環境の名前です。
      • KEYSTORE_NAME はキーストアの名前です
      • CERT_NAME は証明書の名前です
      • OAuth 2.0 アクセス トークンの取得の説明に従って、$TOKEN が OAuth 2.0 アクセス トークンに設定されている
      • この例で使用されている curl オプションについては、curl を使用するをご覧ください。

      出力例:

      serverCert の詳細には、次のようにサブジェクトと発行者が表示されます。

      リーフ/エンティティ証明書:

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

      中間証明書:

      "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. ステップ 1 で取得した実際のサーバー証明書と、ステップ 3 で取得したトラストストアに保存されている証明書が一致することを確認します。一致しない場合は、それが問題の原因です。

    上記の例から、証明書を 1 つずつ見ていきましょう。

    1. リーフ証明書:

      バックエンド サーバーから:

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

      Message Processor(クライアント)のトラストストアから:

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

      トラストストアに格納されているリーフ証明書がバックエンド サーバーの証明書と一致している。

    2. 中間証明書:

      バックエンド サーバーから:

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

      Message Processor(クライアント)のトラストストアから:

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

      トラストストアに保存されている中間証明書がバックエンド サーバーの証明書と一致している。

    3. ルート証明書:

      バックエンド サーバーから:

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

      ルート証明書が Message Processor のトラストストアにまったく存在しない。

    4. トラストストアにルート証明書がないため、Message Processor は次の例外をスローします。

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

      エラーコード messaging.adaptors.http.flow.SslHandshakeFailed を含む 503 Service Unavailable をクライアント アプリケーションに返します。

解決策

  1. バックエンド サーバーの適切かつ完全な証明書チェーンがあることを確認します。
  2. Public Cloud ユーザーの場合は、 Cloud の TLS 証明書を更新するの手順に沿って、証明書を Apigee Edge の Message Processor トラストストアに更新します。
  3. Private Cloud ユーザーの場合は、 Private Cloud の TLS 証明書を更新するの手順に沿って、証明書を Apigee Edge の Message Processor トラストストアに更新します。

原因: バックエンド サーバーの証明書の FQDN とターゲット エンドポイントのホスト名が一致しない

バックエンド サーバーが、ターゲット エンドポイントで指定されたホスト名と一致しない FQDN を含む証明書チェーンを提示すると、Apigee Edge のメッセージ プロセスはエラー 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 を返します。

診断

  1. このエラーが発生している API プロキシの特定のターゲット エンドポイントを調べ、バックエンド サーバーのホスト名をメモします。

    TargetEndpoint の例:

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

    上記の例では、バックエンド サーバーのホスト名は backend.company.com です。

  2. 次の例に示すように、openssl コマンドを使用して、バックエンド サーバーの証明書の FQDN を特定します。

    openssl s_client -connect BACKEND_SERVER_HOST_NAME>:PORT_#>
    

    次に例を示します。

    openssl s_client -connect backend.company.com:443
    

    Certificate chain セクションを調べて、リーフ証明書のサブジェクトの CN の一部として指定されている FQDN をメモします。

    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
    

    上記の例では、バックエンド サーバーの FQDN は backend.apigee.net です。

  3. ステップ 1 で取得したバックエンド サーバーのホスト名とステップ 2 で取得した FQDN が一致しない場合、これがエラーの原因です。
  4. 上記の例では、ターゲット エンドポイントのホスト名は backend.company.com です。ただし、バックエンド サーバーの証明書の FQDN 名は backend.apigee.net です。一致しないため、このエラーが発生します。

解決策

この問題は、次のいずれかの方法で解決できます。

正しい FQDN

バックエンド サーバーのキーストアを正しい FQDN、有効で完全な証明書チェーンで更新します。

  1. 正しい FQDN を持つバックエンド サーバーの証明書がない場合は、適切な CA(認証局)から適切な証明書を取得します。
  2. 有効で完全なバックエンド サーバーの証明書チェーンがあることを確認します

  3. ターゲット エンドポイントで指定されたホスト名と同じ、バックエンド サーバーの正しい FQDN を含む有効で完全な証明書チェーンがリーフ証明書またはエンティティ証明書にある場合は、完全な証明書チェーンでバックエンドのキーストアを更新します。

バックエンド サーバーを修正する

正しいバックエンド サーバーのホスト名でターゲット エンドポイントを更新します。

  1. ターゲット エンドポイントでホスト名が正しく指定されていない場合は、バックエンド サーバーの証明書の FQDN と一致する正しいホスト名になるようにターゲット エンドポイントを更新します。
  2. API プロキシへの変更を保存します。

    上記の例で、バックエンド サーバーのホスト名が正しく指定されていない場合は、バックエンド サーバーの証明書の FQDN(backend.apigee.net)を使用して次のように修正できます。

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

原因: バックエンド サーバーによって提示された証明書または証明書チェーンが正しくないか、不完全である

診断

  1. 次のように、バックエンド サーバーのホスト名に対して openssl コマンドを実行して、バックエンド サーバーの証明書チェーンを取得します。
    openssl s_client -connect BACKEND_SERVER_HOST_NAME:PORT_#
    

    上記のコマンドの出力から Certificate chain をメモします。

    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. 証明書チェーンを検証するで説明されているように、適切かつ完全な証明書チェーンがあることを確認します。
  3. バックエンド サーバーの有効で完全な証明書チェーンがない場合、それがこの問題の原因です。

    上記のバックエンド サーバーの証明書チェーンの例では、ルート証明書がありません。そのため、このエラーが発生します。

解決策

有効で完全な証明書チェーンでバックエンド サーバーのキーストアを更新します。

  1. 有効で完全なバックエンド サーバーの証明書チェーンがあることを確認します

  2. バックエンド サーバーのキーストアで、有効で完全な証明書チェーンを更新します。

問題が解決しない場合は、 診断情報の収集が必要な場合に進みます。

診断情報の収集が必要な場合

上記の手順でも問題が解決しない場合は、次の診断情報を収集して Apigee Edge サポートにお問い合わせください。

  • Public Cloud ユーザーの場合は、次の情報を提供してください。
    • 組織名
    • 環境名
    • API プロキシ名
    • エラーを再現するための完全な curl コマンド
    • エラーが記録されているトレース ファイル
    • openssl コマンドの出力:

      openssl s_client -connect BACKEND_SERVER_HOST_NAME:PORT_#

    • バックエンド サーバー上でキャプチャした TCP/IP パケット
  • Private Cloud ユーザーの場合は、次の情報を提供してください。

参照