SSLとは
暗号通信のこと。Secure Sockets Layerの略。SSLでしたいことは大きく二つ。
1.クライアントとサーバー間でやり取りするデータを暗号化したい
2.やりとりする先のサーバーが偽のサーバーでないかどうか判別したい
実際は1のみで良い気がしますが、通信の途中でデータをどこかで盗み見られたり改ざんされたりするリスクを少しでも減らすために2も行うことでより安全性を確保するようです。
1を行う仕組み
クライアントとサーバー間でのやり取りを暗号化する方法として共通鍵というものを使います。共通鍵はクライアントとサーバー双方で同じものを持っており、この鍵を使うことによって暗号化されたデータを解読することが可能になります。
2を行う仕組み
やりとりする先のサーバーが偽のサーバーでないかどうかを判別する方法として、秘密鍵、公開鍵、サーバー証明書、ルート証明書というものを使います。秘密鍵はサーバーが、公開鍵はクライアントが持ちます。この秘密鍵と公開鍵は対になっていて、それぞれが対になる鍵で暗号化されたデータを解読することができるようになっています。
しかし、これらの鍵は通常のSSLでデータをやりとりするための鍵ではなく、通常のデータのやりとりは共通鍵で行います。
じゃあ秘密鍵と公開鍵はどこで使うの?となりますが、これらの鍵はデータをやりとりするための共通鍵を交換するために使います。
共通鍵はサーバーからクライアントにサーバー証明書というものと一緒に送られます。
このサーバー証明書には著名や出どころなどの情報が記載されており、サーバーが信頼のおけるものであることを証明します。
しかしこのサーバー証明書もまだ偽装の余地があるため、サーバー証明書と一緒にルート証明書というものも送られます。
ルート証明書はサーバー管理者が認証局というところに申請して発行してもらった確実に身分を証明できる証明書のことで、サーバー証明書に著名した認証局の根本の証明書となります。
しかしクライアントからすればそのルート証明書も信頼出来るものか怪しいところがあります。
それを確認するために、クライアント側にはすでにあらかじめ信頼出来る認証局の証明書が複数インストールされています。
クライアントは送られてきたルート証明書と自身の持つ信頼のおける証明書を比較して、それらが一致した場合に初めて送られた共通鍵が信頼のおけるものだと判断します。
まとめ
どこかまだ認識が間違っているかもしれませんが、1と2のちょっと複雑な処理を行うことによってデータをセキュアにやりとりしてるんですね。これは難しいわぁ...。
でもなんとなく流れはわかった気がするので、まとめて勉強する時間を持つのは大切ですね。