🔧

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エラーを返していたと考えられます。

参考
https://www.linkedin.com/posts/cloudwithusama_aws-devops-cloudarchitecture-activity-7352004762814291968-fKPl

https://www.reddit.com/r/apache/comments/1m1sl6w/apache_421_misdirected_request/?tl=ja

対応

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