非エンジニアのための SSL/TLS 入門(前編)
スポンサーリンク
最近、まわりの人たちは SSL/TLS(以降SSL) が経路の暗号化を目的としてる、というだけの理解をしている人があまりに多いことに気付きました。
というかみんな全くと言っていいほど仕組みを理解してない。。
世間では新入社員が入社する時期ですし、簡単に説明してみようと思います。
エンジニア以外の方にも理解してもらいたいので、ここでは具体的なアルゴリズムや難しい話はしません。
専門用語を極力避けて、親に説明するつもりで書きます。
説明が複雑になりそうなところはあえて正確ではない表現になってしまうかもしれませんので、そこだけご了承ください。
では始めます。
SSL の目的
まず最初に目的をはっきりさせておきます。
- 通信内容の傍受を防ぐ
- 通信内容の改竄を検知する
- 通信相手が正しいことを、確かめる
の3つです。
通信内容がわからないようにする、などという曖昧な理解はしないようにしてください。
宅急便を想像してみましょう。
送った段ボールの中身が他人に見られるのは嫌ですよね?
届いたダンボールの中身が差し替えられてたり抜き取られてたら困りますよね?
送り先の住所とは別なところに届いちゃったら大変ですよね?
SSL はそういったトラブルを防ぐためにあるのです。
仕組み
目的がわかったところで、どうやってそれらを実現しているのかについて解説していきます。
暗号
暗号と聞いて身構えてしまう人がいるかもしれませんね。
冒頭でも書きましたが、難しい話をするつもりはないので、安心して読み進めてください。
SSL では用途の異なる3つの種類の暗号を用います。
共通鍵暗号
暗号化と解読に同じ鍵を用いる方式です。
家の鍵を思い浮かべてもらえればわかると思います。
一つの鍵を使ってカギを閉め、同じ鍵でカギを開けますね。
開け閉めに使う鍵が同じ。
それだけ理解してもらえれば十分です。
公開鍵暗号
鍵なのに公開とは?と思われるかもしれませんね。
公開鍵暗号は、公開鍵と秘密鍵という2つの鍵がセットとなっています。
公開してもいいのは、名前の通り公開鍵の方です。
公開鍵は鍵を『閉める』だけの鍵、秘密鍵は鍵を『開ける』だけの鍵、のように役割がはっきりと分けられています。
誰でも鍵を閉めることができるけど開けられるのは秘密鍵を持っている本人だけだよ、というのが公開鍵暗号です。
どういう場面で必要になるのかよくわからないかもしれませんが、この考え方が後々重要になってきます。
一方向暗号
エンジニア世界ではハッシュとも呼ばれています。
また、指紋とも呼ばれます。
人間の指紋は一人一人違いますね。
電子データもまた、一つ一つ異なる指紋があるという話です。
といっても、電子データにインクを付けて紙にペタ!なんてできるはずもありません。
電子データの指紋は、計算式によって求めるのです。
小学校の算数で面積を求める公式を習いましたね。
必要となるデータが揃ったら、あとは公式に当てはめて計算するだけでした。
指紋を計算するイメージはそれで十分で、あらかじめ決められている公式に電子データを代入することで求めることができます。
// 電子データを代入するという表現はプログラムを書いたことがある人にしか伝わらない表現かもしれませんが、うまい表現が見つからなかったのでごめんなさい
指紋は以下のようにランダムな文字列として表現され、ファイルの内容が1文字でも異なると全く違う指紋が作成されます。
03de6c570bfe24bfc328ccd7ca46b76eadaf4334
SSL通信
共通鍵暗号、公開鍵暗号、一方向暗号という3つの暗号があることがわかったところで、具体的な仕組みについて説明していきます。
まず結果から言ってしまうと、SSL の通信は共通鍵暗号で行われています。
送信者と受信者が同じ鍵を持っている、ということですね。
SSL での通信データを宝箱で例えていきます。
送信者は送信したいデータを宝箱に入れて共通鍵でカギを閉めます。
これで共通鍵を持っていないと誰にも中身を取り出すことはできなくなりました。
その後、送信したいデータの指紋を計算し、宝箱の外側に張っておきます。
あとはこれを受信者へ送るだけです。
送信経路上では様々なサーバーを経由しますが、宝箱に入っているので誰も中身を見ることはできません。
これでSSLの目的の一つ目、『通信内容の傍受を防ぐ』が実現できています。
受信者は共通鍵を使って、宝箱から目的のデータを取り出します。
そしてそのデータから送信者と同じ公式を使って指紋を計算し、宝箱に張ってある指紋と一致するかを確認します。
もし共通鍵で宝箱のカギを開けることができなかったり、指紋が一致しないことがあれば、受信者には別な宝箱が届いてしまったということがわかります。
これでSSLの目的の2つ目、『通信内容の改竄を検知する』が実現できました。
秘密鍵の共有
さきほど送信者と受信者が同じ鍵を持っていると簡単に言ってしまいましたが、どうやって共有したのでしょうか?
共通鍵さえ持っていれば誰でも宝箱を開けることができてしまいますので、絶対にバレない方法で共有する必要がありそうです。
実は、SSL での暗号化通信を開始するにはハンドシェイクと呼ばれる事前準備が行われていて、その中で秘密鍵を安全に共有することができるようになっています。
ハンドシェイクとは、日本語で握手のことですね。
よし、これで通信しましょう、と相手と合意を取る作業になります。
ではどのようなやりとりがあるのかを見ていきます。
ハンドシェイク
まず、送信者の方から暗号通信しませんか?と受信者へあいさつすることから始まります。
受信者もこれにあいさつで応えます。このとき、受信者は必ず名刺を出すことが定められています。
ここで受信者が提示する名刺のことを、正式にはサーバー証明書と呼びます。
この名刺はフォーマットが規約で定められていて、必ず以下の情報が記載されています。
- 受信者のドメイン
- 名刺の有効期限
送信者は受け取った名刺を確認することで、あいさつを返してくれたのが受信者本人であることを確かめることができるようになっています。
これでSSLの目的の3つ目、『通信相手が正しいことを確かめる』が実現できました。
ここでの本人確認には実はもう少し細かい話があるのですが、そのあたりは後編で触れたいと思います。
さて、本人確認ができたところで、送信者はこれから通信するために使う共通鍵を作ります。
この共通鍵を受信者に渡してしまえば、晴れてハンドシェイク完了となり、通信を開始することが出来ます。
でも、暗号化もされていないのに共通鍵が誰の目にも触れず、確実に受信者にしか共有されない方法なんて・・・
と思ってしまいますよね。
ここで登場するのが、公開鍵暗号です。
公開鍵暗号なら、受信者しか開けられない宝箱を用意することができますね。
そうと決まれば早速受信者から公開鍵をもらいましょう!
とはなりません。その必要はないのです。
送信者はすでに受信者の公開鍵を持っています。
勘の良い方はお気づきかもしれませんが、実は公開鍵は受信者にもらった名刺に書いてあります。
さきほど名刺には決められたフォーマットがあるという話をしましたが、公開鍵もまた必ず記載するように定められているのです。
うまいことできてますよね。
話を戻します。
送信者は自身で作成した共通鍵を宝箱に入れ、受信者の公開鍵でカギを閉めます。
これで宝箱を開けることができるのは解錠可能な秘密鍵を持った受信者だけになりました。
あとは受信者へこれを送るだけです。
複雑なやりとりをすることなく、スマートに共通鍵を共有することができましたね。
以上でハンドシェイクの話は終わりになります。
まとめ
いかがでしたでしょうか。
本記事では暗号化の種類、SSLの通信方法、鍵共有について触れてみました。
なるべく専門用語は避けたつもりですが、少しはわかりやすく解説できていたでしょうか?
後編では、今回話した話題について、より詳細に解説してみようと思います。
- 作者: 結城浩
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2015/08/26
- メディア: 大型本
- この商品を含むブログ (13件) を見る