SSL/TLS 通信によるデータの暗号化通信について
では、ブラウザと SSL通信コネクションが成立したとして、実際のデータを暗号化して送受信するにはどうするんでしょうか?
これが、ネットで調べても理解するのにとても苦労するところです。
とりあえず、自分流で調べたことを書きます。
ユーザーサーバー側に秘密鍵があれば、先に述べたように公開鍵が作成できます。
スマホ側でサーバーへ https 接続要求すると、サーバー側は公開鍵を含んだサーバー証明書をスマホへ送信します。
これで、スマホ側は秘密鍵とペアになった公開鍵を入手できます。
サーバー側のデータを秘密鍵で暗号化でき、スマホ側は公開鍵で復号できます。
秘密鍵で作成された公開鍵でしか復号できないことがポイントです。
また、スマホ側のデータは公開鍵で暗号化でき、サーバー側は秘密鍵で復号できます。
これが公開鍵暗号化方式(PKI)というものだそうです。
自分なりの備忘録的な図で表すとこんな感じです。
ただ、この方式は通信速度が遅いとのことです。
それで、送受信するデータの暗号化および復号化を高速にするために、サーバー側とスマホ側で共通の鍵を使用する方式があります。
それが共通鍵暗号化方式というものです。
共通の同じ鍵ならば、それは計算が速くなりますよね。
だったら、共通鍵だけで通信すれば良いと思いますよね。
でも、共通鍵は、サーバー側とスマホなどのクライアント側にどうやって渡すかが問題になります。
公開鍵暗号化方式( PKI )ならば、通信の途中で盗まれても、秘密鍵が無いので問題ありません。
当然、秘密鍵が盗まれたら元も子もありませんが、秘密鍵を送信することは無いので、基本的にそこは考えなくて良いかと思います。
ただ、保管方法は厳重にしておかないと、痛い目に遭います。
いつぞやの仮想通過の流出事件はこの秘密鍵が盗まれたとのことです。
気を付けたいですね。
共通鍵はサーバーとクライアントの両方に無ければ通信できないので、相手側に何らかの手段で渡す必要が生じてきます。
その通信途中で盗まれてしまうと、全てがパーです。
昔のようにメモリーディスクを手渡しできれば良いのですが、今はそうはいきません。
遠方のサーバーやクライアントにインターネットで通信しなければなりません。
そこで考えられたのが、公開鍵暗号化方式 ( PKI )を使って、共通鍵を暗号化して渡せば良いという方式です。
それはハイブリッド暗号化方式というものです。
この方式は、スマホなどのブラウザ(クライアント側)が共通鍵を生成するそうです。
以下の図を参照してください。
共通鍵がサーバーとクライアント両方にあれば、それで暗号化および復号化できて、高速な暗号化通信が可能になるそうです。
SSL/TLS 通信には、このハイブリッド暗号化方式が使われているそうです。
共通鍵はセッション毎に新たに新しい鍵が生成されるそうで、共通鍵の使いまわしによる漏えいを防ぐ狙いもあるそうです。
よく考えられていますね。ホントに・・・。
いかがでしょうか?
分かりましたか?
とりあえず、私自身の備忘録的に書いているので、間違えていたらコメント投稿等でご連絡いただけると助かります。
ESP32の自作サーバーで SSL 暗号化通信するために必要なもの
では、上記を踏まえた上で、ESP32で SSL サーバーを構築するために必要なものは以下の通りです。
● OpenSSL ソフトウェア(フリー)
Windows や Linux などで動作する、オープンソースの SSL ソフトウェア。
秘密鍵、公開鍵、証明書署名要求CSR、ルートCA 証明書、サーバー証明書などを自分自身で生成できます。
● ESP-IDF
今のところ、私はこれでしか SSLサーバー構築できませんでした。
いずれ、Arduino – ESP32 でも構築できるようになるものと思われます。
これには、秘密鍵や公開鍵を暗号復号化できるライブラリがあり、証明書から鍵を抽出できるライブラリもあります。
まとめ
以上、「SSL 通信とは?」について自分流の備忘録的に綴ってみました。
ザッとまとめるとこんな感じです。
●世間一般的に言われている SSL 通信は、正式には TLSプロトコル通信である。
●ブラウザとの SSL/TLS 通信には、最低限、サーバー秘密鍵と、認証局署名付きサーバー証明書が必要。
●ブラウザにサーバーを信頼してもらうためには、ルート認証局証明書を端末に登録する必要がある。
●SSL/TLS 通信は公開鍵暗号化方式と共通鍵暗号化方式の両方を使ったハイブリッド暗号化方式を使用していて、データの送受信は共通鍵暗号化方式を使用している。
以上です。
自分用の備忘録的に書いているので分かりにくいかもしれませんがご容赦ください。
何分、サーバー関係はド素人なので、誤っていたらコメント投稿等でご連絡いただけると助かります。
これを踏まえた上で、次回の記事では OpenSSL の使い方を説明したいと思います。
ローカル IP アドレスで SSL サーバーを構築するには、ちょっとしたNow Howがあります。
今回はここまでです。
ではまた・・・。
コメント