2 min read

nginxをTLSv1.3に対応させた

うちでは複数のWeb鯖が動いているので、それらの上流としてnginxでリバースプロキシをしている。
そこでTLS(SSL)を付与してる感じ。

TLSv1.3をサポートするバージョン

  • nginx >= 1.13
  • openssl >= 1.1.1

Debian9まではopenssl 1.1.0だったのでできなかった。(自分でビルドすればできたはずだけどaptでの話)
だがDebian10には1.1.1が降ってきているので、リバプロ用鯖をDebian10にアップグレードした。

そしていろいろaptで最新版にアプデしたのでTLSv1.3に対応できた。
nginxのTLS設定だけ載せとけばええか。

ssl.conf

listen 443 ssl http2;
ssl_certificate         /path/to/cert.pem;
ssl_certificate_key     /path/to/cert.key;

ssl_protocols TLSv1.3 TLSv1.2;
ssl_ciphers 'TLS13:EECDH+CHACHA20:EECDH+AESGCM:ECDHE:!COMPLEMENTOFDEFAULT';
ssl_ecdh_curve X25519:sect571r1:secp521r1:secp384r1;

ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/conf.d/dhparam.pem;

ssl_ciphersssl_ecdh_curveはいろいろ試した感じこれに落ち着いた。
現状この設定がいろいろなブラウザに対応できて、なおかつSSL Server Testの評価も高くできると思う。

SSL、TLSv1.0、TLSv1.1はもうやめようね。

ちなみに上記にHSTSの設定を加えればSSL Server Testの評価がA+になる。
だが私はローカル用のhttpがあったのでやっていない。
例:

add_header Strict-Transport-Security 'max-age=31536000;' always;

dhparam.pem

生成用コマンド
10分くらいかかったかな。

$ sudo openssl dhparam -out /etc/nginx/dhparams.pem 4096

余談

最初はTLSv1.3で通信できなくてコンフィグが悪いのかとずっと戦っていた。

$ sudo nginx -V
nginx version: nginx/1.16.1
built by gcc 6.3.0
built with OpenSSL 1.1.0j  20 Nov 2018 (running with OpenSSL 1.1.1d  10 Sep 2019)

Debian10ならopenssl 1.1.1に対応してるはずなのになんかおかしいな、まあでもrunning with OpenSSL 1.1.1dって書いてあるしちゃんとそれで動いてるはずだしなぁと思っていた。

nginx 1.15.10 - TLSv1.3 doesn't get applied despite the config
こんな質問を見つけて状況がほとんど同じなので飛びついた。

システム上の既存のライブラリを置き換えるだけでは十分ではない。
nginxはOpenSSL 1.1.1に対してビルドされておらず、そのAPIを使用するようにビルドされていない。
だからTLSv1.3を有効にすることはできない。

日本語に訳すとそんなことが書いてあった。なるほどね。
一応マジでnginxは正しいものかを確認した。

$ sudo dpkg -l | grep nginx
ii  nginx    1.16.1-1~stretch    amd64    high performance web server

stretchってDebian9やんけ。
ちゃんとアップグレードされてなかったみたい。

$ sudo apt remove nginx && sudo apt install nginx && sudo service nginx restart
$ sudo dpkg -l | grep nginx
ii  nginx    1.16.1-1~buster    amd64    high performance web server

こんな感じでnginxを再インストールしたらちゃんとbusterがインストールされた。
あとはコンフィグ再読み込みのためにrestartしてやるとすんなりTLSv1.3で通信された。
やったぜ。

おわり

TLSv1.2と比べてネゴシエーションの往復を1回減らせる、ネゴシエーションの途中から暗号化されるというロマンさえあるTLSv1.3に対応することができてとても嬉しい。
上記のようにだいぶ遠回りしたがなんとかできてほんとよかった。

これで安心アンコールワットよ!(杉浦綾乃)

参考