プロのWabエンジニアとしてのプライドを持つ
普段Webアプリケーションを開発していますが、近年はAWSなどのサーバーレス開発サービスやフレームワークの普及により、Webサーバーの構造を意識しなくてよく、アプリケーション開発に専念できるという恩恵を受けています。
しかしその影響もあってか、サーバーで何が行われているのか、サーバーとクライアントがどのように安全な通信を行なっているのかを知らない、というか興味すらないという状態でした。
これではまるでプロの料理人が
「中身よくわからんけど美味しいから"味の素"の調味料使っとこ」
と言って料理をしているようなものです。(断言)
たしかに便利な調味料を使えば簡単に美味しい料理は作れますが、細かい味の調整や、お客さん一人一人の要望(好みとかアレルギーとか)に応える料理ができないかもしれません。
もちろんレストランの種類にもよりますが、こんなのプロの仕事じゃない!。せめてその調味料の成分くらいは知っておいた方ができることは増えるはずです。
ってことで自分はWebサーバーについても勉強していこうというお話でした。
追記
現在SSL/TLSでは公開鍵暗号は使われていないようでしたので、公開鍵暗号の一般的な概念を理解するための記事としてご参照ください。
公開鍵暗号の流れ
その前に「共通鍵暗号方式」と「公開鍵暗号方式」
- 共通鍵暗号方式
- 送信者と受信者が同じ鍵を持っている
- 暗号化と複合の両方に使える
- 公開鍵暗号方式
- 盗聴防止用途の場合、受信者が秘密鍵と公開鍵を持っている
- 送信者に公開鍵で暗号化させた暗号は、受信者の秘密鍵でしか複合できない
例を交えて公開鍵暗号での鍵交換を解説
サーバーとクライアントがSSL通信を行うために公開鍵暗号を用いて鍵交換を行った場合を想定します。
ここではサーバーとクライアントを
【鯖江(サバエ)さん】
と、
鯖江さんの友人【倉本(クラモト)さん】
に例えて説明します。
なお、詳しい解説部分はこちらの記事を引用しています。
https://college.globalsign.com/ssl-pki-info/ssl-encryptions/
1. 接続要求
クライアント側からSSL通信のリクエストをサーバ側へ送信。
鯖江さんと倉本さんは共有の別荘を新しく建てましたが、今は倉本さんが別荘の鍵を2人分持っている状況です。
倉本さんは鯖江さんに鍵を渡したいのですが、鯖江さんが海外にいるため今は直接会うことができません。
鍵を直接郵送するのはリスクがあるので避けたいと考えています。
倉本さん
「別荘の鍵渡したいねんけど、どうすればええかな、鍵を裸で送るのは怖いから嫌や」
鯖江さん
「ほな俺のキーボックス送るからそれに別荘の鍵入れて送り返してきて。
ちなみにこのキーボックスには 閉める専用の鍵 と 開ける専用の鍵 があって、閉める専用の鍵はキーボックスと一緒に送るわ」
倉本さん
「変なキーボックスやな、了解」
2. SSLサーバ証明書と公開鍵をクライアント側へ送付
サーバ側から、公開鍵付きのSSLサーバ証明書がクライアント側に送付。
クライアント側のブラウザに搭載されているルート証明書で署名を確認し、SSLサーバ証明書を検証。
鯖江さんは倉本さんにキーボックスを郵送で送りました。
倉本さんは配送元が鯖江さんであることを確認して、まだ鍵のかかっていないキーボックスと、そのキーボックスを閉めるための鍵をゲットしました。
3. 共通鍵(セッションキー)を暗号化しサーバ側へ送付(鍵交換成立!)
クライアント側で生成された暗号用の「共通鍵(セッションキー)」を、サーバ側から送られてきた公開鍵を用いて暗号化し、サーバ側へ送信。
サーバ側に送信された共通鍵は、サーバ側で保持している秘密鍵で復号され、共通鍵が取り出される。
鍵交換が成立。
倉本さんは言われた通り、別荘の鍵をキーボックスに入れ、
一緒に送られてきた「閉める専用の鍵」を使ってキーボックスを閉めました。倉本さんはもう開けることはできません。
そしてそのキーボックスを鯖江さんに送り返しました。
このキーボックスは鯖江さんが個人で厳重に管理している「開ける専用の鍵」でしか開けられないので、途中で誰かにキーボックスを開けられて、中の別荘の鍵を取られるなどの心配はありません。
4. SSL暗号化通信開始
個人情報などの機密性の高いデータを、クライアント側で保持している共通鍵で暗号化しサーバ側へ送信。
サーバ側は、受け取った暗号データをサーバ側で保持している共通鍵で復号してデータを取得する。
無事鯖江さんのもとにキーボックスが届き、鯖江さんは自身のみが持つ「開ける専用の鍵」でキーボックスを開け、別荘の鍵を取り出すことができました。
これで二人とも別荘に出入りすることができるようになりました。
~めでたしめでたし~
「別荘の鍵」「閉める専用の鍵」「開ける専用の鍵」について
上記の例では鍵が3種類出てきました。
- キーボックスの閉める専用の鍵
- サーバーの公開鍵にあたる
公開鍵はSSLサーバ証明書に含まれており、クライアントが受け取るもの
- サーバーの公開鍵にあたる
- キーボックスの開ける専用の鍵
- サーバーの秘密鍵にあたる
サーバーだけが持っている
- サーバーの秘密鍵にあたる
- 別荘の鍵
- データ送受信のための共通鍵にあたる
共通鍵がサーバーに渡った後は、これを使ってデータを暗号化・復号する
- データ送受信のための共通鍵にあたる
まとめ
公開鍵暗号では、公開鍵と秘密鍵の片方が暗号専用、もう片方が復号専用となります。
なお、今日のSSL/TLSではDH鍵共有などを用いた共通鍵の共有方法が一般的です。