NginxのSSL設定(処理速度優先)
NginxのSSL設定はどれが速いのか?
結局どれが良いのか?と迷う人は多いだろう。
自分も絶対これという自信は無いですが、多分最適な設定を紹介する。
※Nginxバージョン:1.27.0
※certbotバージョン:1.21.0
※「Let’s Encrypt」の「certbot」でデフォルト設定で証明書を発行した場合の設定です
1、nginx.conf
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 5m;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
ssl_ciphers ECDHE+AESGCM:DHE+aRSA+AESGCM:ECDHE+AESCCM:DHE+aRSA+AESCCM:+AES256:ECDHE+CHACHA20:DHE+aRSA+CHACHA20:+DHE:ECDHE+AES128:ECDHE+CAMELLIA128:ECDHE+AES:ECDHE+CAMELLIA:+ECDHE+SHA:DHE+aRSA+AES128:DHE+aRSA+CAMELLIA128:DHE+aRSA+AES:DHE+aRSA+CAMELLIA:+DHE+aRSA+SHA;
ssl_conf_command Ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_128_CCM_SHA256:TLS_AES_128_CCM_8_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256;
まず「nginx.conf」に全てのドメインに適用する共通設定を書きます。
certbotバージョン1.21.0だと、
暗号方式はデフォルトで「ecdsa」の「secp256r1」です。
この場合の設定なので注意ください。
2、doudonn.com.conf
server {
listen 443 ssl;
http2 on;
server_name doudonn.com www.doudonn.com;
ssl_certificate /etc/letsencrypt/live/doudonn.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/doudonn.com/privkey.pem;
#以後省略
各ドメインの設定ファイルは、
「ssl_certificate」と「ssl_certificate_key」だけ記載します。
ドメインごとに指定ファイルが違うためです。
3、なぜこのSSL設定なのか?解説
#キャッシュでの高速化は公式マニュアルでも推奨
#このためにメモリを10MB使用するようにします
ssl_session_cache shared:SSL:10m;
#サイトの滞在時間を考えて指定する。この場合は5分
ssl_session_timeout 5m;
#クライアント側の暗号よりもサーバー側の暗号を優先する。セキュリティ対策。
ssl_prefer_server_ciphers on;
#プロコトルを最新のものだけ指定。現時点の推奨設定。
ssl_protocols TLSv1.2 TLSv1.3;
#鍵交換に使うファイルを指定(作成要)
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
#下記2項目は使用する暗号方式の指定。TLSv1.3での推奨セキュリティ型です。
ssl_ciphers ECDHE+AESGCM:DHE+aRSA+AESGCM:ECDHE+AESCCM:DHE+aRSA+AESCCM:+AES256:ECDHE+CHACHA20:DHE+aRSA+CHACHA20:+DHE:ECDHE+AES128:ECDHE+CAMELLIA128:ECDHE+AES:ECDHE+CAMELLIA:+ECDHE+SHA:DHE+aRSA+AES128:DHE+aRSA+CAMELLIA128:DHE+aRSA+AES:DHE+aRSA+CAMELLIA:+DHE+aRSA+SHA;
ssl_conf_command Ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_128_CCM_SHA256:TLS_AES_128_CCM_8_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256;
「ssl_dhparam」の作成はこちらの記事を見てください。
「Ubuntu 22.04.1 LTS&NginxのロードバランサにLet’s EncryptのSSL証明書を取得し自動更新&同期する方法」
それぞれの詳細は公式マニュアルを確認ください。
4、このSSL設定での証明書情報
chromeならデベロッパーツールで確認できます。
基本は「TLS 1.3」。
そして、処理が軽い「X25519」と「AES_128_GCM」を指定。
「Let’s Encrypt」と「certbot」で取得するならこれが最適だと思います。
セキュリティを高めたい場合は「p-384」と「AES_256_GCM」を指定します。
certbotで「secp384r1」を指定して取得し、
「ssl_ciphers」と「ssl_conf_command」は下記を指定します。
ssl_ciphers ECDHE+AESGCM:DHE+aRSA+AESGCM:ECDHE+AESCCM:DHE+aRSA+AESCCM:ECDHE+CHACHA20:DHE+aRSA+CHACHA20:+AES128:+DHE;
ssl_conf_command Ciphersuites TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:TLS_AES_128_CCM_SHA256:TLS_AES_128_CCM_8_SHA256;
※参考サイト:https://kuni92.net/2022/02/nginx-chipers.html
4、NginxのSSL設定まとめ
暗号強度はワンランク下げて処理速度優先にすることをおすすめ。
ググって解説サイトを見ると、
ほぼ「高セキュリティ型(p-384とAES_256_GCM)」でのSSL設定解説になっています。
これにすると処理速度が落ちるため、同時アクセスを求める人などにはおすすめできない。
実際、Googleなど大きなサイトは処理速度優先(AES_128_GCM)の設定です。
それでも現時点はセキュリティ的に全く問題無く、
セキュリティを高くするのは将来に備えてという感じです。
個人サイトでそこまでやる必要は無いと考えます。
Nginxを速くしたい!な人は是非当記事の設定を使ってみてください。