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 利用 )
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-SHA; #挙動確認のためTLSv1.2に使うcipherを1つ設定しています

ツールを使って nginx 接続の cipher order を取得すると下記になります。

Cipher order
TLSv1.2: ECDHE-RSA-AES128-SHA
TLSv1.3: TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256

 TLSv1.3 の デフォルトの ciphers order は、

  1. TLS_AES_256_GCM_SHA384
  2. TLS_CHACHA20_POLY1305_SHA256
  3. 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 し、反映します。

openssl_conf = default_conf

[default_conf]
ssl_conf = ssl_sect

[ssl_sect]
system_default = system_default_sect

[system_default_sect]
Ciphersuites = TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256

 ツールを使って nginx 接続の cipher order を取得すると下記になります。

Cipher order
TLSv1.2: ECDHE-RSA-AES128-SHA
TLSv1.3: TLS_AES_128_GCM_SHA256 TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256

 TLSv1.3 の ciphers order を、

  1. TLS_AES_128_GCM_SHA256
  2. TLS_AES_256_GCM_SHA384
  3. TLS_CHACHA20_POLY1305_SHA256

の順番に変更することができました。

 

蛇足
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:ECDHE-RSA-AES128-SHA: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 で設定と記述されていることを確認しました。