http的下层是tcp层,而https在tcp层和http层之间多插入了一层。
插进去的层叫SSL/TLS,这是两个名字。
SSL是很久前网景公司发明的,发展到v3版本后,被证明是很好的安全通讯协议,所以,IETF在1999年把它改名为TLS并正式标准化。
https的安全性就靠这个TLS层完成。
至于http的数据格式并没有变,下层也还是由tcp负责传输。
TLS 安全传输的过程
安全传输的传输过程:
1,浏览器/客户端向服务器发起https请求;
2,服务器把证书(包含公钥)返回给浏览器;
3,浏览器产生用来做对称加密的随机的对称密钥,然后用服务器发过来的公钥加密,得到加密后的对称密钥,再把加密后的对称密钥发给服务器;
4,服务器用私钥对加密后的对称密钥进行解密得到对称密钥;
5,服务器把要传给浏览器的数据用对称密钥加密后得到加密后的数据,再把加密后的数据传给浏览器;
6,浏览器用对称密钥就可以解密加密后的数据得到数据;
7,之后浏览器和服务器就通过对称密钥先加密,再传给对方,对方再解密的方式进行数据通讯。
一些事实
1,上面过程中,只有第3步和第4步用到非对称加密,目的是安全地传输对称密钥;
2,服务器得到对称密钥后,后续双方数据传输都只依赖对称加密;
3,第3步浏览器确实可以给服务器传浏览器的公钥,之后双方可以通过对方的公钥加密数据后传给对方,对方再通过对应的私钥解密得到数据。
4,没有使用非对称加密传输数据最重要的原因是非对称加密加解密数据使用比较复杂的数学运算,速度很慢,这个慢是相对于对称加密来说的。对称加密加解密只要做逆操作,速度快很多,这个速度是非对称加密的几百倍。
问题
1.证书哪里来?
证书是受大家信任的权威机构颁发的,颁发证书的机构会对网站进行审核。
2.浏览器如何验证证书合法?
浏览器或操作系统保存了能颁发证书的权威机构的根证书,根证书有足够的信息可以让你把一个证书的签名发给相应的权威机构去认证,能验证这个证书是否有效。
3.上网的时候浏览器识别到一个网站不安全,但用户还是可以选择访问。
证书的机制能判断对方服务器是否可信,但对于其它服务器,就算不安全,你也可以继续访问,这时候就是个人选择问题,你如果觉得对方是可信的,就算没有有效证书,你还是可以坚持访问。某些网站会提供它自己的根证书,电脑只要安装了这个根证书,该网站发过来的证书就会被浏览器认为是可信的。
4.安全传输过程的第2步,服务器给浏览器发送证书(包含公钥)的时候,被别人拦截了或者说服务器发过来的公钥是公开的,别人也可以拿到,然后假装是服务器怎么办?
推理一下,证书(包含公钥)被拦截了,然后浏览器用公钥把对称密钥加密后,把加密后的对称密钥发给服务器,然后这个加密后的对称密钥也被拦截了。关键是,拦截了也解密不了,因为需要私钥才能解密,私钥只有服务器才有,如果拦截者换成自己的公钥,也没用,因为浏览器验证证书这一步就会判断出发过来的证书不被信任。
5.虽然别人拦截了加密后的数据也解不开,但别人可以改一下数据后再继续发给目标,目标能知道吗?
其实,数据传给对方之前不只加密而已,还会用摘要算法获取数据的摘要,把摘要也一并传过去。摘要算法比如SHA-2或MD5算法,能把任意大小数据映射成一串字符串,相当于一种加密手段或压缩手段,并且是不可逆的。两份数据,就算只有其中一个字符,或其中一个符号不同,通过摘要算法获取的两个摘要也完全不同。所以,数据传给对方,附上摘要,对方拿到数据后,用同样的摘要算法计算数据得到另一个摘要,再跟传过来的摘要对比,如果不一致,说明数据或摘要被修改过,那这个数据就被认为是不完整的。