HTTPS基础杂谈
Posted 运维军团
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTPS基础杂谈相关的知识,希望对你有一定的参考价值。
我们很多人都想推行HTTPS,现阶段最直接的作用就是防劫持,劫持现象有多严重呢,经常有类似新闻:
怎么抵制呢,大家都上HTTPS吧,而且现在是被财大气粗用户广的苹果逼着弄,还是得尽量服从,今天我们来个简单的HTTPS杂谈。
HTTPS协议比HTTP协议多了个”S”,代表安全加密,通过一些高大上的算法和证书在浏览器和服务器之间的连接进行加密处理,现阶段可以认为是无法直接破解,具体原理和实现方式大家可以飘过。来个简单的图示:
1证书费用
原先,个人站点用HTTPS的都是有钱人,因为大部分博客站点都不想花钱去买证书。
在必须要上大量HTTPS域名的时候,也是尽量上通配符的域名,因为可以省钱。
不过现在证书也有不收费的,例如let's encrypt项目,有相应的命令行可以直接颁发3个月的免费证书,而且后期可以进行续期,适合一些个人博客类,有免费的东西大家都愿意用,所以现在很多个人站点都是用的这个证书,十分便捷。如果是正式商用的话,还是建议去godaddy花钱买个正式的证书。
2配置
配置HTTPS站点比较简单,大家不用操心,同时CDN也支持HTTPS,直接交给运维来处理即可。
当然也可以参考这个哥们写的一系列文章:https://imququ.com/post/my-nginx-conf.html
3HTTPS性能
HTTPS的站点服务能力会比HTTP站点差,而且如果在高并发的情况下是会差很多很多。
没进行任何优化情况下,如果是10k的小文件,1000的并发数,不考虑keepalive,每秒耗时4毫秒左右,比如HTTP的0.3毫秒高了10多倍。简单测试对比图:
HTTP
HTTPS
如果压测一个100k的文件,用HTTP协议可以跑满1G的网卡,但是用HTTPS的话只可以跑100多兆,当然,如果文件越大,对带宽的影响就越小,因为减少了很多握手的步骤。
4证书SAN属性
多个域名的证书可以合并在一个文件里面,同时注意,这会泄漏此公司还有哪些域名和产品,像天猫那样:
注意,这里并不是说可以买一个HTTPS证书产品,然后里面签发很多域名证书,买证书的钱省不了,只是可以帮你合并成一个文件。实际测试上述的let's encrypt也是支持SAN的。
5HTTPS域名格式修改
无限子域名的泛域名证书(*.example.com)其实不支持三级域名,因此一些使用泛域名证书的HTTP域名要升级到HTTPS的话需要对域名进行修改,除非像维基那样再买无限三级子域名:
大部分人不打算花钱去买,而是尽量挤在二级子域名,比如:
s11.login.dd.example.com
需要改为如下格式
s11-login-dd.example.com
注意:一般是使用短横线替换点号(非下划线,RFC说域名不准用下划线)
6HTTP安全跳转
几乎所有站点在部署HTTPS之后,会对原先的HTTP协议进行302跳转,这个用户体验少不了,但是这里要特别注意一个事情,cookie是不认协议的,HTTP和HTTPS的协议里面只要域名匹配得上,cookie会共用,所以风险来了。如下图:
风险在于用户输入HTTP打开站点的时候,即使是立即跳转到了HTTPS,这个过程中间人攻击还是有效的,跳的时候还是带着cookie的。要解决这个问题就需要在web代码那里对cookie进行属性设置,可以加上secure属性。或者加下文所说的特殊头部。
7HSTS头部
同时,针对跳转逻辑还有个特殊的头部可以设置,叫做HSTS,全称Http Strict-Transport-Security,HTTP严格安全传输,让浏览器尽量尽量地用HTTPS来访问。
HSTS有个场景非常适合,比如在应对中间人攻击时候,可以在HTTP跳转前避免被别人劫持,而是进行307代码直接跳转。
在超时之前,没办法对用户浏览器进行类似CDN的“推送”概念,开启HSTS,即使HTTP站点可以正常访问,但是HTTPS站点异常了,那用户也没办法直接访问到正常的HTTP站点,除非让他在chrome://net-internals/#hsts这里删掉对应域名。
注意,非80端口的HTTP站点无法通过HSTS头部跳到HTTPS站点。
8相对协议
9Referer信息
一些涉及到referer的地方需要注意,HTTPS页面进行降级访问HTTP的时候,默认是不带referer信息的,这个策略叫做No Referrer When Downgrade。如果确定需要保留的话,就需要对页面进行修改了,在head头部添加<meta name="referrer" content="unsafe-URL" />,也提醒了这个是unsafe的东西。
这个降级访问我们也可以叫做降级攻击,来个小案例:
比如针对微信,微信这个URL https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxgeticon?username=weixin
如果在本地浏览器登录了网页版,再打开这个链接的话就会返回一个头像,否则是空,而如果想在某个站点加载这个图片的话,是无法显示的,因为服务端判断了referer头部,不过可以通过referrer-killer来在任意站点上显示,或者用referer的降级来实现。
比如下面有微信logo显示的是通过HTTPS的降级来实现,图裂的这个网页是用普通的img标签加载来实现。
没任何影响,纯粹是在本地是否显示而已。
另外像这个URL:
不过没办法用js进行提交来获取隐私信息,因为这里涉及到个跨域的问题,需要是*.qq.com的域才可以进行提交,原先QQ邮箱有个flash附件的跨域利用问题,不过实际测试已经修复。
用HTTPS会加强站点信息的安全,有效避免普通的中间人攻击,但并非绝对安全,开源软件也会经常暴露些漏洞,有时候是致命的漏洞,比如京东这次12G数据库泄漏的元凶Struts漏洞,bash的破壳漏洞等,openssl也有过一个致命的漏洞叫心血漏洞,反而是用了HTTPS的才受影响,另外涉及到的安全远不止以上情形。
1心血漏洞
这个漏洞特别出名,每次可以泄漏的64KB信息中可以导致服务器私钥和用户会话cookie及密码被盗,“就其潜在影响而言,是自互联网允许商用以来所发现的最严重的漏洞“。图例如下:
不过,这么重要的互联网组件当时是只有两名全职人员在维护,也是让大家狠狠地冷颤了下。
2SSL剥离攻击
说HTTPS安全,是因为一般无法直接对HTTPS抓包和解析,但是有少许特殊时候,比如在浏览器被服务端强制302跳转的时候有人偷偷地把“s“符号去掉,让用户继续在HTTP环境下进行浏览。
我们把这个动作叫做SSL剥离攻击,用的工具叫做sslstrip,阻止用户与服务器建立直接的ssl连接,简单流程如下:
3冒充证书
证书的私钥是不对外的,否则中间人可以用证书继续做一个完美的代理,比如用nginx即可实现HTTP和HTTPS的代理,并且在日志格式加上$HTTP_cookie和$request_body就可以明文抓取所有内容,nginx抓HTTPS的前提是你有个正确的证书,否则会像12306那样提示证书不对,让用户离开,不过,用户一般会像逛12306那样选择相信,然后继续浏览。
相比nginx,还有个工具是专门来做这个事情的,叫做sslsplit,劫持到用户浏览器之后,会冒充一个不被信任的证书给用户,然后做个代理反向到服务端。
在涉及到隐私的站点,如果证书有问题的话还是别访问了,12306除外。
4SSL代理
在没有服务器的正确证书的时候,虽然用nginx来做代理的时候,浏览器会显示证书错误,但是如果偶尔想用个服务器来简单代理国外站点的时候还是有办法的,我们用sniproxy来实现。
SNI是 TLS 的一个扩展,服务端可以通过 Client Hello 中的 SNI 扩展拿到用户要访问网站的 Server Name,此阶段是明文的,比如下图所示:
sniproxy利用这个逻辑进行了非解密ssl的流量来进行代理,可以当作一个流量中转的机器,不过不像nginx那样可以配置解密数据,这个是无法解密的。
5浏览器端安全
虽然说正常情况下,现阶段HTTPS是无法被抓包的,但是需要注意下,我们在浏览器打开审查元素进行调试的时候,是可以完全看到原文的,也就是说在浏览器端是完全透明的,如果浏览器被安装了恶意插件之类的,也是会直接威胁到HTTPS站点的安全。
HTTPS是HTTP的升级版,而且现在的HTTP2又在大肆宣传,毕竟HTTP1的时代已经十多年了,大家也应该早就离开了IE时代。现在苹果这样推动HTTPS的发展,后续普及度可能会飙升,这块国内做的最好的应该是阿里了,首页居然直接上了HTTP2,如果大家还舍不得尝试HTTPS,是否有点开始落伍了呢 -_-
全中国只有不到1% 的人关注了运维军
你是个有眼光的人!
(由于交流群人数已超100人,需要进群的小伙伴可以添加运维小编的微信:Alxy0819)
ywjtshare
运维军团
专注运维技术与传承,分享丰富原创干货
以上是关于HTTPS基础杂谈的主要内容,如果未能解决你的问题,请参考以下文章