nginxでsslの設定評価をA+にするメモ
間違った中間CA証明書をバンドルして運用していた事に気づいたので、その修正とともにNginxのHTTPS設定について見直した。HTTPS運用する上で事前に実施していたのは、下記くらいか。
- RapidSSLで外部認証局の証明書を取得
- RapidSSLの場合は、中間CA証明書もサーバ証明書にバンドルしておく
- 取得した証明書はワイルドカード(マルチドメイン)対応でないため、バーチャルホストではなく証明書のドメインのサブディレクトリにコンテンツを変更する
- SSL等の古いプロトコルは禁止しTLSのみにする
SSLv1-v3の設定はかなりハイリスクのため、これらを不許可にするだけでA-からスタートできるようだ。実質変更したのは、CipherListの変更、HSTSの設定、dhparamの設定くらい。
証明書+SSL設定の確認方法
上記サイトで確認したいホスト名をいれて確認が可能。
何度か実行し、赤く表示されているWeekポイントを修正する事で、最終的にはA+と判定された。暗号強度をあげれば、CipherStrengthあたりはもう少しあがるハズだが、落とし所としてはこのあたりだろう。
赤字は修正が好ましい指摘事項、緑は推奨設定事項のようなので基本的には赤字を潰していくように設定を変更していけばよい。まともな証明書を使う限り、大きく改善とみなされるのは、SSL不許可とStrict-Transport-Securityの設定のようだが、強制的にhttpsにリダイレクトされるためコンテンツ側の対応が必要だったり、ブラウザ側での例外設定ができなかったり等の弊害もあるので注意したい。
設定内容を変更後、サイドSSL Server Testを実施したい場合は結果画面より、clear cacheを選ぶとよい。
ちなみにテストでは、CAAレコードの追加がしていないと指摘されたため対応してみたが、特に減点対処とも加点対象ともならないようである。
DNSはホスティングを利用しているので、さくらのコンパネから追加してみた。
登録する値は、証明書の発行元によって変わるので注意。rapidSSLの場合はsymantec.comを下記のように登録すればいいようだ。
0 issue "symantec.com"
テスト結果およびNginxの関連ドキュメントを参照し設定した最終的な、SSLのバーチャルホスト部の設定はこんな感じ。
/etc/conf.d/ssl.conf
Server { listen 443 ssl http2 default_server; listen [::]:443 ssl http2 default_server; server_name moooi.jp; root /www/html/; add_header Strict-Transport-Security 'max-age=31536000'; ssl_certificate /etc/nginx/cert/server.crt; ssl_certificate_key /etc/nginx/cert/server.key; ssl_dhparam /etc/nginx/dhparam.pem; ssl_session_cache shared:le_nginx_SSL:1m; ssl_session_timeout 1440m; ssl_protocols TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:!MD5; client_max_body_size 25M; }