针对 HTTPS 加密优化 Nginx 的参数配置

nginx-ssl网页的全面加密是一个很明显的未来趋向,安全性这一因素被越来越多的网站考虑,部署 https 加密对于大多数网站来说都非常必要,尤其是当搜索巨头 Google 宣布会稍微提高 https 网站的优先级之后。这家公司本身就非常注重安全性和保密性,因此推出这样的策略也不难理解,也能极大地推动加密称为网站建设的标准配置。

为什么要加密

互联网是越来越开放的,人们也是越来越注重保密性的。在互联网的保密观念不强的过去,https 并不是网站的标配。但是在当下,我们需要传输越来越多的个人信息,对于网站的保密性要求也就更高。看到网站地址挂上了绿锁,总是不必担心自己阅读的内容被其他人看到。

其次,在国内,运营商劫持是一件非常令人烦恼的事情。运营商为了追逐利益,会强行注入广告代码,甚至是调取搜索关键词,强势推销广告,隐私暴露无遗。这不仅是对访客的伤害,对自己的网站体验也是一种伤害。加密的 https 则会最大的避免这一个风险。

部署 SSL 证书并启用 HTTPS 连接非常简单,在此不再赘述。

下面讲解以 Linux + Nginx 为例子,详解如何优化配置 Nginx 的参数,提升安全指数和速度。

所有的配置一经修改,都需要重启或重载 Nginx 服务来应用。

禁用 SSLv3 协议

Google 的一个员工发现了 SSLv3 协议中一个名叫 Poodle 的漏洞,被证实为可以窃取加密的部分信息。这是一个协议层的漏洞,因此无法打补丁。

/etc/nginx/nginx.conf 里,在 http{ } 块儿里禁用 SSLv3:

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 连接上提升速度和性能。你为什么不用呢?

http2

要使用 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 安全性。如果你优化出色,得到 A+ 的好成绩不意外。

blog-netsh-org-ssl-aplus

如果你的分数比较低,可以根据网页上给出的分析报告,有针对性地搜索并解决问题就可以了。

随机推荐