Nginx SSL 性能优化
禁用 SSLv3 协议
Google 的一个员工发现了 SSLv3 协议中一个名叫 Poodle 的漏洞,被证实为可以窃取加密的部分信息。这是一个协议层的漏洞,因此无法打补丁。
# nginx.conf
http {
...
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
...
}
添加 HSTS 响应头 Header
HSTS 的 Header 告诉浏览器在指定的时间内,必须使用严格的 HTTPS 访问网站,即使是用户手动输入的 http:// 地址,也会被强制定向。
你也可以配置用 301 重定向 http 流量到 https,但是这个非加密的跳转过程随时可能被劫持。因此,HSTS 则告诉了浏览器在本地直接重定向 https。
在所需网站的 server { } 块儿里,添加这个头:
server {
...
add_header Strict-Transport-Security "max-age=31536000;includeSubDomains";
...
}
如果你不需要所有的字域名也强启 HSTS,可以去掉 ;includeSubDomains 。
如果你想将自己的域名加入 HSTS Preload 名单直接内置于众多浏览器中,实现从第一次到最后一次都是 https 加密连接,可以到这里申请。
更多优化配置
为了缩短建立 SSL 连接的过程时间,可以在 server { } 块儿里添加如下配置:
server {
...
ssl_session_timeout 12m;
ssl_session_cache shared:SSL:16m;
ssl_buffer_size 8k;
ssl_session_tickets on;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.4.4 8.8.8.8 valid=300s;
resolver_timeout 10s;
...
}
可以根据自己的不同情况调节。
创建新的 DHE 参数
一般地,Nginx 会使用来自 Openssl 默认的 DHE 参数 (Ephemeral Diffie-Hellman),其加密性能弱。我们可以在终端命令生成一个新的来代替它。
sudo openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048
最后,在 server { } 块儿里添加
server {
...
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
....
}
使用 HTTP/2 提升速度
或许你知道 SPDY,一个由 Google 主导的加密的协议。它可以被应用在 https 加密连接上,提供更好的性能和速度。现在,SPDY 已经正式“蜕变”为 HTTP/2,它在诸多新颖浏览器下都支持,是下一代 HTTP 标准,能在 https 连接上提升速度和性能。你为什么不用呢?
要使用 HTTP/2 模块,你必须在编译 1.9 以上版本的 Nginx 时添加以下参数:
–with-http_v2_module –with-http_ssl_module
之后,你便可以直接启用 HTTP/2:
server {
listen 443 ssl http2 fastopen=3 reuseport;
# listen [::]:443 ssl http2 fastopen=3 reuseport;
...
}
如果你的网站支持 IPv6,可以去掉注释符号。
以 Chrome 为例,要检查是否生效,可以打开网站的同时,前往地址 chrome://net-internals/#http2 ,查看自己的域名是否出现在列表里。
在线评估 HTTPS 网站的安全分数
https://www.ssllabs.com/ssltest/
打印握手时间
curl -w "TCP handshake: %{time_connect}, SSL handshake: %{time_appconnect}\n" -so /dev/null https://ifunbox.top