HTTPS是非常基础和有效的安全方式,可以较好的防御中间人攻击。
网上关于HTTPS的详细介绍已经非常多了,这里只备忘一些有趣的细节,快速解惑之用。
原理
HTTP在传输过程中是不加密的,因此传输过程中非常容易受到嗅探和劫持。
HTTPS在客户端(通常是浏览器)和服务端增加了加解密环节,从而保证传输过程数据是加密的。
安全备忘
1、HTTPS支持单向认证和双向认证。
单向认证是主要方式,即客户端验证服务端证书有效性。
双向认证主要应用于企业级应用,这种情况下,服务端也会验证客户端证书,因此意味着双方是互相提前知晓的,因此也只有在企业级场景下才可以达成。
2、HTTPS单向认证传输过程依然可以嗅探和劫持。
单向认证情况下,传输过程依然可以实现嗅探和劫持。
首先服务端并不验证客户端有效性,而客户端只验证服务端证书的有效性,因此只要中间传输过程通过代理方式成功欺骗客户端即可。
有两种情况:
1)中间人使用虚假证书。此时一般客户端浏览器虽然验证发现证书存在问题,只会提示不安全,用户依然可以手动同意访问。很多普通用户安全知识缺乏,常常会忽略浏览器的不安全提示。
2)浏览器是通过验证证书根签名以及域名、IP等附属信息一致性来验证浏览器证书。因此有些中间攻击会去正规根证书中心签名,从而合法有效的证书。这时候浏览器自然不会发现异常,用户也就无从知晓。正是因为这个问题,有些根证书中心因为滥发签名的问题,被Chrome、Firefox等浏览器不再信任。
3、HTTPS单向认证不保证服务端安全性
服务端不验证客户端的有效性,因此服务端的安全性依然需要自行防护。
有没有HTTPS,服务端都需要防CSRF、防注入、防DDOS……
4、最好使用有效的根证书机构签发的证书。
使用自签名证书当然是可以的,缺点是需要客户端导入根证书信息,从而认可服务端合法性。导入证书的事情在2C场景下基本无法达成。
由于Chrome、Firefox、IE等常见里浏览器出厂时,已经自带大量公认的根证书机构证书信息。 因此还是购买有效的根证书机构签发的证书吧。不贵。
实现备忘
1、HTTPS默认是443端口
HTTPS是一个应用层协议,和HTTP同一等级,因此它有默认端口443。
所以,不要想当然以为https会访问80端口。
2、https访问速度慢于http
由于存在事前协商、加密等工作,因此https的访问速度是要慢于http。这也是安全性带来的性能消耗。
当然,在这个时代,这点速度消耗基本可以忽略。
3、http 可以通过反向代理的方式快速升级到https。
目前apache、nginx都支持反向代理的方式将http网站升级到https。
原理很简单,apache或者nginx完成配置后,他们作为代理和客户端完成加密通信,把解密后的内容和原始http通信。
这种方式最大的好处是,原本的http网站不需要任何修改!
4、跨域情况下,https不能支持access-control-allow-origin:*
http情况下,cors可以配置为access-control-allow-origin:*,一通百通。
https情况下,不能使用通配符,需要指定具体的信息。当然,可以在反向代理中直接替换为请求头的Origin。
5、fiefox对双向认证支持不好。
实测中发现,chrome可以比较好的支持双向认证,firefox则存在一定兼容性问题。
尾声
HTTPS经过多年推广,终于已经比较成熟。证书机构、浏览器、web服务器都有相对比较完善的支持,成本也不高。
地址栏的小锁对用户来说,是巨大的安全感。建议网站可以考虑升级一下,大大提升用户信任。