已经很长时间没有写博客了,昨天刚在公司内部分享了网站https上线一周年的各种事情,有一些觉得比较好的东西,分享出来。
为什么要使用https
明文传输的http,存在被内网嗅探以及内容被劫持的危险,无论是用户还是网站管理者都不愿意看到这种情况发生。
窃取用户隐私。用户提交密码的时候,可以被嗅探或者被路由器被攻破,拦截数据,从而密码泄露。另外一些网页传输一些明文的资料,也可能被泄露。
跟踪用户行为。用户上网的时候,服务器返回的html当中,插入一段JS,用户都做了什么,浏览了什么页面,都可以被人得知。你搜索了一个东西,也许很快就有人给你打电话联系你 。
网页挂马。很简单,利用浏览器漏洞,可以自动下载木马并且运行。
广告联盟。页面插入广告,引导或者误导用户点击,用户以为是网站添加的,网站管理者躺着中枪。另外用户输入一个地址的时候,先跳转到广告联盟,然后跳转回来,相当于是广告联盟引流过去,这样网站管理者就得多付钱,用户体验也降低了。
账户安全。不安全的http,下面不敢输入密码呀。
还有一些的危险方面,不一一列举。
一种安全的解决方案-https
具有身份认证
保证数据完整性
数据加密,即使数据泄露,也无法破解。
效率,可以被容忍
现在的客户端以及服务端基本上都可以支持
可以使用现在主流的加密算法
多了中间层 SSL/TLS
尼古拉斯赵四曾说过,在东北没有什么事儿是一顿烧烤解决不了的。同样在软件行业,有类似的这么一句话。计算机的任何问题都可以通过增加一个虚拟层来解决
SSL网景公司发明,后来被IETF改名为TLS。现在常见的版本,有SSL 3.0,TLS 1.0 ,TLS 1.1, TLS 1.2四个版本。但是SSL3.0 TLS1.0有很大的安全漏洞,最好不要使用了。
版本支持情况
服务器端,随时可以更新版本支持最新的版本,也可以配置支持哪些版本。
浏览器端,一般是发布的时候,支持当时主流的版本。后期的版本,就支持不了。维基百科,有相关的浏览器的支持情况。
如果服务端最低版本支持TLS1.0,而IE6 默认支持版本SSL 3.0,怎么办?用户无法访问了呗。
SSL/TLS都做了什么事情
版本协商,客户端以及服务端都支持的最高版本。
加密算法协商,包括对称加密算法,以及非对称加密算法等。
压缩算法协商。
密钥协商,商定传输数据时需要的对称加密的key。
数据传输的加解密。
他们是如何完成协商的
https是基于TCP握手之后,然后开始SSL握手的。平常一些文章说HTTPS是4次握手,其实是7次握手。
首先是客户端发送client Hello ,然后服务端发送Server Hello,就完成了大部分的协商,只剩下密钥协商。这两个Hello不是一般的Hello
struct {
ProtocolVersion client_version; //支持的最高的版本号
Random random; //随机数,参数密钥的计算
SessionID session_id; // session id
CipherSuite cipher_suites |