默认情况下Nginx增加了SSL数字证书后,在Chrome等浏览器中会出现过时的加密套件,本文主要是为了解决这个问题。
安装Nginx与申请SSL证书,请参考其他文献。
Debian 下 Nginx 配置文件地址:/etc/nginx/site-enabled/xxx
本文中没有特别说明的情况下,所有配置内容都加在server段中。
添加SSL配置
ssl on; ssl_certificate_key /etc/ssl/cert/my_server.key; ssl_certificate /etc/ssl/cert/my_server.crt;
禁用 SSLV2 与 SSLv3
SSL v2 以及 SSL v3 并不安全,因此我们需要禁用它。 当 TLS 1.0 遭受一个降级攻击时,可以允许一个攻击者强迫使用 SSL v3 来连接,因此禁用“向前保密”来禁止使用不安全的加密方式。
添加如下信息:
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
选择密码套件
网络上推荐以下两个密码套件,后者来自 Mozilla 基金会。
推荐的密码套件:
ssl_ciphers 'AES128+EECDH:AES128+EDH';
推荐的密码套件向后兼容(IE6 / WinXP):
ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
强制使用服务器偏好
添加以下几行:
ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m;
在SSLv3或这是TLSv1握手时选择一个密码,通常是使用客户端的偏好。如果存在这两条配置,那么会强制使用服务器的偏好。
提升DHE的安全性
因为Nginx默认使用的DHE加密级别偏低,我们需要产生一个更强的DHE参数:
cd /etc/ssl/certs openssl dhparam -out dhparam.pem 4096
然后告诉nginx在DHE密钥交换的时候使用它,添加以下内容:
ssl_dhparam /etc/ssl/certs/dhparam.pem;
开启HTTP Strict Transport Security
添加以下内容:
add_header Strict-Transport-Security max-age=63072000;
该功能会导致浏览器自动对你的站点访问时,自动使用https协议,无视用户输入。如需保留http访问,请勿添加该条目。
配置示例
server { listen [::]:443 default_server; ssl on; ssl_certificate_key /etc/ssl/cert/my_server.key; ssl_certificate /etc/ssl/cert/my_server.crt; ssl_ciphers 'AES128+EECDH:AES128+EDH:!aNULL'; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_session_cache shared:SSL:10m; ssl_stapling on; ssl_stapling_verify on; ssl_prefer_server_ciphers on; ssl_dhparam /etc/ssl/certs/dhparam.pem; add_header Strict-Transport-Security max-age=63072000; add_header X-Frame-Options SAMEORIGIN; add_header X-Content-Type-Options nosniff; root /var/www/; index index.html index.htm; server_name my_server.me; }
重启Nginx
# 先检查配置文件: service nginx configtest # 重启: service nginx restart
可以使用 SSL 实验室测试(SSL Labs tes)看看你是否得到一个漂亮的A。(本站拿了A+)