SSL通信って簡単にいうとどいういう仕組みなの・・・?という方向けの記事
私はさくらのVPS・CentOS7にDockerをインストールした環境にリバースプロキシコンテナを使ったマルチドメインを構築したいのですが、なかなか上手く行かず、その中の一つにSSL化が何故かうまくいきません。
恥ずかしながら、SSLとは通信セキュリティの担保ぐらいの認識でした。
そのため、今回はそのSSLとは何か、その仕組みについて自分なりにですが簡単に調べてまとめてみました。
SSL通信をする目的・役割は何か?(→3つあります)
まずネットでSSL通信をする目的・役割は何かを調べてみて、以下のページを発見。
SSLとは? | 基礎から学ぶSSL入門ガイド | CSP SSL
正式名称とSSL通信をする目的・役割について言及されています。
図や短い文章でまとめられていたので、おすすめの記事です。
引用すると、
SSLとは「Secure Socket Layer」の略で、WebサーバとWebクライアント(ブラウザ等)やメールサーバとメールクライアント(メーラー等)等の通信を安全に保つために利用されています。
SSLは『暗号通信』というイメージが強いですが、それは通信の安全性を保つ3つの機能のうちのひとつでしかありません。SSLは__「通信内容を秘匿する暗号機能」と「通信相手の真正性」「通信データが改ざんされていないか検知する機能」の3つの機能があり、その機能を使うことによって安全に通信することができます。__
SSLとは? | 基礎から学ぶSSL入門ガイド | CSP SSLから
ということで、SSL通信を行う目的・役割に関して簡単にまとめると、
- 通信内容を暗号化する
- 通信対象が正しいかチェック
- 通信内容が改ざんされていないかチェック
の3つということですね。
3つの目的・役割をどのように果たしているのか?(→4つのステップでSSL通信ができます。但し準備物が一つ有)
それでは、どのように3つの目的・役割を果たしているのかその仕組を調べてみました。
調べた結果、個人的にわかりやすいソースは以下。
こちらはSSL通信の流れの図と説明がわかりやすかったです。
文章だけ引用すると、
1. 接続要求
クライアント側からSSL通信のリクエストをサーバ側へ送信。
2. SSLサーバ証明書と公開鍵をクライアント側へ送付
サーバ側から、公開鍵付きのSSLサーバ証明書がクライアント側に送付。
クライアント側のブラウザに搭載されているルート証明書で署名を確認し、SSLサーバ証明書を検証。
※グローバルサインをはじめとする「信頼のある認証局」のルート証明書は、あらかじめ主要PCブラウザや携帯端末に搭載されているので、ユーザ側で新たにインストールする必要がありません。
3. 共通鍵(セッションキー)を暗号化しサーバ側へ送付
クライアント側で生成された暗号用の「共通鍵(セッションキー)」を、サーバ側から送られてきた公開鍵を用いて暗号化し、サーバ側へ送信。
サーバ側に送信された共通鍵は、サーバ側で保持している秘密鍵で復号化され、共通鍵が取り出される。
4. SSL暗号化通信開始
個人情報などの機密性の高いデータを、クライアント側で保持している共通鍵で暗号化しサーバ側へ送信。
サーバ側は、受け取った暗号データをサーバ側で保持している共通鍵で復号してデータを取得する。
※共通鍵は、サーバとクライアントが使用するブラウザの双方が対応する、最も強度の高い暗号方式・鍵長が使用されます。
SSL暗号化通信の仕組み|GMOグローバルサイン【公式】から
ということで、引用元の図にある、4番の状態(情報を暗号化してクライアントとサーバーで通信し合う)を実現するために、SSLの仕組みは以下のようになるかと思います。
- クライアントがサーバーに接続をリクエスト
- リクエストを受けたサーバーはクライアントにSSL通信を行うために必要なもの(サーバー証明書・公開鍵)を送付→クライアントはサーバー証明書に記載されている情報が正しいか検証→通信対象が正しかったら、共通鍵を生成(4の状態での暗号文を復号化するため)※★ここで通信対象が正しいかチェックという役割を果たす★
- クライアントは共通鍵を暗号化し、サーバーに送付→暗号化された共通鍵を受け取ったサーバーは、秘密鍵でその共通鍵を復号化
- クライアント・サーバー両方で、通信内容を暗号化→共通鍵で復号化して読込という流れ通信を行う__※★ここで通信内容を暗号化という役割を果たす★____※★ここで通信内容が改ざんされていないかチェックという役割を果たす★__
という感じかなと思います。
この流れを実現するためには、サーバー側には秘密鍵付きのサーバー証明書の設置が必要とのこと。
4番の状態までにするまでのステップは引用先の図がわかりやすいのでぜひ見てみるのをおすすめします。
サーバー証明書を準備できたら、SSL通信ができます!
サーバー証明書を発行するためには、認証局を通して発行し、サーバーに設置することになります。
認証局は、シマンテック、グローバルサイン、無料で使えるLet's Encryptなど様々です。
私は勉強で使うので、無料で使えるLet's Encryptを使います。
さいごに
普段何気なくWEBサイトをSSL化させていたのですが、仕組みについて分かったので少し前進した気がします。
私はVPS・CentOS7にDockerをインストールした環境にリバースプロキシコンテナを使ったマルチドメインを構築し、SSL化もさせたいので、次はそこについて調べてみようかなと思っています。