ALB→Apache443 の構成で 421 Misdirected Request が発生する理由
概要
Application Load Balancer(ALB)のHTTPS (443)リスナーから、EC2上のApacheのHTTPS (443)VirtualHost(VH)にトラフィックをSSL/TLS終端せずにそのまま転送する構成(SSLパススルー)を構築しました。
デフォルトのVirtualHostへのアクセスは正常でしたが、他のVirtualHostにアクセスした場合のみ、クライアントブラウザに421 Misdirected Requestエラーが発生しました。
Misdirected Request
The client needs a new connection for this request as the requested host name does not match the Server Name Indication (SNI) in use for this connection.
今回事象が発生した構成
- ALB(HTTPS:443) → EC2(Apache2.4.65/ HTTPS:443)
- Apache側は複数VHを443で待ち受け
- ALBには各VHの証明書を全てアタッチ済み
(ALB側ではSNIに応じた証明書は正しく返せていた状態)
原因
調べたところ、Apacheのアップデート(2.4.58以降)により、TLSハンドシェイク中により厳格なSNIチェックが強制されたことが原因のようです。
ただし、この挙動の変更はApacheの公式リリースノートでは明確に記載されておらず、仕様変更と断定できるものではありません。
実際、類似の構成で421 Misdirected Requestが発生したという報告が複数あり、ロードバランサーからApacheへSSL/TLSを終端とせずに転送する構成でSNIが正しく一致しないケースが共通しています。
今回の構成でも、ALBがバックエンドに渡すSNI情報と、実際のリクエストのHost名が一致しないケースが発生し、Apache側でSNI不整合と判断され、421エラーを返していたと考えられます。
参考
対応
ALBをSSL終端とし、HTTPSをポート80経由でApacheに転送する
それができないならApacheのバージョンダウン
1.ALBでSSLを終端し、ApacheにはHTTP(80)で転送する
ALB側でHTTPSを終端することで、SNIの不一致が発生しなくなります。
また、ALB側に証明書を集約できるため、証明書管理負担の軽減にもつながります。
クライアント → ALB(443,SSL終端) → Apache(80,HTTP)
2.Apacheのバージョンを2.4.57以下へ戻す
SSLパススルー構成を維持したい場合、Apacheバージョンダウンで回避できたという報告があります。
ただし、バージョンダウンはセキュリティリスクがあるため、あくまで暫定的な方法です。
まとめ
ALBとApache間のSSLパススルー構成は、Apacheのバージョンアップに伴うSNIチェックの厳格化により、予期せぬ421エラーを引き起こすリスクがあります。この問題を回避する安全な方法は、ALBでSSLを終端し、バックエンドにはHTTPで転送する構成へ移行することです。
Discussion