Table of Contents
Webサービスを作る上で必要なSSL/TLSについての概要をまとめました。
iPhoneに搭載される最新のOSであるiOS10では、Web接続にはSSLによる暗号化が必須になるとのことなので、アプリ開発者も理解しておくことが必要になるでしょう。
SSLとは
SSL (Secure Sockets Layer) とは、WebブラウザとWebサーバの間で通信する情報を暗号化する際の取り決めです。
この取り決めのこと、専門用語ではプロトコル(通信規約、通信手順)と言います。
SSLは、よく暗号化のプロトコルと言われますが、情報の暗号化だけではなく、通信相手の認証(実在することの証明)も重要な役割の一つです。
SSLはWebブラウザを介したインターネットの通信だけでなく、Eメールの送受信などにも使われています。
通信に潜む危険
WebブラウザとWebサーバとは、特に何も設定しなければ、通信内容は暗号化されずに送受信されます。
普通にWebページを閲覧するなど、情報を取得するだけであればこれでも問題ないのですが、例えば、ネットショッピングで個人情報やクレジットカード番号などの情報をWebサーバ側に送信するという場合は問題になります。
重要な情報を暗号化せずに送信すると、以下のような危険があります。
危険1 盗聴
WebブラウザからWebサーバに情報を送信する途中で、その情報を読み取ってしまうことを盗聴と言います。
通信が暗号化されていなければ、名前や住所、カード番号などの個人情報はだだ漏れです。
危険2 改竄
知識のある人なら、通信情報を読み取るだけではなく、書き換えることもできます。
例えば、ネットショッピングで買った物の品目や個数を変えたりといったことも可能です。
危険3 なりすまし
利用者が通信しようとしているWebサーバが偽物にすり替えられていた場合、重要な情報を悪意のある人に渡してしまうことになります。
SSLの目的
SSLの目的は、上記の「盗聴」「改竄」「なりすまし」といった問題を防ぎ、安全な通信を確立することです。
具体的には、これらの問題に対して以下の対策を行っています。
目的 | 対策 |
---|---|
盗聴防止 | 情報の暗号化 |
改竄検出 | ハッシュ値の比較 |
なりすまし防止 | デジタル証明書 |
これらの概要を説明していきます。
対策1 暗号化
盗聴に対する防衛策です。
WebブラウザとWebサーバで、共通の暗号方式を決めて通信します。
どんな暗号を使っているかは、外部に漏れることがないようになっているため、安全に情報をやりとりできます。
暗号化が施されていれば、通信が途中で読み取られたとしても、盗聴者は暗号を解くことができないので情報が漏れる心配はありません。
対策2 ハッシュ値の比較
ハッシュ値とは、簡単に言えば、「ある情報を長さの決まった暗号文に変換したもの」と言えます。ある情報からハッシュ値を作るときに使う関数を、ハッシュ関数と呼びます。
どんな情報でも、ハッシュ値にすると決まった長さ(128ビットなど)になります。
例えば、SHAと呼ばれるハッシュ関数を利用すると、以下のような160ビットのハッシュ値が得られます。
SHA-1によるハッシュ値の具体例 a5cb2c2e9bb47d677ec63ddd3d2da3bbd40ee94c
ハッシュ値には以下のような特徴があります。
- 同じ元データからは全く同じハッシュ値が生成される。少しでも異なる元データであれば、全く異なるハッシュ値が生成される
- ハッシュ値と使ったハッシュ関数が分かっていても、元データを知ることはできない
ハッシュ関数から生成されるハッシュ値を比較することで、送信途中で改竄があったかどうかを判断できます。
ちなみにハッシュ値は、メッセージダイジェスト、フィンガープリントなどとも呼ばれます。
改竄検出方法
Webブラウザでは、送信する情報に暗号化を施した後、ハッシュ関数を使って、その暗号のハッシュ値を計算します。暗号化された情報をWebサーバに送るときに、このハッシュ値を一緒に送ります。
Webサーバが情報を受け取ったら、Webブラウザ側で使ったものと同じハッシュ関数を使って、受け取った情報からハッシュ値を計算します。(どのハッシュ関数を使うか事前に決めています)
送信側(Webブラウザ)で算出したハッシュ値 = 受信側(Webサーバ)で算出したハッシュ値 であれば、改竄が行われていないと言えます。
対策3 デジタル証明書
SSLは、通信している相手側が、認可を受けた信用できるところかどうかを判断するための機能を提供します。
これがデジタル証明書です。
Webブラウザはルート証明書という証明書を持っています。この証明書はブラウザに初めから組み込まれています。
一方、Webサーバ側はSSLサーバ証明書という証明書を持ちます。これは、Webサイト所有者の情報や送信する情報の暗号化に必要な鍵、証明書発行者の署名データを持った電子証明書です。
こちらは、サーバを運営する事業者が設定するもので、「認証局事業者」に申請して認証を受け、発行してもらう必要があります。
WebブラウザとWebサーバが通信を始める前に、WebサーバはWebブラウザに自身が持っているSSLサーバ証明書を送り、信頼できるか検証してもらいます。
デジタル証明書が有効であり、信頼に足りうると判断できた場合、通信が開始されます。
つまり、あるサーバが本当にその名前どおりのサーバかどうかの確認は、「十分に信頼できる機関が発行した証明書」を使って行われるのである。具体的には、SSL/TLS通信を開始する最初の段階で、サーバは本人性を証明する証明書をクライアントに提示する。クライアントは、受け取った証明書がニセの証明書でないか、信頼できる証明機関が発行したものかを確認。問題なければそのサーバを信用して暗号化通信の準備を継続実行し、実際のアプリケーション間の通信を開始する、という流れとなってゆく。
不正アクセスを防止するSSL/TLS(2):SSL/TLS(Part.1) (2/3) – @IT
先ほど説明したハッシュ値は、デジタル証明書の改竄チェックにも利用されます。
認証局事業者の署名とは、SSLサーバ証明書のハッシュ値を認証局の秘密鍵で暗号化したデータです。クライアントは、SSLサーバ証明書を受け取ると、クライアントに登録されている認証局の証明書(ルート証明書)を用いて、この認証局の署名を復号します。復号したデータが、SSLサーバ証明書のハッシュ値と一致すれば、第三者によって改ざんされたものでない、正しく認証局事業者が発行したSSLサーバ証明書であることが確認できます。
いまさら聞けない、SSLサーバ証明書とルート証明書の関係
Webブラウザのルート証明書は、ブラウザのバージョンアップ時などに自動的に更新されます。
httpsについて
SSLを使って安全に通信できるWebページは、そのURLが https:// で始まっています。
あるWebサイトがSSLを使っているかどうかを判断する一つの目安になります。
HTTPS(Hypertext Transfer Protocol Secure)は、HTTPによる通信を安全に(セキュアに)行うためのプロトコルおよびURIスキームである。厳密に言えば、HTTPS自体はプロトコルではなく、SSL/TLSプロトコルによって提供されるセキュアな接続の上でHTTP通信を行うことをHTTPSと呼んでいる。
HTTPS – Wikipedia
SSLとTLS
TLSはSSL3.0をバージョンアップした技術仕様です。
ほぼ同じと言われていますが、厳密には異なるもののようです。
SSLがバージョンアップを重ねて「SSL3.0」となり、その次のバージョンから「TLS1.0」という名称で呼ばれるようになりました。SSLの名称はインターネットユーザの間で広く普及しているため、TLSを指していても、SSLまたはSSL/TLSと表記することが多くなっています。
SSLのまとめ | シマンテック
TLS 1.0とSSL 3.0との間に正確な互換性はないが、その仕様の違いはごくわずかなものになっている。実質的にはSSL 3.0のマイナーバージョンアップを行って、RFC化したものがTLS 1.0と考えてよい。実際、TLS 1.0プロトコル中でのバージョン表記は“3.1”となっているくらいである。
不正アクセスを防止するSSL/TLS(2):SSL/TLS(Part.1) (2/3) – @IT
おしまい
詳しい実装や認証の仕組み・実際の利用方法は改めてまとめたいと思います。
個人的には OpenSSL や Let’s Encrypt などのオープンなものが気になっています。
参考
Apple will require HTTPS connections for iOS apps by the end of 2016 | TechCrunch