TLSの拡張性を維持するために、未知の拡張仕様を実装が正しく無視するように「Applying Generate Random Extensions And Sustain Extensibility (GREASE) to TLS Extensibility」という仕様が長らく議論されてきました。
2020年1月に無事RFC8701になったので、その話を簡単に紹介する。実際にいくつかの実装がすでに使っている。
詳細な背景については、大津先生の記事を参照ください
錆びついたTLSを滑らかに、GoogleによるGREASE試験 - ぼちぼち日記
なお、GREASEの仕組み自体はTLS以外にも他のプロトコルでも導入が検討されてたりします(HTTP2の例)。
GREASE
TLS1.3の標準化をすすめる中で新しいTLS拡張などを定義しました。
未知のTLS拡張は無視されなければなりませんが、正しく処理せず接続を拒否する実装などがありました。
そのため、未知のTLS拡張などを正しく無視するのを確認する用の番号群を定義するのがGREASEです。
RFC8701では ALPN, cipher suitesや、TLS拡張, namedGroups, 署名アルゴリズム, バージョン番号などにGREASE用の値が確保されます。
クライアントはそれらの値を含めてネゴシエーションしていいことになっています。ただし、その値をサーバが選んでしまった場合は切断しなければなりません。
一方、サーバはGREASE用の値を特別扱いせず未知の値として無視しなければなりません。
予約されてる値
cipher suitesおよびALPN識別子
- {0x0A,0x0A}
- {0x1A,0x1A}
- {0x2A,0x2A}
- {0x3A,0x3A}
- {0x4A,0x4A}
- {0x5A,0x5A}
- {0x6A,0x6A}
- {0x7A,0x7A}
- {0x8A,0x8A}
- {0x9A,0x9A}
- {0xAA,0xAA}
- {0xBA,0xBA}
- {0xCA,0xCA}
- {0xDA,0xDA}
- {0xEA,0xEA}
- {0xFA,0xFA}
拡張機能、namedGroups、署名アルゴリズム、およびバージョン
- 0x0A0A
- 0x1A1A
- 0x2A2A
- 0x3A3A
- 0x4A4A
- 0x5A5A
- 0x6A6A
- 0x7A7A
- 0x8A8A
- 0x9A9A
- 0xAAAA
- 0xBABA
- 0xCACA
- 0xDADA
- 0xEAEA
- 0xFAFA
PskKeyExchangeModes
- 0x0B
- 0x2A
- 0x49
- 0x68
- 0x87
- 0xA6
- 0xC5
- 0xE4