常時SSL化のする為の資料

  • 43
    Like
  • 0
    Comment

Googleの「常時SSL」の推奨とか、Let'sEncryptの発足とか、
常時httpsページ化に対する波が来ているので、
提案する為の材料とか、メリットデメリットとか、対応方法とかまとめてみた。

常時SSLとは

常時SSLとはウェブサイトの全てのページをHTTPS化するセキュリティ手法。多くの大手サイトの対応が増えている(FacebookやTwitter、YouTube、Netflix等)。
httpsに対応していれば、そのサイトが偽物の場合は警告がでるし、通信が暗号化される。

参考サイト
* 常時SSL
* 「HTTP」前提が崩れる――早く「常時SSL」にすべき理由
* Webサイト全体HTTPS化(常時SSL)の流れはもう止まらない

世の中の状況、やった方がいいわけ

https通信により通信が暗号化される

SSL対応によりhttps通信で通信が暗号化される。従来は個人情報を含むページに限られていたが、
常時SSL対応で、全てのページが暗号化されより安全になる。
公共のWifi環境だと、通信の傍受が自宅や携帯回線より簡単にされてしまうので、httpsにより暗号化がより重要になってくる。

参考サイト
* 常時SSL | シマンテック

Googleが「常時SSL」の推奨を公式発表した。

HTTPS ページが優先的にインデックスに登録されるようになります
上記にあるように、サイトががHTTPSに対応してあれば、GoogleはHTTPSページとしてインデックスするようになります。HTTPSが使われているページは良いページということでSEO上有利になる可能性があります。

HTTPS をランキング シグナルに使用します
上記でもGoogle のランキング アルゴリズムでのシグナルとして、暗号化された安全な接続をサイトで使用しているかを考慮に入れたテストを実施しているということなので、全てのページをhttps対応にした方が良さそうです。

Let's EncryptによるSSL/TLS証明書の無償化

Let's Encryptという無料でSSL証明書を取得できる取り組みがあります。これで誰でもhttpsページを用意することができるようになっている。

参考サイト
* Let's Encrypt 総合ポータル

HTTP Strict Transport Security(HSTS)対応のサイトが増えている。

httpsページ対応したとしても、httpでアクセスされたら意味が無い。
HTTPヘッダにセットすることで、ブラウザがHTTPで接続した際に、強制的にHTTPSへリダイレクトし、以降のそのドメインへの接続はすべてHTTPSとする機能として、HTTP Strict Transport Security(HSTS)がある。既にメジャーブラウザではこの機能に対応しており、
この設定をしているサイトが増えてきている。(Google、Twitter、Facebook等々)

参考サイト
* HSTS (HTTP Strict Transport Security) の導入
* cybozu.com を真に常時 SSL にする話

Service Workerを使うためにはhttps対応にする必要がある

Webページとは別にバックグラウンドで実行するJavaScriptとしてService Workerという機能がある。
これでWebでもプッシュ通知の様なことができる。
これを使うためにはページがhttpsであることが必要。

参考サイト
* Service Worker の紹介

Firefox DeveloperEditionでは、ログインフォームがhttpだと警告が出る。

ログインフォームがhttpのページだった場合、Firefox DeveloperEditionでは、アドレスバーやコンソールにエラーメッセージが出る。
ログインフォームのPOST先のURLがhttpsであれば、https通信となるが、ログインフォームのURLもhttpsさせることで、ログインフォーム自身が改ざんされていなことが判断できるためらしい。
TOPページにログインフォームが設置されているサイトがあったりするが、その場合はTOPページもhttpsにした方が良いことになるので、それなら常時SSL対応してしまった方が良いのではないか。

参考サイト
* 安全でないパスワード
* 高木浩光@自宅の日記 SSLを入力画面から使用しないのはそろそろ「脆弱性」と判断してしまってよいころかも

Mozillaがブラウザ新機能はHTTPSサイトのみサポート

Mozillaがブラウザ新機能はHTTPSサイトのみサポートとしてきたため、HTTPページでは使えない、正常に動作しない機能が出てくる可能性がある。

参考サイト
* ブラウザ新機能はHTTPSサイトのみサポートへ、Mozillaが表明

2017年1月にリリースのChrome 56からhttpページにパスワードの入力フォームがあると警告が表示される。

突然「保護されていません」と警告が!?Chromeの新しい安全性表示にあるようにhttpページ内にパスワードの入力フォームがあると「!」アイコンと「保護されていません」の表示がアドレスバーに表示される。
これを見て不安になる人がいるかもしれない。

2017年10月にリリースのChrome 62からhttpページに入力フォームがあると警告が表示される。

サイト内検索にも警告が?Chromeが10月にさらにセキュリティ強化
のサイトによると、10月にリリースのChrome 62から、検索フォームなど、テキストボックスがhttpページに含まれるとアドレスバーに警告が表示される。シークレットモードだとhttpであればテキストボックスがなくても警告が表示される。それほど目立たない警告かもしれないけど、「Not Secure」と出れば不安になるかもしれない。
あと、Cookpad開発者ブログ Web サービスの完全 HTTPS 化にもあるように、検索キーワードにダイエットとか持病とかあまり知られたくない情報を入れる場合があるかもしれないので。

気をつけること、デメリットなど

SSL/TLS証明書の準備、対応

常時SSL対応にするにはSSL/TLS証明書を準備する必要がある。価格が年間数千円〜十数万円するので
余分にお金がかかってしまう。
Let's Encryptという無料の仕組みもあるが、有効期間は90日で更新が面倒だし、商用サイトで使うのはどうなのだろうかというところがある。
CDN(Contents Delivery Network)やロードバランサーを導入していれば必要なSSL/TLS証明書が増えてコストがかかってしまう可能性がある。
使用しているツール類がすべてhttps通信に対応しているか確認が必要。

SSL/TLSによるパフォーマンスへの影響

SSL/TLSによる暗号化により、パフォーマンスに影響が出る可能性がある。
SSLアクセラレータ、ロードバランサーの導入で回避することは可能。

HTTP/2やSPDYの対応により、将来的にはhttps通信の方が速くなることが期待できる。

参考サイト
* Webの表示速度を遅くする「SSLハンドシェイク」とは
* 常時 SSL 化による Web サイト表示速度向上の可能性について
* 常時SSL | シマンテック

SSL/TLSで暗号化されたことにより、攻撃データも暗号化される。

SSL/TLSで暗号化されることによって、ユーザのデータが暗号されるが。
攻撃者のトラフィックも暗号化されてしまい、IDS/IPSなどのセキュリティ製品での検知が難しくなる。

参考サイト
* 常時SSL化の落とし穴
* 「SSL暗号化通信に隠れた攻撃をあぶり出す」ブルーコート

URLを書き換える手間がいる

相対パスで指定されていれば良いが、
リンク内のURLがhttpになっていたら、httpsに置き換える必要がある。
canonicalが設定されていたらそれも書き換える必要がある。CDNのリンクもhttpsにする必要がある。

参考サイト
* 常時SSL導入の注意点とSSLページのインデックスまでにかかる時間

Facebookのいいねがリセットされてしまう。

http→httpsと変わっただけでもURLが変わったことになるので、Facebookのいいねはリセットされてしまう。
og:urlに旧 URL(つまり httpのURL)を指定すれば引き継がれるらしいが、ずっと旧URLを指定し続けないといけないかとか気になる。

参考サイト
* 常時https/SSL化してもFacebook記事の「いいね!」数を引き継ぐ方法

すぐにやったほうがいいのか

やれるならやったほうがいいけれど、あわてて急ぐ必要は多分ない。

  • SEO的にはhttpsの方が優位だが、他の要因に比べると微々たるもの。
  • 全ページhttpsにした方がセキュリティが高くなるが、どこを暗号化すべきかはサイトによる。
  • 内部リンクの置き換えは割と手間がかかる、システム側で生成するところだけじゃなく、デザイナーさんが修正している部分とかもちゃんと把握しておく必要がある。

ただし、https対応はトレンドだし、いずれ全てのサイトはhttps化していくと思うので、他に優先事項があったとしても準備はしておいた方が良いと思う。

対応方法

SSL証明書を準備する

部分的にでもhttps対応していれば、 そのSSL証明書使えば良いので、追加の証明書は不要。CDNを使用していてhttpsに対応していなければ、追加のSSL証明書が必要。CDNサービス側が提供しているSSL証明書を使うのでも良い。

URLを書き換える。

サイト内のhttpになっているところを全てhttpsに書き換える。サイトマップXMLやAtomフィード、canonicalなど漏れがないように。メルマガ等のリンク先の置き換えも忘れずに。

リダイレクトの設定をする。

外部のサイトからリンクされている。古いメルマガのリンクをクリックした、Googleでまだインデックスされていない場合があるので、httpでアクセスされたら、httpsにリダイレクトの設定をする。

HSTS (HTTP Strict Transport Security) の設定

ブラウザ側で次回以降はhttpsで接続するために、httpヘッダー情報にHSTSを設定する。初回アクセス時や、HSTS未対応のブラウザのためにも、リダイレクトの設定と併用で設定する。TwitterやFacebookを参考にする。
これが設定されていれば、リダイレクトする前にブラウザ側でhttpsに切り替えてくれる。IE11でも対応しているので、実際のところリダイレクトはしなくてもいける気はする。

Strict-Transport-Security:max-age=有効期間秒数;includeSubDomains

Apacheの場合

<VirtualHost *:443>
    ServerName example.com
    SSLEngine on
    Header set Strict-Transport-Security "max-age=31536000; includeSubDomains"
</VirtualHost>`

max-ageで指定した期間、設定が有効になってしまうので、もしやめたい場合は、max-age=0にする。

参考サイト
* HSTS (HTTP Strict Transport Security) の導入
* HTTP Strict Transport Security
* HSTS をやめる方法

SEO関連、ツール設定

Google Analytics、Search Consoleの設定をhttpsに対応させる。
Search Consoleは、httpとhttps両方設定しておく。

参考サイト
* 常時SSL化の際に必要なGoogle系ツールの設定

実際やってみて、大変だと思ったところ、気になったところ。

httpで書かれている箇所探し

  • デザイナーさんが作ったhtmlファイルとか、css、javascriptとか、自分が把握できていない箇所が割とたくさんある。grepでヒットしたものを一つずつチェックしないといけない。
  • データベースなどの内にhttpで書かれているURLがあるか探す。こっちはgrepというわけにはいかないので、怪しいところをLIKE文とかで一つずつ探す。

  • デザイナーさんには切り替え以降はhttpsでURLを書いてもらうようにお願いする。出来れば相対パスにしてもらう。事前に数週間後にアップするデザインを準備していたりしている場合もあるので、いつから切り替えるかを確認しておく。

  • 特定の条件でしか出力しない場所にhttpが使われている等、綿密なテストが必要な箇所については、後日に回すなど、対応に優先順位をつけるとか。

  • HTMLのメルマガなどもhttpsに変える?やっぱり常時SSLにする以上 メルマガのHTMLもhttpsしないといけない??

  • 外部の提携しているサービスで使われているところ探し。Google Search Consoleだけじゃない、Bing - Web マスター ツールだってある。Facebookの公式ページとか、SNS関連のページがあったらそのプロフィール欄のURLを一つずつ変えていかないといけない。ブログとかTwitterとか過去記事とかまでは書き変えずに転送設定に任せたほうがいいかどうかとか。

「混在コンテンツ」(mixed content) の存在

  • httpsページ中にhttpで参照されてしまう箇所があるかチェック。
  • httpsページにscriptがhttpで参照されるブロックされて動作しなくなってしまう。
  • httpsページにimgやcss等がhttpで参照されていたら、ブラウザに警告が表示される。
  • httpsページにiframeがhttpで参照されていたら、中身が表示されない場合がある。

  • 逆に、httpページでajaxでhttpsのURLと通信しようとすると、クロスドメインと判定されて拒否されてしまうようだ。
    HTTPのページからJavaScriptでHTTPSで通信する方法

  • ページの一部をキャッシュするような設定にしていた場合、その箇所だけがhttpで残ってしまってmixed contentになる可能性がある。切り替え時点はキャッシュしないようにする、もしくは、先にhttpsに置き換えできるなら切り替えておくとか。

サイトの転送

  • httpでアクセスしてきた場合はhttpsに置き換えてリダイレクトするが、計測用のパラメータも引き継ぐようにする。 http://www.example.com/AAA/BBB?cid=XXX はcid=XXXも引き継いで転送させる。
    固定でhttps://www.example.com/AAA/BBB にリダイレクトするとかなっているかもしれないので。

  • HSTSを導入すると楽。ブラウザでアクセスする場合は2回目のアクセスからは全てhttpsでアクセスされるようになる。主要ブラウザは全て対応しているので(IE11も)。

  • さらにプリロードHSTSを使っていれば、最初からhttpsでアクセスされるようになる。1回目からhttpsでアクセスできていれば不正な手段でDNS書き換えられていても気付けるか。

  • クローラーなどはHSTS関係なくアクセスが来たりするので、必要なところはリダイレクトは設置する。

SEOのこと

  • 切り替えることでどのくらい変動する気になるが計測できていない。
  • httpsに置き換えたサイトマップXMLをpubsubhubbubを使ってすぐ反映されるように促す。
  • canonicalの設定 が間違っていないか確認。この設定が間違っていると誤ったURLでインデックスされてしまう。ちゃんとhttpsにしているか。

  • Googleの検索結果がhttpsに切り替わり始めるのは数日かかる。ほぼ切り替わるのは2週間程度だという情報もある。

参考になる事例とか