[初心者向け] httpsやSSLって何が大事なんだろ?
二者間で安全にデータをやり取りする方法は古来からいろいろ取り上げられています。
現在のインターネットでは、TLSという方式で安全にデータのやり取りがされています。その仕組みを初学者の方でもわかるように、簡単に説明します。
インターネット上で情報を暗号化?
現在みなさんがよく耳にするSSL化(httpをhttpsにする)ですが、実は厳密に言うとSSLではありません。実態はTLSです。
- TLS(Transport Layer Secutiry)
- SSL(Secure Sockets Layers)
どうしてみんながSSLと言っているのに実態は別なのでしょうか。
その理由は案外簡単です。以下のような歴史的経緯がありました。
- ネットスケープ社がインターネット上でデータを安全にやり取りできるようにSSLを開発
- SSLがバージョン2.0になって正式に発表された
- しかしあとから2.0に脆弱性が発見された
- ネットスケープ社は脆弱性を解決した3.0を発表した
- GoogleがSSL3.0に別の脆弱性を発見
- この時点でGoogleはSSL2.0、3.0の使用禁止を呼びかけ始めた
- この脆弱性はPOODLEと呼ばれた
- IETFという団体が、SSL3.0をベースにTLSと呼ばれる新しい仕組みを提案
- TLSが安全であるということが証明され、一気に広まった
TLSは優れた暗号化通信なのですが、いかんせん世の中はSSLという言葉が普及してしまっています。そのため、SSLという言葉を残すことになりました。表記する際は「SSL/TLS」などと併記するのが一般的です。そして繰り返しになりますが、SSLという名称が付いていますが、中身はTLSです。
友達とヒミツをシェアしよう!
さて、データを暗号化して相手に送っても、相手が復号化する手段がなければ、ただの宝の持ち腐れです。
友達が他人に見られたくない写真をあなたに送りました。見られたくないので、友達はパスワードをかけています。あなたと友達が同じパスワードを知っていれば、あなたは容易に写真を復号化出来ます。これは誰もが思いつく方法だと思います。「パスワードの共有」です。
しかし問題なのは、このパスワードを相手にどうやって伝えるかという部分です。紙に書いて送ってもいいのですが、それでは時間がかかりますし、書いたものを他人が見ればバレてしまいます。ディスプレイにパスワードを書いた付箋紙を貼っておくのと同じです。パスワード自体の存在意義がありません。
一旦インターネットの話に戻します。
インターネットを使って様々なサービスを利用するのに、ページが変わるごとにパスワードが発行され、それを郵送で送られても困ります。リアルタイムで処理する必要があります。
そこで、以下の方式が編み出されました。まず、以下の2つの種類のデータを用意します。
- 第三者にバレても大丈夫なパスワード
- 絶対にバレてはいけないパスワード
この、絶対にバレてはいけないパスワードを使い、第三者にバレてもただの意味不明にしか見えないパスワードを生成します。この意味不明なパスワードは、絶対にバレてはいけないパスワードを使った時のみ、元のパスワードに戻せるという仕組みです。
第三者にバレても大丈夫なパスワードは公開しても差し支えないため、公開鍵と呼びます。そして絶対にバレていはいけないパスワードは絶対に秘密にしておく必要があるので、秘密鍵と呼びます。
まずはこの公開鍵を相手に渡す必要があります。すでに意味不明の内容になっていますので、メールなどで送信しても問題ありません。受け取った相手側は、この公開鍵に何が書かれているのかは全く意識する必要はありません。そして受け取った相手側が、自分の手元で作った別のデータをこの公開鍵で暗号化し、それを送り返すことで両者で同じパスワードの共有が可能になります。
送り返されたデータは秘密鍵で復号化出来ますし、送ったほうはそもそもオリジナルを所有しているわけですから、これで誰にもバレずにパスワードの共有が出来たわけです。
公開鍵は暗号化専用です。もし公開鍵でデータを復号化出来てしまうと、上記の流れは全く無意味になります。というわけで、公開鍵で暗号化し、秘密鍵で復号化、ということになります。
このパスワードの部分が、前述した画像にかけられたパスワードと同じ扱いになります。これは共通鍵と呼びます。以降、お互いがこの共通鍵を使うことで、暗号化したデータを安全にやり取り出来るという仕組みです。お互いが持つパスワードが別のパスワードで暗号化され、その暗号化を解くためには、公開されてないパスワードを使う必要があるということです。
暗号化って?
暗号化というのは、例えば以下のような文章です。
ひずもみすと
。
実はこの文字を五十音で1つ遡ると、以下の文字になります。
ひ
の一つ前のはは
ず
の一つ前のはじ
も
の一つ前のはめ
み
の一つ前のはま
す
の一つ前のはし
と
の一つ前のはて
つまりひずもみすと
に対してあるルールを適用すると、はじめまして
という意味の文章が出現するわけです。この場合は「文字を1つ遡る」というのがルールになります。
このルールが大事です。別に2つでも3つでも行けそうです。もちろん50音ですので存在しない文字になった場合のルールも必要になります(ループさせるなど)。
そういったルールや仕組みをアルゴリズムと呼びます。このアルゴリズムが単純ですとあっという間に解読されていまいますので、いろいろなアプローチの方法が編み出されました。暗号化と一口に言っても、実はすごい数の種類がありまして、アルゴリズムも様々なものが存在します。
少し専門的な話になりますが、OpenSSLというソフトを使い、種類を見てみましょう。
openssl ciphers -v
すごい数の暗号化が存在している事がわかったかと思います。
これらの暗号化をまとめて、暗号スイートと呼びます。左から、暗号スイート名
、プロトコル名
、鍵交換アルゴリズム
、認証アルゴリズム
、暗号化アルゴリズム
、ハッシュ化アルゴリズム
と呼ばれるデータになっています。
ここでは詳しい内容は覚える必要はありませんので、暗号化にはいろいろな種類があるということだけ確認しておいてください。
具体的にどう動いているの?
ブラウザとサーバが共に同じ鍵を持っていれば、データが暗号されていてもその鍵で復号化できます。
しかし、アクセスが有る前にその鍵を相手に渡しておくというのは不可能です。なぜなら、サーバは世界中の誰からアクセスがあるかなんて予測はできないからです。
そこで、アクセスのあるたびにリアルタイムで共通鍵を暗号化し、勝手に他人に復号化されないようにする仕組みで通信を行います。その暗号化の方法を提供するのがSSL/TLSです。以下のような仕組みでお互いに同じ共通鍵をシェアします。
暗号化には公開鍵を使い、復号化には秘密鍵を使います。そしてブラウザ側にも同じ方法で暗号化をしてもらうために、サーバは自分の公開鍵をブラウザに渡します。この時、この公開鍵がもし第三者にバレたとしても、公開鍵は暗号化専用にか使われないため、第三者は復号化することが出来ません。つまりデータがばれないということになります。復号化するためにはサーバが所有している秘密鍵が必要になります。ブラウザはサーバと同じ公開鍵で自分の共通鍵を暗号化し、それをサーバに渡します。これでサーバとブラウザで同じ共通鍵が存在することになり、その共通鍵を使ってアクセスすれば安全ということになります。
シーケンス図で見てみましょう。
- ブラウザがhttps付きのURLを送信
- サーバ側は自分が持っている証明書と公開鍵をセットにして返却する
- 公開鍵が悪意のある第三者にバレても秘密鍵がなければ復号化出来ない
- ブラウザは受け取った証明書と公開鍵のセットから公開鍵を抜き出す
- 抜きだした公開鍵を使って、共通鍵を暗号化する
- 暗号化した共通鍵をサーバに送信する
- サーバ側は受け取ったブラウザ専用の共通鍵を、自分の秘密鍵で復号する
まとめ
SSLは安全だ、というのは皆さんご存知だとは思いますが、その実態が実はSSLではなくTLSであり、そしてTLSは共通鍵をやり取りするために、秘密鍵で作られた公開鍵をつかって暗号化されるということを説明しました。
これらの仕組みは普段あまり意識する必要はないかもしれませんが、今後はhttpsは必須となりますので、ご自身の情報をWebで入力する際は必ず、ブラウザのロケーションバーの部分が緑色になっている事、SSL/TLS対応化されているのかをしっかり確認するようにしましょう。
Googleが提唱しているように、今後はhttps化されていないサイトは安全ではないというに認定がされてしまいますので、ECサイトなどを運用している業者の方などはこれだけで顧客を逃してしまうことが予測されます。検索結果もどんどん下がってしまいますので、明らかな機会損失です。
httpのみで運用されている方は、しっかりとSSL対策をし、httpsに切り替えることをおすすめします。