概要
WebサーバにHTTPでアクセスした際にHTTPSにリダイレクトされなかった
結論
WebサーバのTCPポート80へのアクセスを許可すると,適切にHTTPSにリダイレクトされる
環境
- Webサーバ
- OS:Amazon Linux 2
- Apache ver2.4.57
- SSL証明書
- Let’s Encryptを利用
- そのほか
- TCPポート443番を開放
内容
起きた現象は以下
- WebサーバにはHTTPSリダイレクトの設定を行っている
/etc/httpd/conf/httpd.conf
にリダイレクトの設定あり<VirtualHost *:80>
ServerAdmin root[WebサーバのFQDN]
DocumentRoot /var/www/html
ServerName [WebサーバのFQDN]
RewriteEngine on
RewriteCond %{SERVER_NAME} =[WebサーバのFQDN]
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost *:80>
- ブラウザのアドレスバーに
http://[WebサーバのFQDN]
と入力しても通信できない - ブラウザのアドレスバーに
https://[WebサーバのFQDN]
と入力すると通信できる
HTTPSへのリダイレクトは下記のようなフローで実現されます.

なので,WebサーバのTCPポート80への通信を許可していないと,最初のTCP 3Way HandShakeが確立できずに通信が失敗します.実際にWiresharkなどのパケットアナライザで通信を見てみると,以下のように一向にサーバから[SYN,ACK]のパケットが返ってきません.

TCPポート80への通信を許可すると,以下のようにリダイレクトされ,HTTPS通信が開始されていることがわかります.

HTTP/1.1 301 Moved Permanently
(リダイレクトさせる応答)が送られている.まとめ
HTTPSにリダイレクトしたい場合はTCPポート80への通信も許可する(こんなことで数時間費やすとは….)
余談
HTTPS通信を行うとブラウザキャッシュにその情報が残っているようで,HTTPで通信開始してもWebサーバのポート443あてに[SYN]パケットを送る,というような挙動をする.(Google Chromeの場合)
実際に取れるパケットは以下のような感じ.

この場合はTCPポート80番が閉じていてもHTTP通信を開始したときに自動的にHTTPS通信に切り替わる(ように見える).そのためリダイレクトできているように見えてしまうが,実際はキャッシュクリアすると切り替わらなくなるし,自分以外のクライアントはリダイレクトできていないので注意.

コメント
good!!!