#4858

暗号化通信の罠


web制作


久々にWeb系作業でドツボにハマったので反省を込めてメモ。
先週末に初めてSSL証明書なるものを購入し、
自分の管轄するサイトもいよいよ暗号化に対応することとなったわけですが、
その際に厄介になるのがURLの自動設定でした。
暗号化接続をするばあい、URLの先頭部分は「https」となります(これをURIスキームという)。
なので暗号化通信に新たに対応した際には、
旧アドレスであるところの「http」に「s」をくっつけたURLに転送する必要があり、
ここでは.htaccessという設定ファイルをいじることになります。

基本的にはURIスキームをいじるだけなら少し検索するだけでノウハウがいくらでも出てきます。
が、それをサブドメインにも適用したいとなるといろいろと面倒くさいことになるようです。
まず、SSL証明書はひとつのホスト名に対してのみ発行されるもので、
「example.com」に発行したからといって「www.example.com」や「ja.example.com」といった
同じドメインの違う文字列にも適用されるわけではありません。
メインのホスト名だけ発行した状態でサブドメインにHTTPS接続しようとすると、
エラーが出てサイトが表示されなくなります。

今回は暗号化接続のための証明書に「chr.mn」を指定して取得したのですが、
特設サイト「pik4.chr.mn」ではパスワードのやりとりもあるため
こちらを暗号化したい気持ちも前々からありました。
そこで、.htaccessを用いて「pik4.chr.mn」へのアクセスがあった場合、
「chr.mn/pik4」へ転送されるように設定したのですが、
ほどなくしてユーザーから「Twitter連携で生成したURLを踏むとhttps://pik4.chr.mnに飛ぶ」
という報告があがりました。このURLは上述の説明の通り、
発行時に申請したホスト名に一致しないので証明書のエラーが出ることになります。

でも理屈から言って、暗号化接続の有無にかかわらずメインドメイン以下に飛ばすようにすれば
そもそも不正URLにはアクセスできないようにできるはず……
と、先ほどまで延々と.htaccessと格闘していたのですが、押しても引いても解決できず。
リファレンスやマニュアルなどのサイトを50タブくらい読みあさっても思い通りの挙動にならず、
途方に暮れていると次のような情報が出てきました。

httpのリクエストが勝手にhttpsにリダイレクトされるときはStrict-Transport-Securityを疑おう – べにやまぶろぐ

ルートの.htaccessでこのHSTSが有効になっていると、
ルート以下のドメインすべてが自動的にHTTPS接続になったり、
さらにキャッシュされてサーバーサイドではどうにもならなくなってしまう可能性。
.htaccessの転送設定を一掃しても非暗号化接続が勝手に暗号化接続されてしまうので、
誤ってこの設定を有効にしてしまった可能性は否定できません。
あるいは.htaccess自体がブラウザにキャッシュされていて反映されていないとか……?
試しにプライベートブラウジングからアクセスしようとしてみると
何の問題もなく最新の.htaccessの挙動が反映されていました。

サブドメインもHTTPS接続させる設定は、
ホスト名ごとに証明書の発行が必要なSSL接続の仕様と噛み合っていない気がするのですが……。
まぁ、いずれにしてもアクセス制御の勉強不足を感じた一日でした。
.htaccessは検索しても根本的なところから解説しているサイトが少ないように思われ、
Web関連の他作業と比べても今ひとつ頭に入ってこないもどかしさを感じています。
こういうニッチなものこそ本に頼るべきなのかもしれませんね……。

コメントを残す