この記事は Japan AWS Ambassadors Advent Calendar 2024 の11日目の記事です。
TLS関連のニュース #182で取り上げた、AWS ALBのmTLS関連のアップデートを検証してみました。
[ALBとmTLS]
mTLSとはmutual TLS、つまり相互認証のTLSのことです。
通常のTLSでは、サーバーがクライアントにサーバー証明書を渡して、クライアントがサーバー証明書を検証します。このサーバー証明書の検証に加えて、クライアントがサーバーにクライアント証明書を渡して、サーバーがクライアント証明書を検証するのが相互認証TLSです*1。
AWS Application Load Balancer(以下ALB)がmTLSをサポートしたは2023年11月のことでした。
しかし、以下のzennの記事にもあるように、ALBのmTLS対応リリース時はクライアントに要求される認証局サブジェクト名のアドバタイズ機能が実装されていませんでした。そのため、複数のクライアント証明書を持っているクライアントの場合は、どの証明書を提示すれば良いかわからないという問題がありました。
2018年に策定されたTLS1.3の仕様では、サーバーが送信するCertificateRequest(証明書要求)メッセージにcertificate_authoritiesというTLS拡張を含め、サーバーが相互認証で受け入れ可能な認証局をクライアントに伝達できるとされています。
しかし、「The server MAY send it in the CertificateRequest message.」とMAY(しても良い)レベルなので、初期には対応されていなかったものと思われます。
[認証局サブジェクト名のアドバタイズ]
今回2024年11月から、(設定を変更すれば)ALBが送信するCertificateRequestメッセージにcertificate_authorities拡張が含まれるようになりました。設定を変更すれば、という条件つきなので、デフォルトではcertificate_authorities拡張が含まれない点に注意が必要です。
公式のリリースはこちらです。
Application Load Balancer (ALB) は、証明書の選択を簡素化するために、関連するトラストストアに保存されている認証局 (CA) サブジェクト名のアドバタイズをサポートするようになりました。この機能を有効にすると、ALB はロードバランサーに接続しようとしているクライアントに CA サブジェクト名のリストを送信します。
[certificate_authorities拡張の実験]
以下の記事を参考に、ALBのmTLS機能をデプロイして検証してみます。
▼デフォルトの設定
記事の通りにまずはデフォルトの設定でmTLS機能を有効にしたALBをデプロイします。
パケットキャプチャによる動作確認のため、Wiresharkを用意します。以下の記事を参考に、環境変数SSLKEYLOGFILEを設定しました。
諸事情により今回はFirefoxでの検証となったので、環境変数SSLKEYLOGFILEを設定後、以下のコマンドでFirefoxを起動します。
/Applications/Firefox.app/Contents/MacOS/firefox --user-data-dir="/tmp/cr"
WiresharkでパケットをキャプチャしながらFirefoxでALBにアクセスすると、以下の画像のようなパケットが観測できました。CertificateRequestメッセージの長さは41で、含まれる拡張はsignature_algorithmsのみとなっています。ALBデフォルトのmTLSの設定だと、このようにCertificateRequestメッセージにはcertificate_authorities拡張が含まれません。

▼アドバタイズ設定あり
aws-cdkを利用してALBをデプロイしたので、相互認証の設定変更のコードを書こうとしましたが、2024年12月7日リリースのv2.172.0時点のaws-cdkには該当のプロパティが存在しませんでした。
/**
* The mutual authentication configuration information
*
*/
export interface MutualAuthentication {
/**
* The client certificate handling method
*
* @default MutualAuthenticationMode.OFF
*/
readonly mutualAuthenticationMode?: MutualAuthenticationMode;
/**
* The trust store
*
* Cannot be used with MutualAuthenticationMode.OFF or MutualAuthenticationMode.PASS_THROUGH
*
* @default - no trust store
*/
readonly trustStore?: ITrustStore;
/**
* Indicates whether expired client certificates are ignored
*
* Cannot be used with MutualAuthenticationMode.OFF or MutualAuthenticationMode.PASS_THROUGH
*
* @default false
*/
readonly ignoreClientCertificateExpiry?: boolean;
}
CloudFormationのListenerのプロパティを確認すると「AdvertiseTrustStoreCaNames」が存在しています。
{
"AdvertiseTrustStoreCaNames" : String,
"IgnoreClientCertificateExpiry" : Boolean,
"Mode" : String,
"TrustStoreArn" : String
}
aws-cdkはそのうち対応されるだろうということで一旦諦めて、AWSマネジメントコンソール側で直接設定を変更することにします。AWSマネジメントコンソールを開き、ALBのリスナーの設定画面を開くと、以下のように「詳細なmTLS設定」の中に「Advertise trust store CA subject names」という設定項目が見つかりました。

「Advertise trust store CA subject names」をオンに変更して設定を保存後、再度Firefoxからアクセスしてキャプチャされたパケットがこちらです。

無事、CertificateRequestメッセージの中にcertificate_authorities拡張が含まれていることが確認できました。