SSL/TLS ver1.2/ver1.3の違い - (ハンドシェイク) 


以前作成した、SSL/TLSの概要に関してをまとめた下記の記事の続きとなります。
[暗号方式とSSL/TLS](https://qiita.com/tom_S/items/2a994f353ef5e15554d1)

上記の記事では、SSL/TLS ver 1.2とver 1.3でハンドシェイクプロトコルに違いがあることを考慮できていなかったため、この記事でその辺りに関して書いております。

# SSL/TLSのバージョン

SSL/TLSのver1.3では、セキュリティの脆弱性に対応するため、ver1.2からハンドシェイクプロトコルにおいて大幅に変更が入っています。ハンドシェイクの変更点としては主に下記となります。

- ハンドシェイクのシーケンス
- 暗号スイートの合意方法
- 共通鍵の鍵交換に使用するアルゴリズム

これらの項目に関して、順番に説明していきます。

# ハンドシェイクのシーケンス

SSL/TLSのハンドシェイクは、主に共有鍵の生成と証明書の交換を行い、暗号化通信で使用する暗号方式を決めます。ハンドシェイクの目的に関してはver1.2とver1.3で変わりませんが、実際にやり取りを行うシーケンスがver1.2とver1.3で大きく変わります。

## SSL/TLS ver1.2

SSL/TLS ver1.2における、ハンドシェイクのシーケンスを下記に示します。

![ハンドシェイクプロトコル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266944/6965d5f6-8c32-4f37-a8a7-a65a33f8574c.png)

使用する暗号方式の合意に関しては「Client Hello」と「Server Hello」、
鍵交換には「Client Key Exchange」と「Server Key Exchange」、
のように、一つのメッセージにつき、一つの決め事を行うようになっている傾向にあります。

## SSL/TLS ver1.3

SSL/TLS ver1.3は、TLS ver 1.2に比べてハンドシェイクを行う際のやり取りが短縮化されています。
下記はTLS ver 1.3のハンドシェイクのシーケンスです。

![ハンドシェイクプロトコル_ver1.3.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266944/8f35c23b-dda2-4d9c-a287-218ad4929579.png)

SSL/TLS ver1.2の「Server Key Exchange」や「Server Key Exchange」などのメッセージが無くなり、「Client Hello」と「Serve Hello」のやり取りで、使用する暗号方式の合意と共有鍵生成用のパラメータの交換を行います。
そして、「Serve Hello」以降のメッセージは暗号化通信で行われます。この部分はSSL/TLS ver1.2では非暗号化通信となっており、脆弱性の原因となる場合もあったため、SSL/TLS ver 1.3では暗号化通信でおこなわれるようになっています。

# 暗号スイートの合意方法

SSL/TLS ver1.2までは暗号スイートには、下記の四つに関して使用する暗号方式・アルゴリズムを指定していました。

- 鍵交換に使用するアルゴリズム
- 署名検証
- 共通鍵暗号
- 一方向ハッシュ関数

SSL/TLS ver 1.3の暗号スイートでは下記の二つのみが指定されます。

- 共通鍵暗号
- 一方向ハッシュ関数

このように変更されたのは、SSL/TLS ver 1.3では、鍵交換に使用するアルゴリズム、署名検証、共通鍵暗号に関して下記のように更新されていることに起因します。

- 鍵交換に使用するアルゴリズムにおいて静的RSAを廃止。Diffie-Hellman鍵交換、楕円曲線Diffie-Hellman鍵交換のみ使用可能になった
- 署名検証において、静的RSAは使用できなくなり、鍵交換と署名検証はが役割として分離した
- 対応する共通鍵暗号が認証付き暗号(AEAD)のみとなった

鍵交換に使用するアルゴリズムと署名検証のようなパラメータはTLSの拡張パラメータとして指定されるようになりました。
SSL/TLS ver 1.3で対応している暗号スイートに関しては下記の表にまとめておきます。

| 暗号スイート | 使用する共通鍵暗号 | 使用する一方向ハッシュ関数 |
| ---- | ----- | ----- |
| TLS_AES_128_GCM_SHA256 | AES-128-GCM | SHA256 |
| TLS_AES_256_GCM_SHA384 | AES-256-GCM | SHA384 |
| TLS_AES_128_CCM_SHA256 | AES-128-CCM | SHA256 |
| TLS_AES_128_CCM_8_SHA256 | AES-128-CCM-8 | SHA256 |
| TLS_CHACHA20_POLY1305_SHA256 | CHACHA20-POLY1305 | SHA256 | 

# 共通鍵の鍵交換に使用するアルゴリズム

SSL/TLSに関わらず、共通鍵暗号による暗号通信を行う際には鍵交換必ず必要となります。ただ、第三者に盗聴・改竄などをされないように交換する必要があるため、鍵を暗号化したり、予測されないような形で通信相手に渡すような仕組みを使う必要があります。
暗号スイートの項目でも少し触れましたが、
SSL/TLS ver1.2までは公開鍵暗号方式を使用して鍵交換を行うことが可能でしたが、SSL/TLS ver 1.3では Diffie-Hellman鍵交換、楕円曲線Diffie-Hellman鍵交換での鍵交換のみが可能となっています。

## Diffie-Hellman鍵交換

素数の累乗計算の結果を、別の素数で割った際の余りを利用した鍵交換です。下記の図のような流れで鍵交換を行います。

![Diffie-Helman鍵交換.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266944/5a6c1abd-9ab4-490e-973f-a70f2d899646.png)

上記において、公開していけないのは乱数Aと乱数Bのみで、素数PとGは、第三者に盗聴されても問題ありません。加えて、公開してはいけない乱数AとBを誰かに送る必要が無いため、安全に鍵を共有することができます。この利点があるため、SSL/TLS ver 1.3では鍵交換にはこのDiffie-Hellman鍵交換と楕円曲線Diffie-Hellman鍵交換のみが使われます。
楕円曲線Diffie-Hellman鍵交換はこれに楕円曲線の計算を使ったものなのですが、詳細に関しては計算が複雑なのでこの記事では割愛します。


## 参考文献

https://www.shoeisha.co.jp/book/detail/9784798176499

https://www.ibm.com/docs/ja/flashsystem-9x00/8.6.0?topic=r-security-levels-supported-security-ciphers-1

- 暗号技術入門 秘密の国のアリス(書籍)
https://cr.hyuki.net/