GoogleがHTTPSに対応したサイトを優先すると公表したこともあり、先日、私のmixhostのサイトでもHTTPS化(SSL対応)しました。
参考 mixhostでHTTPS化(SSL対応)するための設定手順、エラー対処
無事にサイトのHTTPS化は完了したのですが、そもそもHTTPSはなぜ安全何だろう?とかHTTPSはどういう仕組みで動いているんだろうということが気になったので、調べて図にまとめてみました。
HTTPSとは
HTTPSは「Hyper Text Transfer Protocol over SSL/TLS」の略で、HTTPSとはSSL/TLSを用いたHTTP通信のことです。
HTTP通信は、パソコンとサーバ(Webサイト)間で情報をやりとりするための通信方式のことで、SSL/TLSは通信を暗号化する方式のことです。
つまり、HTTPSとは、パソコンとサーバの間の通信を暗号化して安全にデータのやりとりができる通信方式のことです。
通信を暗号化しているため、通信途中に中身が見られても解読できない情報となっており、安全というわけです。
HTTPS対応サイトの見分け方
HTTPS対応サイトを見分ける方法は2種類あります。
- URLの先頭がhttpsとなっているか
- ブラウザのURL欄に鍵マークが付いているか
1.URLの先頭がhttpsとなっているか
サイトがHTTPSに対応しているかについては、URLの先頭である程度確認できます。
先頭のプロトコルがHTTPSになっていれば、そのサイトはHTTPSで通信しようとしています。ただ、HTTPSで通信しようとしていても、うまくHTTPSで通信できていない場合など、URLだけではうまく判断できないものがいくつかあります。
2.ブラウザのURL欄に鍵マークが付いているか
サイトがHTTPSとなっている場合、緑色の鍵マークが表示されます。
ただ、URLの左にある鍵マークが黄色の警告が表示されている場合があります。
これは、このページの一部の画像などがHTTPとなっているため、完全にHTTPSになっていないことを示しています。どの画像がHTTPとなっているかはブラウザの開発者ツールなどを使って、確認できます。
なお、以下のように鍵マークに斜線が入っている場合はHTTPで通信しています。この場合、URLにHTTPSやHTTPのプロトコルの記載はなく、URLがドメイン(wwwなど)から始まります。
HTTPSで使用するポート番号は443
URLのドメイン部分の後ろには「ポート番号」と呼ばれるものがつきます。HTTPSのポート番号は443なので、以下のようなURLとなります。
しかし、普段URLを入力するときはポート番号までは入力しないと思います。
これは「httpのポート番号は80」とか「httpsのポート番号は443」といったように、全世界で取り決められているため、わざわざ入力する必要がないのです。
このように全世界で取り決められているポート番号を「ウェルノウンポート」と言います。
HTTPS通信にはSSLサーバ証明書が必要
HTTPS通信を行うためには、SSLサーバ証明書というものが必要です。SSLサーバ証明書を使うことによって以下2つを実現しています。
- クライアントとサーバ間の通信を暗号化する
- サーバの正当性を証明する
どのように暗号化しているのか、どのようにサーバの正当性を証明しているのかについては、この後、HTTPS通信の流れを図解します。
HTTPS通信の流れ
ここからはHTTPSの通信の流れについて細かく見ていきたいと思います。
まずは、HTTPSの全体の流れです。クライアントがHTTPSで接続することをサーバに要求し、最後、HTTPSでの接続が確立するまでの流れを示しています。
前提知識
HTTPS通信の流れを理解するためには、公開鍵暗号方式と共通鍵暗号方式を理解しておく必要があります。
よくわからないという方は「【図解】公開鍵暗号方式と共通鍵暗号方式の仕組みと通信の流れ」で公開鍵暗号方式と共通鍵暗号方式を理解しておいてください。
1.クライアントからサーバにHTTPSでの接続を要求
まずはクライアント(自分のパソコン)がサーバに対して、HTTPSでの接続を要求します。
HTTPSでの接続を要求するとは、「Internet ExplorerやFirefoxなどのブラウザで、HTTPSのURLを入力する」ことです。
また、このHTTPSで接続を要求するタイミングで、クライアントからサーバに対して、自身が通信可能な暗号化方式も連絡します。「自身が通信可能な暗号化方式」とは、HTTPSのバージョンのことで、具体的にはSSL3.0やTLS1.2などのことです。
なお、SSLとTLSの違いについては「SSLやTLSの違いとは?SSL/TLSの歴史と最新動向」をご覧ください。
2.サーバがサーバ証明書と公開鍵を返送
クライアントからのHTTPS接続要求に対し、サーバはSSLサーバ証明書と公開鍵を返送します。
また、先ほどクライアントから送られてきた、「クライアントの通信可能な暗号方式」を踏まえて、サーバが「サーバの通信可能な暗号方式」を返送します。
3.ルート証明書でサーバ証明書を検証
続いて、クライアントはブラウザのルート証明書でサーバ証明書を検証します。これにより通信先のサーバが不正なサーバでないことを確認します。
ルート証明書はあらかじめインストールされている
ルート証明書とは、信頼される認証局としてあらかじめインストールされている証明書のことです。クライアント(端末)が工場から出荷される時にあわせてルート証明書がインストールされています。
ルート証明書の更新方法はブラウザによって異なります。Firefoxの場合はブラウザのバージョンアップ時に自動でルート証明書を更新します。
参考 いまさら聞けない、SSLサーバ証明書とルート証明書の関係|シマンテック
4.共通鍵を生成し、サーバの公開鍵で暗号化
次に、クライアントがHTTPS通信に使用する「共通鍵(プリマスタシークレット)」を生成します。続けて、2の処理で受け取った「サーバの公開鍵」を使って「共通鍵(プリマスタシークレット)」を暗号化します。
5.暗号化した共通鍵を送付
クライアントは暗号化した「共通鍵(プリマスタシークレット)」をサーバに送付します。
6.サーバの秘密鍵で共通鍵を復号
サーバは、公開鍵で暗号化された「共通鍵(プリマスタシークレット)」を受け取ると、サーバ自身が保有する公開鍵に対する「秘密鍵」で「共通鍵(プリマスタシークレット)」を復号します。
7.HTTPS通信用の共通鍵を作成
クライアントとサーバの双方で、「共通鍵(プリマスタシークレット)」からHTTPS通信用の共通鍵を作成します。この結果、双方で共通鍵を保持することができました。
これ以降はこのHTTPS通信用の「共通鍵」を使って、HTTPS通信を行います。
HTTPSに関する豆知識
SSLサーバ証明書とSSLクライアント証明書は全くの別物
HTTPSで使用するのはSSLサーバ証明書ですが、SSLサーバ証明書と同じような名前で、SSLクライアント証明書というものがあります。
SSLクライアント証明書とは、端末にインストールされる証明書で、証明書がインストールされた端末しかアクセスさせないといったサービスで使用されます。
SSLクライアント証明書はSSLサーバ証明書と比べると使用される機会が少ないです。一般的に、SSL証明書と言われたらSSLサーバ証明書のことを指していると考えていいです。
本当はSSLではなく、TLS
SSLサーバ証明書など、SSLという言葉は普通に使用されていますが、実はSSLは少し前の技術です。最近ではSSLが改良されてTLSという技術となっています。
2014年10月にGoogleの技術者がSSLのバージョン3.0に深刻な脆弱性が見つかったことを公表しました。このことにより、SSL3.0を使用することが禁止され、本格的にTLSのみでの運用となっています。
ただし、世間一般的にSSLという言葉が普及してしまっているため、実際に使用しているのがTLSであっても、「SSL」や「SSL/TLS」と表記することが多いです。
ちなみに、SSLとは「Secure Sockets Layer」の略で、TLSとは「Transport Layer Security」の略です。
なお、SSLとTLSの違いや歴史については「SSLとTLSの違いとは?SSL/TLSの歴史と最新動向」でまとめていますので参考にしてみてください。
まとめ
HTTPS通信の仕組みについてまとめました。ブラウザにHTTPSのURLを入力するだけで、こんなに多くの処理が行われているとは思っていませんでした。
私はこのHTTPSの仕組みを理解するのに、かなり時間を要してしまいましたが、私のように「HTTPSって何?」と思っている方の参考になれば幸いです。
コメント