概要
いろいろあって低いSSLバージョンでのアクセスは弾くことになりました。
まぁまぁ今更感がありますが、やっといた方が良いような気はしますよね。
Apacheの設定でチョチョイのチョイなんですが、案外丁寧にやってる記事が少なかったのでメモ。
普通のやり方
TLSバージョンを見て、アクセスを弾く。まずはこれで行こうと考えますよね。
SSLProtocol +TLSv1.2
しかし実際この対応をしてサーバーにアクセスすると下の画像のように表示され、じゃあどうすればええねんということがわかりにくい。
今どきTLS1.2対応していないブラウザでアクセスしようとする人なんてほぼいないだろうし別に良い気もしますが、もし古代のアーティファクトを使い続けている方々がこの画面を見たときどうすれば良いかは絶対にわからんだろうと思いますね。
もしも表示された通り「Webサイトの所有者に問い合わせ」なんぞされた日にはどこから説明したらいいやらw
ちなみに参考にしようと思った某ヤホーや某ネズミーランドのサイトでは(おそらく)この対応がなされてます。
丁寧で良さげなやり方
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{SSL:SSL_PROTOCOL} !^TLSv1\.2$
RewriteRule ^(.*) 遷移させたいURL [R=301,L]
</IfModule>
TLSバージョンを見て、別のURLにリダイレクトさせる。
これならどうすればいいかを案内出来ますね。実際これで実装しようと思ったけどうちでは結局採用しませんでしたが。
いや普通はこの設定で良さげな気がします。
(おそらく)〇〇カードマン!のサイトではこの対応をしてそうですね。なんとなく雑な印象があったので正直見直しました。
今回採用したやり方
挙げた2件で全然実装出来ると思うんですが、プロキシの設定やらなんやらが競合?してうまく動かず大変に面倒だったので
今回はSSL_PROTOCOLをPHPの環境変数から取得し、そこで煮るなり焼くなり好きにすることにしました。
<?php
echo $_SERVER['SSL_PROTOCOL'];
?>
うちのサーバーは外部アクセスはHTTPSで、サーバー間の通信はHTTPで行っているため下記設定をしないとSSL環境変数が抜け落ちてしまい参照出来ませんでした。
RequestHeader set X-Forwarded-SSL-Protocol %{SSL_PROTOCOL}s
これでどん詰まっていたのですが、冷静に考えたら当たり前ですね...
まとめ
今回は導線をはっきりさせるべく丁寧にやりましたが、正直必要があるかと言われたらあんまり要らない気もします。
該当する人数ももうかなり少ないし。
実際、TLSv1.1の通信でセキュリティソフトのサイトをいくつか閲覧しましたが、弾かれるところもありましたが普通にアクセスできるところもありました。
トークン等含む個人情報さえ通信しなければ基本的には問題にならないですもんね(もしこんな危険性がありますというのがあれば教えて下さい)
もしも今更ながら対応する必要が出てきた人の参考になれば幸いです。
参考にしたサイト
PHPでSSLバージョンを判別する方法
httpsで受け取ったSSLバージョンを、httpで別のサーバーに受け渡す際に引き渡したい。
Apache モジュール mod_headers
[Apache] TLSのバージョンによって処理を変更する
Apache httpd で接続を許すSSL/TLSのバージョンを制限する方法