nginx と openssl-1.1.1 で TLS 1.3 の暗号スイートを "ムリヤリ" 設定する

2020/02/04 追記

こんなことしなくても openssl.cnf でデフォルト設定できるんですね。知らなかった…。

経緯

openssl 1.1.1 で TLS 1.3 がサポートされましたね。

nginx でも使えますが、実はまだ完全ではありません。
ssl_ciphers を設定しても、TLS 1.3 の暗号スイートは、指定した順序にはならず、デフォルトの下記の順になってしまいます。

TLS_AES_256_GCM_SHA384
TLS_CHACHA20_POLY1305_SHA256
TLS_AES_128_GCM_SHA256

これは openssl で、TLS 1.3 の暗号スイートの設定インタフェースが、TLS 1.2 以前のものとは別になっているからです。

コマンドラインでも別になっていますね。

$ openssl ciphers -help
Usage: ciphers [options]
Valid options are:
 -help              Display this summary
 -v                 Verbose listing of the SSL/TLS ciphers
 -V                 Even more verbose
 -s                 Only supported ciphers
 -tls1              TLS1 mode
 -tls1_1            TLS1.1 mode
 -tls1_2            TLS1.2 mode
 -tls1_3            TLS1.3 mode
 -stdname           Show standard cipher names
 -psk               include ciphersuites requiring PSK
 -srp               include ciphersuites requiring SRP
 -convert val       Convert standard name into OpenSSL name
 -ciphersuites val  Configure the TLSv1.3 ciphersuites to use   <== コレ

TLS 1.3 の暗号スイートは安全なものばかりなので良いんですが、AES256 が選択されてしまうのはちょっとオーバースペックです。

というわけで、対応されるまでの間は、ムリヤリ頑張って見る事にしました。

  • バージョンメモ
    • nginx 1.15.7
    • openssl 1.1.1a

openssl にパッチを当てる

ssl_ciphers で設定できないので、ムリヤリ感が強いですが openssl にパッチを当て、デフォルトの暗号スイートを変更してしまいます。

あとは、通常と同じようにビルドします。

$ ./configure \
...snip...
--with-openssl=/path/to/openssl-1.1.1a \
--with-openssl-opt='-fPIC'

$ make -j$(nproc)
$ sudo make install

結果

tls13_ciphers_01

SSL Server Test で見ても、ちゃんと望む順序になっています!

tls13_ciphers_02

うーん、美しい…!