macOS の Safari で、https://www.manabii.info/ のリンクから、https://ipv6.manabii.info/ へ遷移した時に「421 Misdirected Request errors」が表示されて、散々悩んだのだけれど、解決したメモ。
原因は、サーバ側で Apache において SNI と HTTP/2 とワイルドカード TLS 証明書の条件が重なっていたからのようだ。
具体的には、以下のような構成を取っていた。
- サーバ側では HTTP/2 と HTTP/1.1 を利用可能としていた。
- TLS パラメータは下記証明書を除き、全てのバーチャルホストで同じとしていた。
- https://www.manabii.info/ ではコモンネーム「*.manabii.info」というワイルドカード証明書を利用。
- https://ipv6.manabii.info/ では、https://6.ipv6.manabii.info/ というホストもあるので、コモンネームが「ipv6.manabii.info」で、SANsに「6.ipv6.manabii.info」が入ったマルチドメイン証明書を利用。
ところが、macOS の Safari (HTTP/2 対応) において、https://www.manabii.info/ を表示した後に https://ipv6.manabii.info/ を表示するパターンで、表題のエラーが発生していた。
つまり、ブラウザで https://www.manabii.info/ を表示した後で、https://ipv6.manabii.info/ を表示するとき、HTTP/2 では www.manabii.info で使用した既に開いている通信を利用するので、*.manabii.info のワイルドカード証明書での TLS 接続状態で ipv6.manabii.info にアクセスしようとするための模様だ。
解決方法としては、以下の通り。
- https://ipv6.manabii.info/ のバーチャルホストでは、*.manabii.info のワイルドカード証明書を使い、6.ipv6.manabii.info の ServerAlias は削除する。
- https://6.ipv6.manabii.info/ を別のバーチャルとして設定し、コモンネームが「6.ipv6.manabii.info」の証明書を使用する。
HTTP/2 の SNI では、SSL パラメータは全てのバーチャルホストで同一とする必要があるのは知っていたのだけれど、まさか上記のような罠があるとは。