公開日:2014/09/13
ホームページでもシステムでもwebで公開する場合はとにかくセキュリティ対策が必須。
というわけでこのホームページもSSL(Secure Socket Layer)を導入。
ログインページとか決済ページとかでURLらへんに鍵マークの出るアレ。
URLのhttp://がhttps://になるアレ。
サーバとのデータのやり取りが暗号化されて安心よ!みたいなアレ。
そんなアレを導入するまでの作業をメモしとく。
SSL証明書を用意
SSL通信をするためにはサーバ所有者を証明&暗号化の鍵となる電子証明書がいる。
自作すると無償で用意できる(オレオレ証明書と呼ぶらしい)けど身内だけとかテスト用途でしか使えない。
※レンタルサーバの証明書を借りてSSL通信(共有SSL)てのもあるけどURLが共有スペースのものになっちゃうからこれも本番じゃ無理。
普通は有償でちゃんとした認証局(ベイサインとかシマンテックとか)に発行してもらう。
自社サーバだったりVPSの場合には認証局を選べるけどレンタルサーバの場合は扱ってる認証局の中から選ぶことになる。
そしてこのホームページはドメインキングのレンタルサーバに設置されてたりする。
ドメインキングの場合はグローバルサイン一択の模様(´・ω・`)なんでやねん
とりあえず一番安くて早く発行してもらえるアルファSSLを購入してみる。
高いお金を払うと認証局のサイトシールをもらえたり企業実在証明てのができたりするけど今回はそこまでやる気はない( ゚д゚)
SSL証明書をインストール
SSL証明書を発行してもらったらwebサーバにインストールする作業。
なんだけどレンタルサーバの場合はインストール作業はやってもらえちゃう_(:3 」∠)_ 出番なし
常時SSLを導入
インストール作業が終わったら早速プロトコルをhttp://→https://と変えて接続テスト。
とおった( ゚д゚)鍵マークついた!鍵マークぽちったらwww.smartllc.jpて出た!
ちょっぴり嬉しかった(ノ´∀`*)
しかしこのままだとhttpでもアクセスできてしまう。
今までの常識?だと暗号化すべきデータをやり取りする場面でだけSSL通信にすればいいて思ってたけど
これからの常識は常にSSL通信(常時SSL)ぽい。Googleも最近トップページからhttps://てつくよになったね。
というわけで設定したいがレンタルサーバの場合は直接webサーバに手を入れることができない。
が、webサーバがApacheの場合はホームページ単位に設定を追加できる。
ルートディレクトリに.htaccessなるファイルを置いてやると毎回読み込んでくれる。サーバ再起動もいらない。
(というかレンタルサーバは再起動できない&毎回読み込みたくないけどレンタルサーバだから仕方ない)
こんな記述をしてみた。
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L,NE]
</IfModule>
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=2592000"
</IfModule>
1つ目の記述はHTTPSがoffの場合はhttps:に301リダイレクトという必殺技。
※NEオプション=No Escape=%でエスケープしたURLがさらにエスケープされるのを防ぐ
2つ目の記述は次回以降SSLで通信するようブラウザに指示を出す(HSTSと略すらしい)必殺技。
※max-ageオプション=有効期間(秒)=60秒×60分×24時間×30日=2592000秒の設定
HSTSがChromeでは動作したけどIEでは動作しなかった。よって上の記述も必要。
IfModule~の部分はそのモジュールがインストールされてる場合のみて意味。
試しにIEとかChromeとかXperiaからhttp://で接続してみる。
どうやってもhttps://になることを確認( ゚д゚)!
めでたく常時SSLに対応☆-(ノ゚Д゚)八(゚Д゚ )ノイエーイ
おまけ
常時SSLは導入したけどまだやることが残ってた。
URLの統一化_(:3 」∠)_ ひぃ
デフォルトだとsmartllc.jp/でもwww.smartllc.jp/でもそのままアクセスできてしまう。wwwの有無ね。
さらにwww.smartllc.jp/でもwww.smartllc.jp/index.phpでもそのままアクセスできてしまう。index.phpの有無ね。
これらは全てSEO的には別URLになるらしい。
それはもったいない( ゚д゚)さっぱりSEO対策なんてしてないけど
というわけでこれも.htaccessに記述。
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^smartllc\.jp
RewriteRule ^(.*)$ https://www.smartllc.jp/$1 [R=301,L,NE]
RewriteCond %{THE_REQUEST} ^.*/index.php
RewriteRule ^(.*)index.php$ https://www.smartllc.jp/$1 [R=301,L,NE]
</IfModule>
1つ目の記述はwwwがついてない場合はつけてリダイレクトという必殺技。
※ついでにSSL
2つ目の記述はindex.phpがついてる場合は省いてリダイレクトという必殺技。
※同じくついでにSSL
常時SSLとまとめてみた。
<IfModule mod_rewrite.c>
RewriteEngine on
#URL統一
RewriteCond %{HTTP_HOST} ^smartllc\.jp
RewriteRule ^(.*)$ https://www.smartllc.jp/$1 [R=301,L,NE]
RewriteCond %{THE_REQUEST} ^.*/index.php
RewriteRule ^(.*)index.php$ https://www.smartllc.jp/$1 [R=301,L,NE]
#常時SSL
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L,NE]
</IfModule>
#HSTS
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=2592000"
</IfModule>
これで下記のURLのどれでアクセスされてもhttps://www.smartllc.jp/に☆-(ノ゚Д゚)八(゚Д゚ )ノイエーイ
・http://www.smartllc.jp/index.php
・http://www.smartllc.jp/
・http://smartllc.jp/index.php
・http://smartllc.jp/
・https://www.smartllc.jp/index.php
・https://smartllc.jp/index.php
・https://smartllc.jp/
Cipher Suite(SSLで使われる暗号セット)とSSLv3の無効化が.htaccessで設定できなくて困ってるなう。
助けて。