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 加密连接,可以到[这里](https://hstspreload.org/)申请。

更多优化配置

为了缩短建立 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

发表评论

电子邮件地址不会被公开。 必填项已用*标注