网页的全面加密是一个很明显的未来趋向,安全性这一因素被越来越多的网站考虑,部署 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 连接上提升速度和性能。你为什么不用呢?
要使用 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+ 的好成绩不意外。
如果你的分数比较低,可以根据网页上给出的分析报告,有针对性地搜索并解决问题就可以了。
本文出自http://www.tuicool.com/articles/yyMFRfI
转载于:https://blog.51cto.com/lookingdream/1919712