何故、SSL/TLS通信は安全なのか? ~ TLS1.2 の仕組み ~

n-ozawan

皆さん、こんにちは。技術開発グループのn-ozawanです。
オーストラリアは有袋類の宝庫であり、コアラが有名ですよね。コアラは猛毒のユーカリの葉を食べるのですが、ユーカリの葉は栄養もない上、その猛毒を分解するために20時間ぐらい眠る必要があります。

本題です。
インターネットには多種多様なサイトが存在し、自由に買い物やチケット予約などが行える便利な時代です。その背景にはしっかりとした暗号化技術があるのは言うまでもありません。暗号化技術があるから私たちは安心して名前やクレジットカード番号の個人情報を入力できるのです。今回は私たちが当たり前のように使っているSSL/TLSの仕組みについてお話しします。

SSL / TLS

概要

SSL/TLSとは、インターネットなどの通信において通信内容を暗号化し、2者間で安全に通信を行うためのプロトコルです。これまで当ブログでは暗号化処理に関する記事を投稿してきましたが、これらは全てSSL/TLSに必要なものでした。

SSL/TLSは、SSLとTLSの2つのプロトコルを合わせた言葉です。SSL (Secure Sockets Layer) はNetscape社により1990年代に策定されてましたが、深刻な脆弱性などにより、今ではSSLは使うべきではないとされています。TLS (Transport Layer Security) はSSLを拡張する形でIETFが策定しました。今現在ではSSLは利用されておらず、TLSが広く利用されています。

なお、TLSの最新バージョンは1.3ですが、今回はTLS 1.2についてお話しします。1.3は次回にお話しします。

TLSハンドシェイク

TLSはTCP上で暗号化処理を行います。TCPは平文で通信しますので、通信開始直後は平文同士のやり取りになります。なのでまずは相手と「どの暗号方式で通信するのか」を決めなくてはなりません。

ハンドシェイクは日本語で言うと「握手」という意味です。日本ではあまり馴染みがありませんが、海外では出会いの挨拶で握手をするそうです。TLSのハンドシェイクとは、通信開始時に相手と「どの暗号方式で通信するのか」という取り決めを決めるためのフェーズになります。

TLSのハンドシェイクでは大きく4つのフェーズで行われます。

第1フェーズでは互いが挨拶するとともに、通信で利用する暗号方式などを決めます。まずクライアントからサーバーへ、クライアントが利用可能な暗号方式などを提示します。サーバーは提示された暗号方式の中から利用する暗号方式をクライアントへ伝えます。

第2フェーズでは、サーバーからクライアントへ、公開鍵証明書を提示します。クライアントは提示された公開鍵証明書が妥当かデジタル署名を検証します。またサーバーとクライアントは、利用する暗号方式によっては、追加で鍵交換なども行います。

第3フェーズでは、クライアントからサーバーへ、第2フェーズで受け取った公開鍵で暗号化されたマスターシークレットを渡します。サーバーはマスターシークレットを元に、共通鍵CBCモードの初期化ベクトル(IV)などを生成します。

第4フェーズでは互いの挨拶が終わることを確認して、暗号化通信を開始します。

TLSレコード

一般的にデータを送信するレコードは以下のように圧縮、暗号化を行います。以下は一例です。採用した暗号方式によっては多少変わります。

  1. 平文を214バイト以下のブロックに分割します。
  2. 分割した平文を圧縮します。
    この時に利用する圧縮方式は、ハンドシェイクを行った際に決定します。
  3. 圧縮したデータに対してMAC値を付与します。
  4. 圧縮したデータ+MAC値に対して共通鍵暗号方式で暗号化します。
  5. 暗号文に対してヘッダ情報を付与して送信します。

おわりに

TLS1.2では、ハンドシェイクでサーバーが提示した公開鍵証明書でなりすましがないか検証を行います。そして、公開鍵証明書に記載されている公開鍵により安全に共通鍵を共有します。その後はメッセージ認証コードにて改ざんがないことを確認しつつ、共通鍵暗号方式によってデータを暗号化して安全に通信を行います。これまで紹介した暗号技術すべてを駆使していることが分かるかと思います。

以前、公開鍵暗号方式でもお話しした通り、RSAによる鍵共有は非推奨となっています。TLS1.2ではDH鍵共有を選択することも出来ます。TLS1.3ではRSAによる鍵共有は禁止となったため、今回紹介した内容と少し違った動きをします。次回はTLS1.3をお話ししたいと思います。

ではまた。

Recommendおすすめブログ