nginx で TLS 1.3 の Cipher Suites を設定するメモ
この記事の概要
nginx 1.17.5 で確認した話を書いています。今後の進展がある可能性があります。
ssl_ciphers では TLS 1.3 の ciphers を設定できない経緯
nginx の ssl_ciphers では TLS 1.3 の ciphers を設定できません。現時点では、TLS 1.3 の ciphers を設定する方法がnginx標準機能としてはありません。
経緯としては下記を見かけました。
#1529 の ざっくりとした概要としては、
- OpenSSL 1.1.1 pre4以降でTLS 1.3-Only Cipher を設定するための新しいAPI(https://www.openssl.org/docs/manmaster/man3/SSL_CTX_set_ciphersuites.html )が追加されている。このAPIを利用して TLS 1.3-Only Cipher を設定する計画はあるかどうか。(例 : apache の 新オプションのSSLCipherSuiteV1_3)
- このあたりまだ議論の余地があるところのようで、OpenSSLとしてのアプローチが明確になるまでは、nginx としてはサポートしないようです。
- nginx を介さずに、TLS 1.3 の ciphers を設定したい場合は、OpenSSLの設定変更をして対応するというアプローチがある。
nginx + openssl で TLS 1.3 の Ciphers を設定してみる
nginx 1.17.5 ( built with OpenSSL 1.1.1 ) で、OpenSSLが動的リンクのnginxにて確認しました。
ciphers や ciphers order を確認するツールとしては、ssltest.sh が TLS 1.3 に対応していたため、こちらを利用しました。
1 . ssl_protocols に TLS 1.3 を追加する ( デフォルトの cipher 利用 )
ツールを使って nginx 接続の cipher order を取得すると下記になります。
TLSv1.3 の デフォルトの ciphers order は、
- TLS_AES_256_GCM_SHA384
- TLS_CHACHA20_POLY1305_SHA256
- TLS_AES_128_GCM_SHA256
の順番でした。(
https://github.com/openssl/openssl/blob/OpenSSL_1_1_1/include/openssl/ssl.h#L174-L182
)
2. openssl.cnf にて Ciphersuites を定義する
Ubuntu 18.04 の場合は /etc/ssl/openssl.cnf でした。
[ new_oids ] の直前に下記を追加し、nginx を restart し、反映します。
ツールを使って nginx 接続の cipher order を取得すると下記になります。
TLSv1.3 の ciphers order を、
- TLS_AES_128_GCM_SHA256
- TLS_AES_256_GCM_SHA384
- TLS_CHACHA20_POLY1305_SHA256
の順番に変更することができました。
蛇足
のように ssl_ciphers に TLS 1.3 の cipher suites を記入しても、nginx のconfig test(-t)はクリアしますが、設定として有効とはなりません。(これにより、わたしははじめこの件に気づけていませんでした。)
追記 ( 2020年7月7日 )
2020年7月7日に公開された IPAのTLS設定ガイドラインの参考資料「TLS暗号設定 暗号スイートの設定例」にて、現行のnginxバージョン(資料内では1.16.1と1.17.6)では、TLS1.3 の cipher suites が設定できない為、openssl.cnf で設定と記述されていることを確認しました。