[アップデート] API Gateway のバックエンド向け mTLS で ACM 証明書が使えるようになったので試してみた
いわさです。
API Gateway の REST API は、API Gateway が用意したクライアント証明書を使ってバックエンドに対して mTLS 接続をすることができます。
ただし、これまでは API Gateway が生成する証明書だけを使うことができていて、例えばバックエンド側で特定の CA で署名された証明書を使いたいとか指定がある場合に困ることがありました。
これが先日のアップデートで、AWS Certificate Manager (ACM) の証明書も REST API のステージに紐付けて、バックエンドとの相互認証に使えるようになりました。
いくつか証明書の前提条件はあるのですが、これで自前の PKI で発行したものを ACM にインポートしたり、AWS Private CA で発行したものとかを使えるようになります。
今回こちらを試してみたので紹介します。
検証環境を用意する
事前にバックエンド側として、クライアント証明書を要求する HTTPS サーバーを用意しておきます。
なんでも良いのですが今回は ALB の mTLS 機能を有効化し、Fargate で nginx を動かしてます。
API Gateway がバックエンドに送るクライアント証明書は、openssl で作った自前 CA で発行しました。
ALB のトラストストアにはこの CA を登録してあるので、この CA から発行した証明書であれば相互認証いけるはずです。
なお、今回のアップデートで ACM にインポートできるクライアント証明書にはいくつか前提条件があります。詳しくは公式ドキュメント見てほしいですが、以下のあたりが書いてありました。
- 拡張鍵用途(EKU)
- 鍵用途(KU)
- 鍵アルゴリズム
- ステータス
Extended Key Usage (EKU): If present, must include clientAuth. If absent, the certificate is accepted.
Key Usage (KU): If present, must include digitalSignature or keyAgreement. If absent, the certificate is accepted.
Key algorithm: Must be one of: RSA 2048, RSA 3072, RSA 4096, ECDSA P-256, ECDSA P-384, or ECDSA P-521
ACM certificate status: Must be ISSUED
今回の証明書は EKU に clientAuth、KU に digitalSignature を付けた RSA 2048 にしました。
で、作ったクライアント証明書(証明書本体・秘密鍵・CA チェーン)を ACM にインポートします。

REST API 側は、ルートに GET メソッドを1つ作り、HTTP 統合でバックエンドの HTTPS URL を指しています。
この時点ではステージにクライアント証明書を紐付けていません。

ちなみにこの時点ではまだステージにクライアント証明書を設定していないのですが、ここで呼び出すと mTLS に失敗するはずです。試してみますか。
$ curl -sS -w "\nHTTP %{http_code}\n" "https://ea0nfaqgok.execute-api.ap-northeast-1.amazonaws.com/prod/"
{"message": "Network error communicating with endpoint"}
HTTP 504
良いですね。Network error communicating with endpoint で 504 が返りました。
ステージに ACM 証明書を紐付ける
では、ステージの設定でクライアント証明書を設定してみましょう。
ステージ編集画面で mTLS 用の証明書を選択しようとすると、以前までは API Gateway 証明書だけが選択できたのですが、ACM を選択できるようになってます!!

ここに ACM 証明書を選ぶと、内部的には ID の代わりに ACM の ARN が設定されるようです[1]。
ステージの詳細を見ると、クライアント証明書タイプが ACM になり、選んだ証明書が紐付いています。

上記でステージにクライアント証明書を設定した状態で同じ URL をもう一度呼び出してみますか。
$ curl -sS -o /dev/null -w "HTTP %{http_code}\n" "https://ea0nfaqgok.execute-api.ap-northeast-1.amazonaws.com/prod/"
HTTP 200
お、いけましたね。
ACM 証明書は API Gateway のクライアント証明書の一覧には出てこない
なお、ステージに紐付けた ACM 証明書は、get-client-certificates には出てきませんでした。
以下で出力されているのは、過去に作った API Gateway 生成の証明書だけです。
$ aws apigateway get-client-certificates --query 'items[].clientCertificateId'
[
"q5rnbm",
"uajmc6"
]
ACM 証明書が紐付いているかはステージごとに get-stage の clientCertificateId を確認する必要がありそうです。
$ aws apigateway get-stage --rest-api-id ea0nfaqgok --stage-name prod --query clientCertificateId --output text
arn:aws:acm:ap-northeast-1:123456789012:certificate/xxxxxxxx
さいごに
本日は API Gateway のバックエンド向け mTLS で ACM 証明書が使えるようになったので試してみました。
API Gateway 証明書しか選べなかったところに、既存の PKI や Private CA での発行済み証明書を持ち込めるようになりました。
使いたかったという方はぜひ使ってみてください!







