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_ciphers
やssl_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に対応することができてとても嬉しい。
上記のようにだいぶ遠回りしたがなんとかできてほんとよかった。
これで安心アンコールワットよ!(杉浦綾乃)
TLSv1.3対応できたので私は満足です pic.twitter.com/XzQ6Vf2KwG
— yui (@sugtao4423) November 29, 2019