はじめに

先日、nginx 1.19.4 がリリースされ、ssl_conf_command ディレクティブが追加されました。
これにより、ChaCha20-Poly1305 を使った暗号スイートの運用が現実的になりました。

ChaCha20-Poly1305 の概要

RFC 7905 (2016/06) より、TLS における ChaCha20-Poly1305 の利用が標準化され、様々なライブラリで利用可能になっています。
OpenSSL だと 1.1.0 以降で利用可能です。

ChaCha20-Poly1305 は、ストリーム暗号である ChaCha20 とメッセージ認証符号である Poly1305 を組み合わせた、認証付き暗号です。

ChaCha20-Poly1305 はソフトウェア処理に向いた、簡潔なアルゴリズムです。
AES はハードウェア処理 (AES-NI) が利用できる環境ではとても高速ですが、ソフトウェア処理においては ChaCha20-Poly1305 の方が AES-GCM より 3 倍程度性能が出るようです。

このような性質から、TLS クライアントによっては、ネゴシエーション時にこの性能を考慮した暗号スイートリストを使うようになっています。

これまでの課題

TLS のネゴシエーションにおける暗号スイートは、クライアントとサーバの暗号スイートリストを比較することで、1 つに決定されます。
一般的な TLS サーバは、 サーバ側の暗号スイートリストを優先して 暗号スイートを決定するように設定されています。
つまり、クライアントの暗号スイートリストで AES-GCM または ChaCha20-Poly1305 が適切な優先度になっているのに、サーバの設定により決まった 1 つに決定されてしまいます。

これは、「サーバ側の暗号スイートリストを優先しつつ、特定の暗号スイート (特に ChaCha20-Poly1305) についてはクライアントの提示に従う」といった設定をすることで対処が可能ですが、これまで nginx の設定ファイルのみではできませんでした。

ssl_conf_command ディレクティブ

nginx 1.19.4 で追加された ssl_conf_command ディレクティブ により、OpenSSL の各種設定を、 SSL_CONF_cmd を通して行う事ができるようになりました。

下記の設定をすることで、 クライアントが ChaCha20 の暗号スイートを優先している場合はサーバも優先する という動作をさせることができます。

ssl_conf_command Options PrioritizeChaCha;

この設定を行い、Qualys SSL Labs SSL Server Test を行うと、下記のような表示が現れます。

ChaCha20 に関する表示

バッチリですね。

(ちなみに、ssl_conf_command によって、下記のように TLSv1.3 の暗号スイートリストも設定が可能です。)

ssl_conf_command Ciphersuites TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384;

おわりに

nginx の設定のみで、サーバ側での ChaCha20-Poly1305 の優先度を適切に制御できるようになったことで、運用が現実的になりました。

nginx 1.20 のリリースが楽しみですね。