Amazon API Gateway のバックエンド統合で SSL 証明書を使用したいのですが、エラーが発生します。
簡単な説明
API Gateway がバックエンドと SSL ハンドシェイクを実行する際、API Gateway はバックエンドより、信頼された発行元からの証明書が提供されることを期待します。API Gateway は、証明書が有効で、有効期限が切れていないことを期待します。API Gateway は、信頼の連鎖が損なわれていないことも期待します。つまり、API Gateway は、証明書にルート認証機関 (CA)、中間 CA、および親証明書の詳細が含まれていることを期待します。この情報により、API Gateway は証明書チェーンを通過する際に証明書の検証を完了できます。
解決方法
HTTP プロキシ統合をテストする
HTTP プロキシ統合について理解するには、API Gateway コンソールで Bad SSL 証明書をテストしてください。Bad SSL 証明書の詳細とテストについては、Bad SSL のウェブサイトを参照してください。
-
GET メソッドを使用して /selfsigned という名前のリソースを作成します。次に、 という URL を使用して HTTP プロキシ統合を設定します。
API Gateway コンソールから API をテストします。次のエラーが発生します。
「12月15日 (木) 16:05:05 UTC 2022 : にリクエストを送信中
12月15日 (木) 16:05:05 UTC 2022: 設定エラーにより実行に失敗しました。 PKIX パスの構築に失敗しました。sun.security.provider.certpath.SunCertPathBuilderException: 要求されたターゲットへの有効な証明書パスが見つかりませんでした」
-
GET メソッドを使用して /expiredcert という名前のリソースを作成します。次に、 という URL を使用して HTTP プロキシ統合を設定します。
API Gateway コンソールから API をテストします。次のエラーが発生します。
「12月15日 (木) 16:06:02 UTC 2022: にリクエストを送信中
12月15日 (木) 16:06:02 UTC 2022: 設定エラーにより実行に失敗しました。 PKIX パスの検証に失敗しました。java.security.cert.certPathValidatorException: 有効性チェックに失敗しました」
-
GET メソッドを使用して /untrustedRootCA という名前のリソースを作成します。 という URL を使用して HTTP プロキシ統合を設定します。
API Gateway コンソールから API をテストします。次のエラーが発生します。
「UTC 12月15日 (木) 16:06:28 UTC 2022: にリクエストを送信中
12月15日 (木) 16:06:28 UTC 2022: 設定エラーにより実行に失敗しました。 PKIX パスの構築に失敗しました。sun.security.provider.certpath.SunCertPathBuilderException: 要求されたターゲットへの有効な証明書パスが見つかりませんでした」
「PKIX パス構築失敗」エラーの解決
VPC リンク統合では、API Gateway は TLS ターミネーションを実行するネクストホップで証明書の検証を実行します。Network Load Balancer に TLS リスナーがある場合、Network Load Balancer は TLS ターミネーションを実行し、ターゲットへの別の接続を作成します。Network Load Balancer にアタッチされる証明書は、すべての要件を満たしている必要があります。Network Load Balancer は、ターゲットとの SSL ハンドシェイク中に証明書の検証を実行しない。
Network Load Balancer は、ターゲットインスタンスにインストールされている期限切れの証明書または自己署名証明書を受け入れる。Network Load Balancer とターゲットグループは VPC 内にバインドされており、通信が安全である。Network Load Balancer が TCP リスナーを使用する場合、TLS ハンドシェイクはエンドツーエンドで行われる。これらのケースにおいて、バックエンドアプリケーションは SSL 要件に準拠する必要があります。
API Gateway は、VPC リンク統合による SSL ハンドシェイク中のサーバー名表示 (SNI) をサポートします。
API Gateway がバックエンドにある Network Load Balancer 証明書の認証機関 (CA) を検証できない場合、次のエラーが表示されます。
「設定エラーにより実行に失敗しました。 PKIX パスの構築に失敗しました:
sun.security.provider.certpath.SunCertPathBuilderException: 要求されたターゲットへの有効な証明書パスが見つかりませんでした」
PKIX パス構築失敗エラーが発生する場合は、次のいずれかの証明書の問題が発生している可能性があります。
- 証明書チェーンが不完全である: SSL 証明書に期待される中間証明書が含まれていないか、完全な証明書チェーンが存在しない場合、証明書の検証に失敗します。
- ** CA がサポートされていない:** API Gateway がサポートする CA によって証明書が発行されていない場合、検証に失敗します。これは、CA による発行ではない自己署名証明書やプライベート証明書にも当てはまります。
この問題をトラブルシューティングするには、以下の手順に従ってください。
insecureSkipVerification を有効にする
注: この方法を本番環境のユースケースに使用することはベストプラクティスではありません。
エラーが発生した特定の統合で、InSecureSkipVerification オプションを true に設定します。この設定をサポートしているのは HTTP と HTTP_PROXY 統合のみであることに注意してください。このオプションを true に設定すると、API Gateway は統合エンドポイントの証明書に対する CA 検証をスキップします。これにより、自己署名証明書またはプライベート CA からの証明書を使用することもできます。
注: EXAMPLE-REST-API-ID および EXAMPLE-RESOURCE-ID は、実際に使用する値で置き換えてください。
aws apigateway update-integration --rest-api-id EXAMPLE-REST-API-ID --resource-id EXAMPLE-RESOURCE-ID --http-method GET --patch-operations "op='replace',path='/tlsConfig/insecureSkipVerification',value=true"
insecureSkipVerification が有効になっていても、API Gateway は基本的な証明書検証を実行します。この検証には、証明書の有効期限、ホスト名、ルート CA の有無の検証が含まれます。
証明書チェーンの完全性を確認する
証明書パスチェーンが完全かどうかを確認するには、次の OpenSSL コマンドを実行します。
注: このコマンドを実行するには、OpenSSL をインストールする必要があります。詳細については、OpenSSL のウェブサイトを参照してください。
$ openssl s_client -servername example.com -connect example.com:443
詳細については、OpenSSL のウェブサイトで s_client を参照してください。
証明書チェーンが完成すると、コマンドは verify ok を返します。それ以外の場合、出力は、すべてのタイプの証明書 (サポートされている CA またはサポートされていない CA) における不完全な証明書チェーンを示します。
注: さらに、API Gateway と Network Load Balancer の統合 URI が有効な最上位ドメイン (TLD) を使用していることを確認してください。API Gateway コンソールは、特定のドメイン拡張子で終わるエンドポイント URL を許可しない場合があります。
関連情報
バックエンド認証用の SSL 証明書を生成して設定する
HTTP と HTTP プロキシ統合に対して API Gateway がサポートする認証機関
Network Load Balancer のターゲットグループ
バックエンド認証用の SSL 証明書を生成して設定する