HTTPSとは? SSLとは? 通信の暗号化と認証機能

SSLでHTTPS化する方法

SSLでHTTPS化する方法

最近のブラウザは、HTTPでのアクセス時に「安全ではない」と警告する仕様になってきました。企業サイトはもちろん、個人サイトでも「危険」だとは表示されたくありませんよね。将来はHTTPSでアクセスできない全ページが警告対象になります。警告範囲の狭いうちに、HTTPSでアクセスできるよう対策しておきましょう。

今回は、SSL証明書を取得してHTTPサイトをHTTPSサイト化する(=HTTPSでアクセス可能にする)方法を解説いたします。

【本記事の目次】


HTTPSとは? 通信の暗号化と認証機能

ブラウザのアドレス欄内に、通信が安全かどうかのサインが表示されるようになった

ブラウザのアドレス欄内に、通信が安全かどうかのサインがアイコンや文字で表示されるようになった (Chrome59での表示例)

最近のブラウザは、ウェブページにHTTPSでアクセスできていない場合(=通信が暗号化されていない場合)には「保護されていない」などの警告を表示するようになってきました。

ウェブサーバとの通信状況に応じて、右図のようにアドレス欄の端にアイコンや文字で警告が表示されます。右図は上から順に、
  1. HTTPSで通信できている場合
  2. HTTPSで通信しようとしているが、できていない場合
  3. 保護が必要だと思われるページにHTTPで通信している場合
  4. その他のページにHTTPで通信している場合 ……の表示例です。


 
Googleの新方針でHTTPS化が広まってきた
安全ではないと警告される可能性のあるページを教えてくれるGoogle Search Consoleからのメール

安全ではないと警告される可能性のあるページを教えてくれるGoogle Search Consoleからのメール

ここ最近でHTTPS化が進んだのは、Googleが示した「Chromeでは、ウェブサイトをHTTPで閲覧した際に、通信が安全ではない旨の警告を表示する」という方針からです。それ以後、他の代表的なブラウザにも同様の仕様が追加されました。

Google Search Consoleを使っている場合は、右図のようなメールを受け取ったことがあるかもしれません。通信の暗号化が望ましいページがHTTPS化できていない場合に、そのURLを列挙して警告してくれています。


 
当初は入力フォームのあるページだけが対象だが
掲示板の投稿欄でも「ログイン情報が漏洩する」と警告されてしまうこともある

掲示板の投稿欄でも「ログイン情報が漏洩する」と警告されてしまうこともある (Firefox54での表示例)

本稿執筆時点での警告対象は、Googleの方針(※)ではクレジットカード番号などの個人情報を入力するページや、ログインフォームのあるページなど、特に安全性が重要なページだけです。しかし、ブラウザによっては掲示板(BBS)の投稿フォームのような場所でも警告が表示されます。

※将来的にはあらゆるウェブサイトが対象になる方針ですから、いずれはどんなページでも警告されるようになるでしょう。
参考:Chrome の HTTP 接続におけるセキュリティ強化に向けて(Googleウェブマスター向け公式ブログ)


 

HTTPとHTTPSの違い、HTTPS化に必要な「SSL証明書」とは

そもそも「HTTPとHTTPSでの通信は何が違うのか」と、「HTTPSで通信するためには何が必要なのか」の2点を押さえておきましょう。特に難しい話ではありません。

HTTPとHTTPSの違い
暗号化せずに通信するのがHTTP/暗号化して通信するのがHTTPS

暗号化せずに通信するのがHTTP/暗号化して通信するのがHTTPS

HTTPSの「S」はSecure(セキュア)の略で、通信が暗号化されていて安全であることを示しています。
  • HTTP通信では、URLの先頭が http://~ です。
  • HTTPS通信では、URLの先頭が https://~ です。

HTTPとHTTPSの違いは、通信が暗号化されているかどうかです。通信が暗号化されていれば、通信経路上で通信内容が盗聴されたり改ざんされたりする事態を防げます。特に個人情報を扱うようなウェブサイトでは暗号化が必須でしょう。


 
SSLとは
ウェブサイトの運営者(運営組織)の身元を確認するSSL証明書

ウェブサイトの運営者(運営組織)の身元を確認するSSL証明書

SSLは、通信を暗号化する仕組み(プロトコル)の名称で、Secure Sockets Layerの略です。通信の暗号化だけでなく、ウェブサイトの運営者(運営組織)の身元を認証する役割もあります。そのために必要なのが、SSL証明書というデータです。

HTTPSで通信したい場合には、URLの先頭を https://~ にするだけでは不十分で、ウェブサイト側にSSL証明書が必要です。SSL証明書の存在しないウェブサイトでは、URLの先頭を https://~ にしてもアクセスできません。

つまり、自サイトをHTTPS化するためには、SSL証明書の取得が必要です。


 

SSL証明書の種類(3つの認証レベル)と取得条件

SSLサーバ証明書の認証レベルの違いについて、さくらインターネットによる分かりやすい説明

SSL証明書の認証レベルには3種類がある (さくらインターネットによる分かりやすい比較表)

HTTPSで通信するために必要なSSL証明書には、以下に示す3種類の認証レベルがあります。どの認証レベルでも、通信が暗号化される点は同じです。

認証レベル1(ドメイン認証)
個人でも取得可能なSSL証明書です。ほぼ、通信を暗号化するためだけに使うようなものです。すぐに発行される上、費用も安く済みます。無料のSSL証明書もあります(後述)。

認証レベル2(企業認証)
その企業・組織が実在するのかどうか(その国で登記されているのかどうか)を確認した上で発行されるSSL証明書です。法人でないと取得できません。ウェブサイトにこの認証レベルのSSL証明書が使われていれば、実在する企業によって運営されているウェブサイトだと判断できます。そのため、ウェブサイトに対する信頼度が上がるでしょう。

EV認証だと、ウェブサイトを運営している企業名がアドレス欄の端に表示される

EV認証だと、ウェブサイトを運営している企業名がアドレス欄の端に表示される (りそな銀行の例)

認証レベル3(EV認証)
書類上の確認だけでなく、その企業が本当に存在しているのか、その企業の担当者が本当にSSL証明書を申請したのか、といった点を電話などの連絡手段も使って確認した上で発行されるSSL証明書です。(※EVはExtended Validationの略)

このSSL証明書を使っているウェブサイトでは、右図のようにアドレス欄の端に運営企業名が表示されます。銀行のオンラインバンキングサイトなどにアクセスすると、図のように銀行名が表示されるでしょう。今アクセスしているウェブサイトが「本当に自分の望んでいる企業が運営しているウェブサイトなのか?」という点を確認しやすく、最も信頼度の高いSSL証明書です。

どの認証レベルのSSL証明書を取得するか
個人ならドメイン認証しか取得できませんから選択肢は1つだけです。認証レベルが高くなるにつれ、取得費用も高くなります。企業サイトであっても、物販などで個人情報(クレジットカード情報など)を集めるようなサイトなど、強く身元を明らかにしておかないと信頼が得られないようなサイトでない限りはドメイン認証でも充分でしょう。


 

SSL証明書を取得してHTTPS化するには

お使いのレンタルサーバにSSL証明書を取得する機能があればそれを使いましょう。たいていはコントロールパネルから手続きできます。方法はサーバによって様々ですから具体的な操作方法は各サーバのヘルプをご参照下さい。(例:ロリポップ, さくらインターネット)

Let's Encryptによる無料のSSL証明書もある
Let's Encryptによる無料SSL証明書を簡単に取得して使えるレンタルサーバもある (ロリポップの例)

Let's Encryptによる無料SSL証明書を簡単に取得して使えるレンタルサーバもある (ロリポップの例)

ドメイン認証のSSL証明書は、Let's Encryptという認証局を使うことにより無料で取得することもできます。Let's Encryptは、全てのウェブサーバで暗号化通信を実現することを目的に作られた認証局で、ドメイン認証のSSL証明書を無料で発行しています。

レンタルサーバによっては、このLet's Encryptによる無料のSSL証明書を簡単に取得して使用できる機能を用意している場合もあります。

SSL証明書には有効期限がある
SSL証明書には期限があり、更新しなければ失効してしまいます。SSL証明書の期限が切れていると、ブラウザは下図のように警告だけを表示してウェブページそのものは表示しません。SSL証明書を取得した後は、失効させないよう気をつける必要があります。

有効期限が切れて失効したSSL証明書を使ったウェブサイトは、警告が表示されて閲覧できない (Edgeでの表示例)

有効期限が切れて失効したSSL証明書を使ったウェブサイトは、警告が表示されて閲覧できない (Edgeでの表示例)




 

HTTPでのアクセスをHTTPSにリダイレクトする設定方法(.htaccessファイルの書き方)

SSL証明書を取得して、実際にHTTPSでアクセスできることを確認できたら、最後に「常にHTTPSでアクセスされる」よう設定を加えておきましょう。そうすれば、HTTPでリンクされていたりブックマークされていたりする場合でも、HTTPSでのアクセスに統一できます。また、Googleなどの検索結果でもHTTPSで表示されるようになります。

HTTPでのアクセスをHTTPSでのアクセスに転送(リダイレクト)する方法
自サイトが www.example.com のとき、すべてのアクセスを https://www.example.com/ へ転送するには、.htaccessファイルに以下のように記述します。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]
</IfModule>
3行目で「HTTPSではない」状態を判別し、4行目でHTTPSのURLに転送しています。1・2・5行目は、Rewriteモジュールを使うための記述なので、このままコピー&ペーストして下さい。

なお、一般的な記述は上記の通りですが、レンタルサーバに「さくらインターネット」を使っている場合は、以下のように書く必要があります。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP:X-Sakura-Forwarded-For} ^$
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]
</IfModule>
3行目の「HTTPSではない」状態を判別する記述内容だけが先程と異なります。

上記のソースはどちらも、HTTPステータスコードに301を返すことで転送する方法です。もし、テスト段階であるなど何らかの事情でSSL証明書を外す(=HTTPSからHTTPに戻す)可能性があるなら、301ではなく302で転送しておく方が良いでしょう。301で転送するとブラウザがキャッシュするので、たとえ.htaccessファイルから転送設定を削除したとしても、ブラウザ側が最初から移転先URLにアクセスしてしまうからです。なお、301ではなく302で転送したい場合は、「R=301」の部分を「R=302」に書き換えて下さい。

meta要素にもURLを書いているなら、https://で始まるURLに変えておく
HTMLソース内にmeta要素を使って rel="canonical" の記述を加えているなら、そこもhttps://で始まるURLに変えておきましょう。
<link rel="canonical" href="https://www.example.com/">
このように記述しておくと、(HTTPとHTTPSのどちらでもアクセス可能な状態にしていたとしても)Googleなどの検索結果に表示されるURLがHTTPSになります。

また、SNS向けにOGPを記述している場合は、そこのURLも同様に書き換えておきましょう。
<meta property="og:url" content="https://www.example.com/">
このように記述すれば、FacebookやTwitterなどのSNSで言及された際にも、HTTPSでアクセスされるようになります。

HTTPSでアクセスしているのに警告が表示される場合の対処方法

ウェブサイトをHTTPSでアクセスできるようにするためには、単にHTMLがHTTPSで読み込めるだけでは不十分です。HTMLソースの中から参照しているオブジェクト(画像、CSS、JavaScriptファイルなど)も同様にHTTPSで読み込めなければなりません。もし、それらのファイルをhttp://で始まるURLを使って読み込んでいる場合には、警告が表示されたり読み込めなかったりします。

画像の場合は、読み込めるものの警告が表示される
ウェブページにHTTPSでアクセスできていても、そのページ内部で読み込まれている画像がHTTPで読み込まれていると、下図のように「一部は安全ではない」旨の警告が表示されます。
HTTPSで通信できているものの、一部の画像などがHTTPで読み込まれている場合の警告例

HTTPSで通信できているものの、一部の画像などがHTTPで読み込まれている場合の警告例


これは、HTMLソース内で画像を読み込む際に、下記のようにhttp://から書き始めていることが原因です。
<img src="http://example.com/images/photo.jpg" ...>
したがって、https://~に書き換えるか、「/」で始まる絶対パスなどに書き換えましょう。
<img src="https://example.com/images/photo.jpg" ...>
 または
<img src="/images/photo.jpg" ...>


 
CSSやスクリプトの場合は、読み込まれない
ウェブページがHTTPSでアクセスされているとき、そのページ内部で読み込まれているCSSファイルやJavaScriptファイルがHTTPで読み込まれるように記述されている場合、それらのファイルは読み込まれません。その結果、表示がおかしくなる可能性がある点に注意して下さい。

HTTPSで通信している際にHTTPでスクリプトを読み込もうとしても、デフォルトでは読み込まれない

HTTPSで通信している際にHTTPでスクリプトを読み込もうとしても、デフォルトでは読み込まれない


上図のように、閲覧者がブラウザの設定を操作すれば、ブロックされているファイル(=HTTPで読み込むよう記述されたCSSやJavaScriptファイル)を読み込むことはできます。しかし、このように操作してくれるユーザはあまり居ないでしょうから、事前に対処しておきましょう。

これも、CSSやJavaScriptを読み込む際に、http://から記述している点が原因です。
<script src="http://example.com/common/abc.js"></script>
https://~に書き換えるか、「/」で始まる絶対パスなどに書き換えましょう。
<script src="https://example.com/common/abc.js"></script>
 または
<script src="/common/abc.js"></script>

外部サイトで提供されているスクリプトを読み込む際に、スクリプトのURLをhttp://から書いている場合が多々あるので注意して下さい。その場合は、提供元にアクセスして最新のURLを調べて書き換えましょう。もし、そういった情報がないなら、試しにhttps://に書き換えてみて、読み込めるかどうかを確認して下さい。相手のサーバがHTTPSに非対応なら、残念ながら読み込みは諦めるしかありません。


 
ウェブページ内で読み込むオブジェクトの参照方法
HTTPでもHTTPSでもアクセス可能にしたい場合は、「//」で始まるURLを使って読み込む方法もあります。例えば以下のような感じで記述します。
<script src="//example.com/common/abc.js"></script>
この場合は、そのページがHTTPでアクセスされているならHTTPで読み込まれ、HTTPSでアクセスされているならHTTPSで読み込まれます。

ただ、HTTPSページ内からHTTPで何かを読み込むのはダメでも、その逆のHTTPページ内からHTTPSで何かを読むのは問題ありません。したがって、単に全部をhttps://から書いておくのが簡単で良いでしょう。

とはいえ、望ましいのは「/」記号で始まる絶対パスで書いておくことです。これならプロトコルに影響されずに読み込めますし、移転などでURLが変わった際でも書き換える必要がありません。なお、相対パスで書いておけば、ローカルで表示確認したい場合でも読み込めるメリットがあります。

SSL証明書を取得してHTTPS化する設定方法

今回は、SSL証明書を取得してウェブサイトをHTTPSでアクセスできるようにする方法を簡単にご紹介いたしました。自サイトが「安全ではない」と表示されてしまわないように、今のうちに対処してみて下さい。

【関連記事】


※記事内容は執筆時点のものです。最新の内容をご確認ください。
※OSやアプリ、ソフトのバージョンによっては画面表示、操作方法が異なる可能性があります。