TLS (旧SSL)

【図解】TLSの暗号化スイートの見方とセキュリティ設定/脆弱性の確認方法

TLS の暗号化スイートのリスト

TLS の暗号化スイートとして定義されているものが以下の IANA ページにまとめられています。

Transport Layer Security (TLS) Parameters

暗号化スイートの見方 ~TLS v1.2 の場合と TLS v1.3 の場合~

暗号化スイートの表記は TLS v1.2 までは以下の構成となっています。

【TLS v1.2 まで】
TLS_[鍵交換 (Kx)]_[認証 (Au)]_WITH_[共通鍵暗号 (Enc)]_[ハッシュ (Hash/Mac)]

例えば鍵交換を ECDHE、認証 (デジタル署名) を RSA, 共通鍵暗号を AES128, ハッシュを SHA256 とした場合、「TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256」となります。

ところが、TLS v1.3 では以下の構成となりました。AEAD とは簡単に言うと「共通鍵暗号による暗号化とメッセージ改竄検知を同時に行う」方式です。

【TLS v1.3 から】
TLS_[AEAD方式 (Enc/Mac)]_[ハッシュ (Hash)]
※鍵交換は key_share exntension, 認証 (デジタル署名) は signature_algorithms extension にてネゴシエーション

鍵交換 (Kx) 方式と認証 (Au) 方式は削除されました。

なぜかって言うと、以下のように TLS extension (拡張属性) でネゴシエーションされることになったからです。(別に暗号化方式とセットでネゴする必要が無いことに気付いたのですね。)

  • 鍵交換 = supported_groups extension, key_share extension
  • 認証 (デジタル署名) = signature_algorithms extension

key_share と signature_algorithms の extension が付いた Client Hello パケットのキャプチャを以下に示します (本当は supported_groups もありますがここでは割愛)。青が signature_algorithms で緑が key_share です。

key_share では DH 公開鍵も一緒に送ってしまいます。

また、ハッシュのうち Mac (メッセージ改竄検知) は AEAD に機能が巻き取られているため、[ハッシュ] は HMAC ベース鍵導出関数 (HKDF : HMAC-based Key Derivation Function) の用途のみで使われるようになります。

サーバ設定で実装される暗号化スイート

例えば openssl の場合、openssl ciphers -V で暗号化スイートのリストが確認できます。

[root@localhost ~]# openssl version
OpenSSL 1.1.1c FIPS  28 May 2019
[root@localhost ~]# openssl ciphers -V
 0x13,0x02 - TLS_AES_256_GCM_SHA384  TLSv1.3 Kx=any      Au=any  Enc=AESGCM(256) Mac=AEAD
 0x13,0x03 - TLS_CHACHA20_POLY1305_SHA256 TLSv1.3 Kx=any      Au=any  Enc=CHACHA20/POLY1305(256) Mac=AEAD
 0x13,0x01 - TLS_AES_128_GCM_SHA256  TLSv1.3 Kx=any      Au=any  Enc=AESGCM(128) Mac=AEAD
 0x13,0x04 - TLS_AES_128_CCM_SHA256  TLSv1.3 Kx=any      Au=any  Enc=AESCCM(128) Mac=AEAD
 0xC0,0x2C - ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESGCM(256) Mac=AEAD
 0xC0,0x30 - ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(256) Mac=AEAD
 0xCC,0xA9 - ECDHE-ECDSA-CHACHA20-POLY1305 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=CHACHA20/POLY1305(256) Mac=AEAD
 0xCC,0xA8 - ECDHE-RSA-CHACHA20-POLY1305 TLSv1.2 Kx=ECDH     Au=RSA  Enc=CHACHA20/POLY1305(256) Mac=AEAD
 0xC0,0xAD - ECDHE-ECDSA-AES256-CCM  TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESCCM(256) Mac=AEAD
 0xC0,0x2B - ECDHE-ECDSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESGCM(128) Mac=AEAD
 0xC0,0x2F - ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(128) Mac=AEAD
 0xC0,0xAC - ECDHE-ECDSA-AES128-CCM  TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESCCM(128) Mac=AEAD
 0xC0,0x23 - ECDHE-ECDSA-AES128-SHA256 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AES(128)  Mac=SHA256
 0xC0,0x27 - ECDHE-RSA-AES128-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AES(128)  Mac=SHA256
 0xC0,0x0A - ECDHE-ECDSA-AES256-SHA  TLSv1 Kx=ECDH     Au=ECDSA Enc=AES(256)  Mac=SHA1
 0xC0,0x14 - ECDHE-RSA-AES256-SHA    TLSv1 Kx=ECDH     Au=RSA  Enc=AES(256)  Mac=SHA1
 0xC0,0x09 - ECDHE-ECDSA-AES128-SHA  TLSv1 Kx=ECDH     Au=ECDSA Enc=AES(128)  Mac=SHA1
 0xC0,0x13 - ECDHE-RSA-AES128-SHA    TLSv1 Kx=ECDH     Au=RSA  Enc=AES(128)  Mac=SHA1
 0x00,0x9D - AES256-GCM-SHA384       TLSv1.2 Kx=RSA      Au=RSA  Enc=AESGCM(256) Mac=AEAD
 0xC0,0x9D - AES256-CCM              TLSv1.2 Kx=RSA      Au=RSA  Enc=AESCCM(256) Mac=AEAD
 0x00,0x9C - AES128-GCM-SHA256       TLSv1.2 Kx=RSA      Au=RSA  Enc=AESGCM(128) Mac=AEAD
 0xC0,0x9C - AES128-CCM              TLSv1.2 Kx=RSA      Au=RSA  Enc=AESCCM(128) Mac=AEAD
 0x00,0x3D - AES256-SHA256           TLSv1.2 Kx=RSA      Au=RSA  Enc=AES(256)  Mac=SHA256
 0x00,0x3C - AES128-SHA256           TLSv1.2 Kx=RSA      Au=RSA  Enc=AES(128)  Mac=SHA256
 0x00,0x35 - AES256-SHA              SSLv3 Kx=RSA      Au=RSA  Enc=AES(256)  Mac=SHA1
 0x00,0x2F - AES128-SHA              SSLv3 Kx=RSA      Au=RSA  Enc=AES(128)  Mac=SHA1
 0x00,0x9F - DHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=DH       Au=RSA  Enc=AESGCM(256) Mac=AEAD
 0xCC,0xAA - DHE-RSA-CHACHA20-POLY1305 TLSv1.2 Kx=DH       Au=RSA  Enc=CHACHA20/POLY1305(256) Mac=AEAD
 0xC0,0x9F - DHE-RSA-AES256-CCM      TLSv1.2 Kx=DH       Au=RSA  Enc=AESCCM(256) Mac=AEAD
 0x00,0x9E - DHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=DH       Au=RSA  Enc=AESGCM(128) Mac=AEAD
 0xC0,0x9E - DHE-RSA-AES128-CCM      TLSv1.2 Kx=DH       Au=RSA  Enc=AESCCM(128) Mac=AEAD
 0x00,0x6B - DHE-RSA-AES256-SHA256   TLSv1.2 Kx=DH       Au=RSA  Enc=AES(256)  Mac=SHA256
 0x00,0x67 - DHE-RSA-AES128-SHA256   TLSv1.2 Kx=DH       Au=RSA  Enc=AES(128)  Mac=SHA256
 0x00,0x39 - DHE-RSA-AES256-SHA      SSLv3 Kx=DH       Au=RSA  Enc=AES(256)  Mac=SHA1
 0x00,0x33 - DHE-RSA-AES128-SHA      SSLv3 Kx=DH       Au=RSA  Enc=AES(128)  Mac=SHA1
 0x00,0xA9 - PSK-AES256-GCM-SHA384   TLSv1.2 Kx=PSK      Au=PSK  Enc=AESGCM(256) Mac=AEAD
 0xCC,0xAB - PSK-CHACHA20-POLY1305   TLSv1.2 Kx=PSK      Au=PSK  Enc=CHACHA20/POLY1305(256) Mac=AEAD
 0xC0,0xA5 - PSK-AES256-CCM          TLSv1.2 Kx=PSK      Au=PSK  Enc=AESCCM(256) Mac=AEAD
 0x00,0xA8 - PSK-AES128-GCM-SHA256   TLSv1.2 Kx=PSK      Au=PSK  Enc=AESGCM(128) Mac=AEAD
 0xC0,0xA4 - PSK-AES128-CCM          TLSv1.2 Kx=PSK      Au=PSK  Enc=AESCCM(128) Mac=AEAD
 0x00,0x8D - PSK-AES256-CBC-SHA      SSLv3 Kx=PSK      Au=PSK  Enc=AES(256)  Mac=SHA1
 0x00,0xAE - PSK-AES128-CBC-SHA256   TLSv1 Kx=PSK      Au=PSK  Enc=AES(128)  Mac=SHA256
 0x00,0x8C - PSK-AES128-CBC-SHA      SSLv3 Kx=PSK      Au=PSK  Enc=AES(128)  Mac=SHA1
 0x00,0xAB - DHE-PSK-AES256-GCM-SHA384 TLSv1.2 Kx=DHEPSK   Au=PSK  Enc=AESGCM(256) Mac=AEAD
 0xCC,0xAD - DHE-PSK-CHACHA20-POLY1305 TLSv1.2 Kx=DHEPSK   Au=PSK  Enc=CHACHA20/POLY1305(256) Mac=AEAD
 0xC0,0xA7 - DHE-PSK-AES256-CCM      TLSv1.2 Kx=DHEPSK   Au=PSK  Enc=AESCCM(256) Mac=AEAD
 0x00,0xAA - DHE-PSK-AES128-GCM-SHA256 TLSv1.2 Kx=DHEPSK   Au=PSK  Enc=AESGCM(128) Mac=AEAD
 0xC0,0xA6 - DHE-PSK-AES128-CCM      TLSv1.2 Kx=DHEPSK   Au=PSK  Enc=AESCCM(128) Mac=AEAD
 0x00,0x91 - DHE-PSK-AES256-CBC-SHA  SSLv3 Kx=DHEPSK   Au=PSK  Enc=AES(256)  Mac=SHA1
 0x00,0xB2 - DHE-PSK-AES128-CBC-SHA256 TLSv1 Kx=DHEPSK   Au=PSK  Enc=AES(128)  Mac=SHA256
 0x00,0x90 - DHE-PSK-AES128-CBC-SHA  SSLv3 Kx=DHEPSK   Au=PSK  Enc=AES(128)  Mac=SHA1
 0xCC,0xAC - ECDHE-PSK-CHACHA20-POLY1305 TLSv1.2 Kx=ECDHEPSK Au=PSK  Enc=CHACHA20/POLY1305(256) Mac=AEAD
 0xC0,0x36 - ECDHE-PSK-AES256-CBC-SHA TLSv1 Kx=ECDHEPSK Au=PSK  Enc=AES(256)  Mac=SHA1
 0xC0,0x37 - ECDHE-PSK-AES128-CBC-SHA256 TLSv1 Kx=ECDHEPSK Au=PSK  Enc=AES(128)  Mac=SHA256
 0xC0,0x35 - ECDHE-PSK-AES128-CBC-SHA TLSv1 Kx=ECDHEPSK Au=PSK  Enc=AES(128)  Mac=SHA1
[root@localhost ~]#

どの暗号化スイートを使うべきか?優先順位は?

IPA に良い資料が載っています。2020年10月版です。

https://www.ipa.go.jp/security/ipg/documents/tls_cipher_suite_config_20200707.pdf

1.1.1. OpenSSL 系での暗号スイートの設定例
〔TLS1.3 用暗号スイート設定文字列〕
TLS1.3 でサポートする暗号スイートは、コロン(:)で区切られた暗号スイート名を並べた文字列によって指定する。このとき、先頭に記載されたものがより高い優先順位を持つ。以下にガイドラインに適合する TLS1.3 用の暗号スイートの設定例を示す。これはガイドラインに記載されたもののうち極力多くをサポートする設定例であるため、必要に応じて一部を削除することも可能である。

■ 推奨セキュリティ型、セキュリティ例外型の設定例
TLS_AES_128_GCM_SHA256:TLS_AES_128_CCM_SHA256:TLS_AES_128_CCM_8_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256

■ 高セキュリティ型の設定例
TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:TLS_AES_128_CCM_SHA256:TLS_AES_128_CCM_8_SHA256

以下にガイドラインの各型に適合する TLS1.2 以前用の暗号スイートの設定例を示す。これらはガイドラインに記載されたもののうち極力多くをサポートする設定例であるため、必要に応じて一部を削除することも可能である。

■ パターン名による推奨セキュリティ型の設定例
ECDHE+AESGCM:DHE+aRSA+AESGCM:ECDHE+AESCCM:DHE+aRSA+AESCCM:+AES256:ECDHE+CHACHA20:DHE+aRSA+CHACHA20:+DHE:ECDHE+AES128:ECDHE+CAMELLIA128:ECDHE+AES:ECDHE+CAMELLIA:+ECDHE+SHA:DHE+aRSA+AES128:DHE+aRSA+CAMELLIA128:DHE+aRSA+AES:DHE+aRSA+CAMELLIA:+DHE+aRSA+SHA

Web サーバの https (SSL/TLS) 設定のセキュリティチェック

例えばこんなサイトで Web サーバの https (SSL/TLS) 設定のセキュリティチェックができます。

SSL Server Test (Powered by Qualys SSL Labs)
A comprehensive free SSL test for your p...

弱い暗号化スイートをサポートしてしまっていることで、ダウングレード攻撃などの恐れもありますので、参考にしながらチューニングすると良いでしょう。

脆弱性情報も確認できます。(英語だけど)

ブラウザから TLS の暗号化スイートを確認

Edge や Chrome から、今見ているサイトの暗号化スイートを確認したい場合は、F12 の開発者ツールを表示し、「Security」タブで確認できます。

ssllabs.com さんはさすがの TLS1.3 でした。鍵交換方式が [ECDHE (X25519)] で、AEAD 方式が [AES_128_GCM] という結果でした。(サーバ認証は証明書内から [RSA 2048bit] であることが分かります)

コメント

タイトルとURLをコピーしました