SSLを導入したWebサーバにHTTPSリダイレクトができない

サーバ

概要

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へのリダイレクトは下記のようなフローで実現されます.

HTTPリダイレクトの流れ

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

HTTPのTCPハンドシェイクが成功せず,パケットが返ってこない
WebサーバにHTTP通信を行った時のパケット.サーバから応答が返ってこない.

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

HTTPSリダイレクトの成功例
サーバからHTTP/1.1 301 Moved Permanently (リダイレクトさせる応答)が送られている.

まとめ

HTTPSにリダイレクトしたい場合はTCPポート80への通信も許可する(こんなことで数時間費やすとは….)

余談

HTTPS通信を行うとブラウザキャッシュにその情報が残っているようで,HTTPで通信開始してもWebサーバのポート443あてに[SYN]パケットを送る,というような挙動をする.(Google Chromeの場合)

実際に取れるパケットは以下のような感じ.

HTTPS通信を行った後にHTTP通信を試みたときのパケット.TCPポート80番あてのTCP 3Way HandShakeが終わる前にTCPポート443あてに通信を試みている.

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

HTTP通信しようとしたはずなのに,ブラウザが気を利かせてHTTPS通信を開始してくれている図.

コメント

  1. maniac より:

    good!!!

タイトルとURLをコピーしました