SSLとは、ウェブサイトの運営者の身元を保証し、通信を暗号化して通信内容を守る仕組みです。
SSLは、認証局がウェブサイトの運営者に対して「SSLサーバ証明書」を発行し、運営者がそれをウェブサイトに使用することで機能します。
ウェブサーバにSSLサーバ証明書が使用されることで、ウェブサイトの利用者とWebサーバの間で暗号化通信を行うことが可能になります。
ウェブサイトのURLの先頭がhttps://で始まっているなら、そのサイトはSSLが使用されており、そのサイトとの通信内容は暗号化されます。
昨今、ウェブサイトのSSL使用は必須の流れになっており、Google Chrome 68からはSSL化されていないサイト(http://で始まる)は警告が出るようになりましたし、Appleはアプリの開発者に対してSSL化していない外部との通信は基本的に遮断するとしています。
SSLは、通信しようとする2者の間にセキュアな通信経路を与えることを目指します。
セキュアな通信経路とは、すなわち、相手の身元が保証されていること、機密性が確保されていること、改ざんを検知できることという機能を持っていることです。それぞれについて説明します。
1つ目の機能 - サーバの身元保証
仮に通信相手がなりすましの偽物だった場合、通信を暗号化して第三者に盗聴されても大丈夫なようにしたところで、悪意ある相手に情報を渡してしまっているわけですから意味がありません。
つまり、暗号化だけでは不十分で、相手の身元が保証されていることがセキュアな通信には求められます。
SSLサーバ証明書には、サーバ運営者の身元が書かれています。
しかし、その身元が嘘でないことを、クライアントはどのように判断したら良いのでしょうか?
もしかするとその身元は、サーバ運営者が自分自身で書いたもので、信頼できる第三者が身元を保証しているものではないかもしれません(オレオレ証明書)。
身元を確かにするため、SSLサーバ証明書は認証局という機関が発行し、電子署名を施します。
クライアントは、この証明書に施された電子署名を検証することで、身元が確かであることを確認します。
具体的な流れは以下です。
サーバの身元が、正当な認証局によって保証されているかを確認する
最初にSSL通信での接続を要求するとサーバはSSLサーバ証明書を返しますが、実はこの時セットで「中間証明書」と「ルート証明書」も一緒に返されています。
中間証明書は、SSLサーバ証明書を発行した認証局(中間認証局)の本人証明です。
ルート証明書は、中間認証局に対して中間証明書を発行した、最上位の認証局(ルート認証局)の本人証明です。
クライアントはまず、SSLサーバ証明書に施されている電子署名を、中間証明書の公開鍵を使って検証することで、SSLサーバ証明書が中間認証局によって発行されたものかどうかを確認します。
次に、中間証明書に施されている電子署名を、ルート証明書の公開鍵を使って検証して、それがルート認証局によって発行されたものであるかを確認します。
ルート認証局より上位の認証局はありません。ルート証明書はルート認証局自身が署名しています(自己署名証明書)。
クライアントは、第三者のお墨付きがないそのルート証明書を信頼してしまって良いのでしょうか?
実はブラウザやOSには、信頼できるとされているルート証明書があらかじめ登録されています。
クライアントはこの自身が持っているルート証明書で照合し、サーバから受け取ったルート証明書が信頼できるかを確認します。
照合できれば、ルート認証局は本物であり、本物のルート認証局がお墨付きを与えた中間認証局が、そのSSLサーバ証明書を発行しているということで、クライアントはSSLサーバ証明書の内容を信頼するというわけです。
2つ目の機能 - 暗号化による機密性の確保
これは暗号と聞いて多くの方がイメージする機能ですね。
通信する2者だけが内容を知り得ることです。
カード番号や個人情報、パスワードなどは、機密性が確保されるべき情報として分かりやすいですね。
暗号化通信を行うためには、あらかじめ通信する2者が、通信内容を暗号化/復号するための鍵を共有している必要があります。
そのため、SSL通信では、実際の通信の前に、鍵を共有するための通信が行われます。
3つ目の機能 - 通信内容が第三者に改ざんされていた場合の検知
SSLを使うと、受信者は、送られてきた内容が途中で第三者に改ざんされていないことを確認することができます。
受信者が改ざんを検知するには、メッセージが作られた時点から途中で変化していることを検出できるような仕組みが必要です。
改ざん検知のざっくりした手順としては、
まず、送信者がメッセージを元に短い文字列を生成し、それをメッセージにくっつけて送ります。
受信者は、送信者がやったのと同じ手順でメッセージから短い文字列を生成し、その文字列と、メッセージと一緒に送られてきた文字列を比べます。
ここでもし2つが異なっていれば、メッセージにくっついてきた文字列が作成時点から変わっていることになり、途中で通信内容が改ざんされたことになるわけです。
参考
RFC 8446
WEB+DB PRESS Vol.110
スラスラわかるネットワーク&TCP/IPのきほん
Transport Layer Security - Wikipedia
メッセージ認証符号 - Wikipedia