【Net】暗号スイート (cipher suite) とは

  • 2021年1月10日
  • 2021年3月23日
  • PKI
PKI

SSL/TLS にてデータを暗号化して通信を行うには、自分自身と通信相手の両方が利用可能なアルゴリズムを使う必要があります。
不特定の相手と両者が利用可能なアルゴリズムを確認しあうために使われるのが 暗号スイート(cipher suite) となります。

今回は SSL/TLS の仕組みを理解するにあたり、重要な要素を担う暗号スイートについて説明します。

 

暗号スイート(cipher suite)

暗号スイートとは、鍵交換や暗号化方式、ハッシュ関数など暗号化通信に使われる各種アルゴリズムの組み合わせのことです。

SSL/TLS では、通信データの暗号化を行う共通鍵暗号、共通鍵暗号に使用する鍵の交換を行うアルゴリズムなど複数の技術を組み合わせて暗号化通信を実現しています。

共通鍵暗号、鍵交換、ハッシュ関数の技術にも複数のアルゴリズムがありますので、暗号化通信を成立させるためには自分自身と通信相手の両方が利用できるアルゴリズムである必要があります。

インターネット上で暗号化通信を行う場合、不特定多数の通信相手と双方が利用可能なアルゴリズムを確認した通信を行う必要があります。

SSL/TLS において利用可能なアルゴリズムを確認を簡素化できるように、各種アルゴリズムの組み合わせを定義した暗号スイートの規約が策定されました。

暗号化通信において、どのアルゴリズムを利用して通信を行うのか決めるために、SSL/TLS ハンドシェイクの過程でクライアントはまず自分自身が利用可能な暗号スイートの一覧を通信相手に通知します。
通信相手となるサーバーは通知された暗号スイート一覧から、自身も利用可能な暗号スイートを一つ選択して、選択した暗号スイートをクライアントに通知します。
ここで選択された暗号スイートのアルゴリズムを利用して、鍵交換や通信データの暗号化を行います。

 

暗号スイートの構造

暗号スイートは、鍵交換にはこのアルゴリズムを利用し、通信データの暗号化にはこのアルゴリズムを利用するという利用用途ごとに使用するアルゴリズムの組み合わせを定義したもののことです。

暗号スイート表記の基本的な見方は以下の通りです。

上記の通り、暗号スイートは “鍵交換 → 認証 → 共通鍵暗号 → MAC (メッセージ認証) または RFC (疑似乱数生成)” の順でアルゴリズムが定義されています。

暗号スイートの中にある各アルゴリズムが何に使用されているのか見ていきます。 

 

鍵交換

SSL/TLS での暗号化通信では、通信データの暗号化の処理は、処理の負荷が低い “共通鍵暗号” のアルゴリズムを利用します。
共通鍵暗号では通信相手と事前に共通の鍵を保持している必要がありますので、SSL/TLS ハンドシェイクの段階で共通鍵を交換しておく必要があります。

SSL/TLS ハンドシェイクは、通信の暗号化が開始される前に実施されるので、鍵交換を行うためのパケットは平文で送信されます。
そのため、悪意がある第三者が SSL/TLS ハンドシェイクの通信を盗聴していたとしても、通信を行う二者のみが共通鍵を保持できるように安全に鍵を交換する仕組みが必要です。

インターネット上で安全に共通鍵を交換するための仕組みを決めたアルゴリズムのことを鍵交換方式と呼びます。

よく利用される鍵交換方式として、RSA、DHE、ECDHE があります。

 

認証

鍵交換の際にデジタル署名の技術を利用して、鍵交換をしている通信相手の認証を行います。
一般的には、TLS ハンドシェイクの際に利用される証明書を利用して認証します。

 

共通鍵暗号

SSL/TLS での暗号化通信では、通信データの暗号化の処理は、処理の負荷が低い “共通鍵暗号” のアルゴリズムを利用します。
共通鍵暗号の表記の方法として、[共通鍵暗号のアルゴリズムの種類]_[共通鍵の長さ]_[暗号モード] という順で表記されます。

共通鍵暗号のアルゴリズムの種類として、DES、3DES、AES、RC4 など複数のアルゴリズムが存在しており、そのどれを利用するのか示します。
共通鍵の長さは、アルゴリズムの種類によっては鍵の長さを選択できるものあるため(AES等)、暗号スイートで指定します。
暗号モードは、DES や AES のようなブロック暗号とよばれる共通鍵暗号で利用される、暗号処理の仕組みを定義したものです。
RC4 のようなストリーム暗号とよばれる共通鍵暗号では暗号モードは利用されないので省略されます。

 

メッセージ認証

暗号化通信で届いたデータが途中で改ざんされていないか、また正しい通信相手が送信したデータなのか認証するための仕組みです。
メッセージ認証はデジタル署名の仕組みと似ており、暗号化データのハッシュ値を算出し(=改ざん検知)、そのデータを共通で保有する鍵で暗号化した値(MAC、PRF) を実データに付与して送ります。
メッセージのハッシュ値を算出して暗号化したデータを送信すると、”共通の鍵を保有している相手” と通信していることを意味するので(第三者が送信したデータではない)、データを改ざんがなく、意図した相手と通信できていることを意味します。

 

暗号スイートの選定方法

暗号スイートの鍵交換方式、共通鍵暗号化方式、ハッシュアルゴリズムによって特徴やセキュリティ強度が異なります。
SSL/TLS 通信を行う際に、通信相手と SSL/TLS ハンドシェイクにてネゴシエーションを行って、どの暗号スイートを用いるかを決めます。
お互い利用可能な共通の暗号スイートがない場合は、SSL/TLS 通信の確立は失敗します。

SSL/TLS ハンドシェイクで、TLS 通信で使用する暗号スイートを決定する流れは以下の通りです。

  1. クライアントはサーバーに対し、クライアントが利用できる暗号スイートの一覧 (優先度高い順)を Client Hello に含めて送信
  2. サーバーはクライアントから受信した Client Hello に含まれる暗号スイートの一覧を確認し、自身もサポートしている暗号スイートがあるかどうかを確認
    もし共通して利用できる暗号スイートが複数あった場合は、自身が一番優先度が高い暗号スイートを選択
  3. サーバーは選択した暗号スイートを Server Hello に含めて送信
  4. その後に決定した暗号スイートを利用して TLS 通信を開始

 

暗号スイートの設定方法:Windows

Windows OS での暗号スイートの設定は、レジストリおよびグループ ポリシーにて行えます。
利用可能な暗号スイートは複数あり、優先順位の高い(より利用してほしい暗号スイートの)順で並べて設定されています。

例えば、以下の設定をされていた場合、暗号スイートの設定順序は以下の通りです。

設定:<暗号スイート A>、<暗号スイート B>、<暗号スイート C>
優先順位:暗号スイート A ⇒ 暗号スイート B ⇒ 暗号スイート C

レジストリでの設定

設定を変更する端末上で、レジストリ エディターにより以下のレジストリ キーにより暗号スイートを設定できます。

レジストリ キー : HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Cryptography\Configuration\Local\SSL\00010002
値:Functions
型:MULTI_SZ
設定値:以下のようなフォーマットで定義します。

  <暗号スイート A (優先順位: 高)>
  <暗号スイート B>
  <暗号スイート C>
  <暗号スイート D (優先順位: 低)>

※ レジストリにより暗号スイートの設定を変更した場合は、設定を反映させるためには OS を反映させる必要があります。

 

グループ ポリシーでの設定

ポリシー パス:[コンピュータの構成] – [ポリシー] – [管理用テンプレート] – [ネットワーク] – [SSL 構成設定] – [SSL 暗号の順位]
設定値:以下のようなフォーマットで定義します。

<暗号スイート A (優先順位: 高)>,<暗号スイート B>,<暗号スイート C>,<暗号スイート D (優先順位: 低)>

ポリシーの設定が行われている場合、ポリシーの配布先の端末に以下のレジストリ パスに設定値が保存されます。

HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Cryptography\Configuration\Local\SSL\00010002

 

※ 補足
暗号スイートのレジストリ設定は既定で存在しますが、ポリシーの設定は既定では未構成となります。
もしポリシーにより暗号スイートの設定を行われている場合、ローカルのレジストリ設定よりもポリシーの設定の方が優先されます。