SSL接続処理の動作を大きく3つに分けてまとめてみた

このサイトもSSLを導入しておりますので、SSLについての知識があまりないため、ちょいと簡単にまとめてみました。
SSLは安全でセキュアな通信ができ、今後はサイトに導入するとアクセスも上がっちゃうということでメリットがいっぱいのプロトコルです。

SSLとは

SSL(Secure Socket Layer)はインターネット上の通信を暗号化/復号するプロトコルです。
SSLでクライアント~サーバ間の通信を暗号化することにより、個人情報の盗聴を防ぐことができます。

SSLを使用する目的

SSLを利用することによるメリットは大きく以下の3つとなります。

  • 盗聴
    通信を暗号化し、個人情報を盗まれないようにする
  • 改ざん
    情報が書き換えられるのを防ぐためMD値を添付する
    MD値を添付して情報を送信することにより、途中で情報が改ざんされてもMD値が変わるので改ざんされたことがわかる
  • なりすまし
    SSLは個人情報を送信する前に、宛先サーバからの情報をもらい、サーバから送られてくる証明書が正しいものかどうか確認することで、なりすましを防止する

※SSLはHTTPだけではなく、L4~L5の間、L4.5以上のプロトコルを暗号化することができます。
 例えば:
 ・FTP over SSL
 ・SMTP over SSL などなど。。。

サーバ証明書の準備

SSLを使用するためには証明書が必要です。
証明書が発行されるまでの流れが以下となります。

1.鍵の生成

SSLサーバで秘密鍵の公開鍵のペアを作成

  • 秘密鍵 → 公開鍵で暗号化されたデータを復号化する(※保管必須)
  • 公開鍵 → 暗号化する鍵。インターネット上でやり取りしても問題はない。

※秘密鍵と公開鍵は逆の動作もする

2.サーバ証明書の要求

  • 公開鍵やサイトの情報をCSRというランダムな文字列にして認証局に証明書の発行を要求
  • 公開鍵の長さは1024ビットが主流。近年は安全面から2048ビットに移行しつつある
    ※認証局によっては2048ビットの公開鍵しか受け付けなくなっている

3.認証局の審査

CSRを受け取った認証局は要求元(サイト)を審査し、審査にパスしたら、認証局の署名を付加してサーバ証明書を発行する
※証明書もランダムな文字列

4.送られてきたサーバ証明書をサーバにインストールする

送られてきたサーバ証明書をサーバにインストールする。
使用する認証局によっては中間証明書も一緒にインストールする必要がある

SSLの接続処理(SSL)

TCPの3ウェイハンドシェイクが行われた後に、SSLハンドシェイクを実施し、暗号化や鍵、ハッシュ関数などの暗号化の為に費用な情報を決めて、その情報を使ってデータを暗号化し、転送します。
SSLの接続処理の流れは以下のようになります。

1.アルゴリズムの決定

SSLハンドシェイクではまず、どのような方式(アルゴリズム)を使ってやり取りするのかを決める

  • 「Client Hello」でクライアントが使用できる組み合わせのリストを提示
  • 「Server Hello」でサーバがそのリストのなかから使用できる暗号化アルゴリズムとハッシュ関数アルゴリズムの組み合わせを選び、通信で使用するアルゴリズムを決める

2.通信相手の証明

本当に正しいサーバと通信をしているのかを、サーバ証明書を使って確認

  • 「Server Certificate」でサーバは自分が正しいサーバであることをサーバ証明書を使ってアピール
  • 「Server Hello Done」でサーバがすべての情報をクライアントにすべて送る
  • クライアントは受け取ったサーバ署名所をルート証明書を使って検証し、正しいサーバであることを確認する

3.鍵の交換

次にデータ転送に使用する共通鍵を交換する

  • クライアントは正しいサーバであることを確認すると「プレマスターシークレット」という共通鍵を作成し、それを公開鍵で暗号化し、サーバに送る
  • 受け取ったサーバーは秘密鍵で開けて「プレマスターシークレット」を取り出し共通鍵を作成します。

4.暗号化通信の開始

実際に使用する暗号化アルゴリズムの確認作業

  • クライアントとサーバ間でお互いに「Cange Cipher Spec」をやり取りし、暗号化アルゴリズムを宣言する
    このやり取りが終了すると、これから暗号化したデータの転送に移行する

5.クライアント認証

盗聴や、なりすましを防ぐために、クライアントにインストールされたクライアント証明書をもとに、正しいユーザーであるかを判断し、認証する

  • クライアントは自分自身を証明する証明書をサーバへ送信
  • サーバはその証明書をもとにクライアントを認証し、接続を許可する

6.クライアント認証接続処理

  1. サーバはサーバ証明書を送った後に「Certificate Request」でクライアント証明書を要求
  2. それに対してクライアントは「Client Certificate」で自分にインストールされているクライアント証明書を送る
     ※もし、クライアントがサーバの要求に適したクライアント証明書を持っていなかった場合「no_certificate」を返し、サーバはコネクションを切断する
  3. 次に「Client Key Exchange」でプレマスターシークレットを送り、その後「Certificate Verify」でこれまでのデータのハッシュ値をとり秘密鍵で暗号化しサーバへ送信する
  4. サーバは受け取った「Certificate Verify」を「Client Certificate」で受け取ったクライアント証明書に含まれる公開鍵で復号し、サーバ自身のハッシュ値と比較し改ざんされていないか確認する
  5. その後の処理は通常の処理としてデータ転送をする

こんな感じでSSLをまとめてみました。
実際に動きを見ていかないとピンとこないですが、自分の役に立てばよろしいということで。

それでは!




エンジニアのオンライン学習

ITエンジニアにおすすめの教材、オンラインスクールです。
無料からエンジニアの学習ができる教材などまとめているので参考にしてください。

おすすめオンライン教材
自宅で学習ができるオンラインスクール

ITエンジニアの開発・検証・学習としてインターネット上で専用のサーバ(VPS)を利用しましょう!
実務経験はVPSで学べます。



コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

ABOUT US
げんき☆ひろき
インターネット関連のSEをやっています。 ネットワーク、サーバー、ストレージ、仮想基盤まで幅広く手を出しており、MVNOの構築経験もあります。 現在は、Pythonを使ったプログラミングの開発をしネットワークの自動化ツールを作成しています! Pythonの入門書も作成しているので、ぜひ参考にしてください!