はじめに
以前の投稿から4年が過ぎ、当時は良好だった項目がいくつか Weak 判定されるようになったため、2019.10.10現在で良好な状態になるよう調整しました。
時間がない人のために
調整が完了した nginx の設定内容です。この設定は対応するクライアント(ブラウザ)の互換性よりも、安全性を優先しています。そのため、Android 6.0 以前の標準ブラウザーや、iOS8 以前の Safari、IE10 以前のブラウザー、Java7 以前の Java プログラムなどからはアクセスできなくなる可能性があります。
(前略)
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE+AESGCM DHE+AESGCM !AES128 !aNULL !eNULL !SSLv2 !SSLv3';
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";
(後略)
設定の調整方法
現時点 (2019.10.10) での判定が良好となるような nginx での設定を調査してみました。
調整前の安全性確認
前回の投稿のままでも判定は A+ でした。しかし、AES-CBC を含むサイファーが Weak 判定となっていました。
- Certificate: 100
- Protocol Support: 100
- Key Exchange: 90
- Cipher Strength: 90
(前略)
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDH !aNULL !eNULL !SSLv2 !SSLv3';
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";
(後略)
Weak 判定されたサイファーの除去
AES-CBC を含まないよう、ホワイトリストに AESGCM を指定しました。AES-CBC はなくなり、AES-GCM のみとなりました。
- Certificate: 100
- Protocol Support: 100
- Key Exchange: 90
- Cipher Strength: 90
(前略)
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDH+AESGCM !aNULL !eNULL !SSLv2 !SSLv3';
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";
(後略)
DHE の追加
DHE を指定しても問題ありませんでしたので、追加することにしました。また、ECDH+AESGCM を指定しても ECDH は選択されず、実質 ECDHE のみとなりますので、これを指定するようにしました。
- Certificate: 100
- Protocol Support: 100
- Key Exchange: 90
- Cipher Strength: 90
(前略)
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE+AESGCM DHE+AESGCM !aNULL !eNULL !SSLv2 !SSLv3';
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";
(後略)
AES128 の除去
AES128 を除去すると、「Cipher Strength」が100に上昇します。ただし、これを除去したとき、Android 5.0 及び 6.0 が非対応となりました。なぜか 4.4.2 は対応しています…。
- Certificate: 100
- Protocol Support: 100
- Key Exchange: 90
- Cipher Strength: 100
(前略)
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE+AESGCM DHE+AESGCM !AES128 !aNULL !eNULL !SSLv2 !SSLv3';
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";
(後略)