Home > ブログ > TLS1.3におけるChange Cipher Specメッセージ

ブログ

TLS1.3におけるChange Cipher Specメッセージ

TLS1.2ではHandshakeにおいてChange Cipher Specを送信していましたが、TLS1.3ではこの手順はなくなりました。ただ、TLS Handshakeのやりとりをキャプチャしてみると、依然としてChange Cipher Specが送信されています(図1)。

TLSのフルハンドシェイク
図1 TLS1.3フルハンドシェイク(Change Cipher Specあり)

これは、クライアント/サーバー間にファイアウォール等のセキュリティ関連の装置(RFC等のドキュメントではミドルボックスと呼ばれています)が存在し、それがTLS1.3をサポートしていない場合に、不正なデータとしてパケットが破棄されることが想定されるため、TLS1.2のハンドシェイク手順に見せかける互換性のためにダミーで送信されたものです。

rfc8446 1.2. Major Differences from TLS 1.2

The handshake state machine has been significantly restructured to be more consistent and to remove superfluous messages such as ChangeCipherSpec (except when needed for middlebox compatibility).

ハンドシェイク状態マシンは大きく再構築されました、そして、Change Cipher Specのような余分なメッセージは削除されました(ミドルボックスへの互換性が必要な時を除いて)

TLS1.3においては、Change Cipher Specを受信しても単に無視するだけになります。

いくつかのクライアント(ブラウザ)やサーバーの通信を見てみましたが、現時点では、TLS1.3においてもChange Cipher Specが送信されているようです。

OpenSSLでは

ちなみにOpenSSLでもデフォルトの設定では、Change Cipher Specを送信します。

Change Cipher Specの送信に関する設定としては、SSL_OP_ENABLE_MIDDLEBOX_COMPATというオプションがあり、現状(OpenSSL1.1.1や3系)ではデフォルトでOnになっています。

以下のようにすれば無駄なChange Cipher Specの送信を抑止することはできます。

SSL_CTX_clear_options(ctx, SSL_OP_ENABLE_MIDDLEBOX_COMPAT);
TLSのフルハンドシェイク
図2 SSL_OP_ENABLE_MIDDLEBOX_COMPATをOffにした例

図2を見るとクライアント側からChange Cipher Specが送信されなくなっているのがわかります。

man(*1)によると将来のバージョンにおいてはOffになるかもしれないことが示唆されています。上述のとおり、Change Cipher Specは送信されても問題ないので、この設定はOpenSSLのデフォルト値に任せておき、個別にいじる必要はないでしょう。

ということで当分はTLS1.3についてもChange Cipher Specが送信され続けるのでしょう。

GnuTLSとか他の実装はどうなっているんでしょうか。

(*1) man SSL_CTX_set_options

投稿日:2023/02/04 22:48

タグ: ネットワーク OpenSSL

ネットワーク関連のソフトウェア開発でしたらおまかせください。
詳細はこちら

Top

アーカイブ

タグ

Server (28) 作業実績 (21) PHP (19) ネットワーク (17) プログラミング (15) OpenSSL (10) C (8) C++ (8) PHP関連更新作業 (8) EC-CUBE (7) Webアプリ (7) laravel (6) 書籍 (5) Nginx (5) Linux (5) AWS (4) Vue.js (4) JavaScript (4) 与太話 (4) Rust (3) Symfony (2) お知らせ (2) Golang (2) OSS (1) MySQL (1) デモ (1) CreateJS (1) Apache (1)