什么我们需要
近来HTTPS越来越被大家重视,尤其是在http2出来之后。
流量劫持
国内的网络环境很恶劣,运营商各种流量劫持,DNS劫持,只是为了在你页面上加上几个小广告,或者更严重的,是否还记得12306抢票软件拖垮了github?对于流量劫持,很简单的方案就是用HTTPS,流量加密之后就可以解决
Http Session劫持
正常来说,你肯定在公共场合用到过WiFi,那你是否知道,假如我跟你在一个子网内,你用的是HTTP的话,我可以很轻易的嗅探到你的Cookie,或者你的用户名密码,然后登陆你的账号。。。
具体怎么做就不说了,想象以下,你正在转账,或者付款。所以目前大部分付款有关的地址都是HTTPS的,为了防止你的交易甚至账户信息被劫持。
另外,就算同网络下没有人劫持,你别忘了,还有更大的公网呢,这些公网都是由人去管理的,恩,不多说了。
同理,没有加密的SMTP,POP3之类的协议,也会非常不安全。
为什么现在没有完全普及开来
很简单:成本,使用HTTPS是有成本的,证书本身还好,但是,一旦请求量上去之后,就得堆上更多的机器。另外,国内大部分公司的安全跟隐私意识不够强,也没有法律说必须要用。只是目前CPU成本越来越低,已经低到可以用这点成本来换取流量的安全以及用户的信任了。
另外,这是未来的趋势,来看几个消息吧:
- Deprecating Powerful Features on Insecure Origins,Google Chrome表示它的API必须在HTTPS下调用;
- Deprecating Non-Secure HTTP,Mozilla公司明确表态,逐步淘汰http;
- Apple will require HTTPS connections for iOS apps by the end of 2016,这个估计知道的人多些,简单来说就是App Store上面的APP必须使用HTTPS;
很简单,以前你可以说我们传输的内容不重要,为了省几个小钱,所以不管了。但是以后不行了,几个科技巨头都宣布你必须要用HTTPS,否则你就会被强制淘汰。
另外,用了HTTPS后意味着可以用HTTP2,而HTTP2能抵消掉性能的损失,或者,进一步提高性能。
怎么用
一般来说,放在web app里面是不合适的,相当于每个web app都得部署了,而且拓展起来不方便。好一点的做法是直接部署在load balance上面,比如nginx或者haproxy。
下面简单说说Nginx上如何配置:
首先肯定不能像12306那样用self signed证书,申请个正规的证书吧,免费的也有,但是,最好还是付钱的,免费的最贵啊。
申请之后,会有example.crt,还有example.key,这两个放在对应的目录下,调整下配置即可。
listen 443 ssl;
server_name example.com;
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
ssl_certificate /etc/nginx/certs/example.crt;
ssl_certificate_key /etc/nginx/certs/example.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
怎样会更好
- 禁用SSLv3,不安全
- 使用HSTS,加入一个http头,强制浏览器在max-age之前只用https连接。