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

指引 / 跳至

为什么要加密

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

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

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

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

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

禁用 SSLv3 协议

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

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

http {

# 缓解 BEAST ***

   ssl_prefer_server_ciphers on;


 # 禁止不安全的 SSL 协议,使用安全协议

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';

...

或者 ssl_ciphers AESGCM:ALL:!DH:!EXPORT:!RC4:+HIGH:!MEDIUM:!LOW:!aNULL:!eNULL;

}

添加 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;

#OCSP缝合

ssl_stapling on;

ssl_stapling_verify on;

resolver 8.8.4.4 8.8.8.8 valid=300s;

resolver_timeout 10s;

# 禁止被外部网站 iframe

   add_header X-Frame-Options SAMEORIGIN;    

# 严格的 MIME 类型响应,禁止 MIME-sniffing 猜测资源类型

   add_header X-Content-Type-Options nosniff;    

# Public Key Pinning 对抗中间人***

   # 生成方法参考:https://lvtao.net/tool/public-key-pinning.html
   add_header Public-Key-Pins 'pin-sha256="oYQpJ7NWxATnj4TXRpTIKMECkarA0lPcAblBBaV23Io="; pin-sha256="JGBhwHhyQ8RjdAiTim2KGnNegkNyBfISSuCL2YiSbTM="; max-age=2592000; includeSubDomains';

防 XSS 攻擊        add_header X-Xss-Protection 1;

}

# 80 端口跳转到

 httpsserver {    

listen 80;    add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload';    

return 301 https://lvtao.net$request_uri;

}

可以根据自己的不同情况调节。

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

bUJr2iU.jpg!web

要使用 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+ 的好成绩不意外。

jYbAFr.png!web

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

本文出自http://www.tuicool.com/articles/yyMFRfI