暗号化スイートを調べてみた

## 勉強前イメージ

暗号化するためのアルゴリズムなのは知ってるけど、
なんであんなにいっぱいあるんだろう？

## 調査

### 暗号化スイートとは

英語で Cipher Suites と言い、TLSの暗号通信のためのプロトコルで複数の暗号化アルゴリズムの組み合わせのことを指します。
また、暗号化を使う場所が何箇所もあり、その場所ごとにも違う暗号化アルゴリズムが使われています。
暗号化アルゴリズムはいくつも種類があり、2つに分けられます。
アルゴリズムには特徴や暗号化の強度がそれぞれあり、クライアントとサーバ間で提示し合って、どの組み合わせを使うか決めます。

### 暗号化スイートには4つの要素がある

- `Kx` : 鍵交換に使われる暗号化アルゴリズム
- `Au` : 認証に使われる暗号化アルゴリズム
- `Enc` : アプリケーション層の暗号化に使われるアルゴリズム
- `Mac` : メッセージの検証に使われるアルゴリズム

### 実際にサーバで対応している一覧を見る

`openssl ciphers -v` コマンドを使用して確認します

```
[root@localhost ~]# openssl ciphers -v
ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(256) Mac=AEAD
ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESGCM(256) Mac=AEAD
ECDHE-RSA-AES256-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AES(256)  Mac=SHA384
ECDHE-ECDSA-AES256-SHA384 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AES(256)  Mac=SHA384
ECDHE-RSA-AES256-SHA    SSLv3 Kx=ECDH     Au=RSA  Enc=AES(256)  Mac=SHA1
ECDHE-ECDSA-AES256-SHA  SSLv3 Kx=ECDH     Au=ECDSA Enc=AES(256)  Mac=SHA1
DH-DSS-AES256-GCM-SHA384 TLSv1.2 Kx=DH/DSS   Au=DH   Enc=AESGCM(256) Mac=AEAD
DHE-DSS-AES256-GCM-SHA384 TLSv1.2 Kx=DH       Au=DSS  Enc=AESGCM(256) Mac=AEAD
DH-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=DH/RSA   Au=DH   Enc=AESGCM(256) Mac=AEAD
DHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=DH       Au=RSA  Enc=AESGCM(256) Mac=AEAD
DHE-RSA-AES256-SHA256   TLSv1.2 Kx=DH       Au=RSA  Enc=AES(256)  Mac=SHA256
DHE-DSS-AES256-SHA256   TLSv1.2 Kx=DH       Au=DSS  Enc=AES(256)  Mac=SHA256
DH-RSA-AES256-SHA256    TLSv1.2 Kx=DH/RSA   Au=DH   Enc=AES(256)  Mac=SHA256
DH-DSS-AES256-SHA256    TLSv1.2 Kx=DH/DSS   Au=DH   Enc=AES(256)  Mac=SHA256
DHE-RSA-AES256-SHA      SSLv3 Kx=DH       Au=RSA  Enc=AES(256)  Mac=SHA1
DHE-DSS-AES256-SHA      SSLv3 Kx=DH       Au=DSS  Enc=AES(256)  Mac=SHA1
DH-RSA-AES256-SHA       SSLv3 Kx=DH/RSA   Au=DH   Enc=AES(256)  Mac=SHA1
DH-DSS-AES256-SHA       SSLv3 Kx=DH/DSS   Au=DH   Enc=AES(256)  Mac=SHA1
DHE-RSA-CAMELLIA256-SHA SSLv3 Kx=DH       Au=RSA  Enc=Camellia(256) Mac=SHA1
.....
```

色々書いてあって分かりづらい・・・

一番上だけ抜粋して説明します

```
1                           2       3           4       5               6
ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(256) Mac=AEAD
```

- 1.暗号化スイートの名前

`ECDHE-RSA-AES256-GCM-SHA384` の箇所になります

ECDHE : 鍵交換方式(Kx)を意味する ※3の箇所
RSA : 鍵認証方式(Au)を意味する ※4の箇所
AES256 : メッセージ暗号方式(Enc)を意味する ※5の箇所
GCM : ブロック処理を意味する ※5の箇所
SHA384 : メッセージ署名方式(Mac)を意味する ※5,6の箇所

- 2.プロトコルのバージョン

`TLSv1.2` の箇所になります
この暗号化スイートがどのプロトコルで使用されるかが書かれています

- 3.[Kx]鍵交換に使われる暗号化アルゴリズム

`Kx=ECDH` の箇所になります
Kxは鍵交換( `Key Exchange` ) の略
鍵交換に使われる暗号化アルゴリズムが `EDDH` という意味
Enc(アプリケーション層の暗号化に使われるアルゴリズム),Mac(メッセージの検証に使われるアルゴリズム)で使用する共通鍵の元のデータを共有する機能

- 4.[Au]認証に使われる暗号化アルゴリズム

`Au=RSA` の箇所になります
Auは認証( `Authentication` ) の略
鍵の認証に使われる暗号化アルゴリズムが `RSA` という意味
鍵交換(Kx)とも連携して、サーバ側がなりすましでないことを確認する機能
サーバ証明書の正当な所有者であることを、証明書に含まれる公開鍵に対応する秘密鍵を使って証明する
電子署名の場合、署名を作れるのは秘密鍵の所有者のみという理屈から、署名を送ることで秘密鍵自体を提示することなく、秘密鍵の所有を証明する

- 5.[Enc]アプリケーション層の暗号化に使われるアルゴリズム

`Enc=AESGCM(256)` の箇所になります
Encは暗号化( `Encryption` ) の略
アプリケーション層での暗号化に使われる暗号化アルゴリズムが `AESGCM(256)` という意味
通信データを暗号化する機能

- 6.[Mac]メッセージの検証に使われるアルゴリズム

`Mac=AEAD` の箇所になります
Macはメッセージ認証コード( `Message Authentication Code` ) の略
通信データに改ざんがないかどうか調べる機能
確認用のデータ(メッセージ認証コード)を付与して送信し、受信側は整合性が取れているか確認する


### ブラウザで見るにはどこを見ればよいか

F12を押して、Securityのタブで確認が出来ます。

![暗号化スイートhttpsだからというだけで安全？調べたら怖くなってきたSSLの話!？ - Qiita - Goog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/79a1f6b3-b03a-987d-95e6-fd6c8feca8cc.png)


## 勉強後イメージ

場所によって暗号化アルゴリズムが違うし、
そもそも暗号化アルゴリズムがいっぱいあるから組み合わせもたくさんあり、
暗号化スイートがいっぱいあるのか！
面白いなぁ

## 参考

- [SSL/TLSの基本](https://qiita.com/angel_p_57/items/446130934b425d90f89d)
- [【図解】TLSの暗号化スイートの見方とセキュリティ設定/脆弱性の確認方法](https://milestone-of-se.nesuke.com/nw-basic/tls/cipher-suites-list-vuls/)
- [暗号スイートの暗号強度と、公開鍵のビット数の設定](https://http2.try-and-test.net/ecdhe.html)
- [楽しい暗号スイートの話](https://blog.oliva.co.jp/index.php/2019/08/20/740/)
- [理解してるつもりの SSL/TLS でも、もっと理解したら面白かった話](https://tkengo.github.io/blog/2015/12/01/https-details/)
- [我々はどのようにして安全なHTTPS通信を提供すれば良いか](https://qiita.com/harukasan/items/fe37f3bab8a5ca3f4f92)