Let's EncryptでSSLのセキュリティをA+にするまで

Let's EncryptでSSLのセキュリティをA+にするまで

author potpro(ぼとぷろ)
2016/12/04

Let's EncryptでSSLのセキュリティをA+にするまで

potproject.net Advent Calendar 2016 5日目の記事です。

nginx advent calenderになりつつある。この頃。 10日目くらいからアプリやガジェット系のネタを入れていく次第です。


先日の記事で、nginxでLet's Encryptを使ってSSLの設定行いました。
しかし、指摘したようにこれだとセキュリティがイマイチなので、
再度設定し直してセキュリティをさらに向上させようと思います。

まず、現在のセキュリティがどのレベルかを見るため、
Qualys SSL Labs の SSL脆弱性診断を使って、テストしてみます。

bef こういう結果になりました。特に鍵交換が弱いですね。
この部分に関してはDH鍵交換のデフォルトが1024ビットのため、既に弱くなっているからだとか。
まあ1024ビットでも高い専用機じゃないと解読できないレベルらしいので、
こんなしょぼい個人サイトだったらまあ本来はまず問題はないんですが・・・ 2048ビットのDH鍵交換をopensslで作成し、使用します。

DH交換用の鍵作成

openssl dhparam -out /etc/nginx/dhparam.pem 2048

セキュリティを高める鍵だけあって、サーバーによっては生成にかなり時間がかかります。こっちだと2分くらい。
自分も生成中にこの記事を書いてました。

他にも、前に紹介したMozilla SSL Configuration Generatorを参考に、いろいろと設定します。

後、せっかくなのでSSL設定を共通化できるようにSSLだけ設定をまとめることにします。
nginxの場合、 ** include /etc/nginx/ssl.conf; ** という風に書けばそのままインクルードして使えます。

** /etc/nginx/ssl.conf; **

# 共通鍵と秘密鍵
ssl_certificate /etc/letsencrypt/live/[ドメイン名]/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/[ドメイン名]/privkey.pem;

# セッションの設定
ssl_session_cache shared:SSL:50m;
ssl_session_timeout  1d;
ssl_session_tickets off;

# 2048ビットのDH鍵交換を使う
ssl_dhparam /etc/nginx/dhparam.pem;

# SSLv3を禁止し、TLSを使う
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# SSL暗号化スイートの使用設定
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
ssl_prefer_server_ciphers on;

# HSTSの有効化
add_header Strict-Transport-Security max-age=15768000;

# OCSP認証とステープリング(キャッシュみたいなもの)を有効にする
# fetch OCSP records from URL in ssl_certificate and cache them
ssl_stapling on;
ssl_stapling_verify on;

## OCSPレスポンスを行うRoot CA 証明書(fullchainでOK)
ssl_trusted_certificate /etc/letsencrypt/live/blog.potproject.net/fullchain.pem;

これをインクルードして設定。nginxの再起動も忘れずに。

af

これでA+になりました。やったぜ。

・・・でもこれが原因でレスポンスなんかがめちゃくちゃ遅くなるんだったら戻しますけどね。
セキュリティより可用性の方が大事ですわな。