https简述
协议栈
https是在http应用层和tcp传输层之间加入了一个安全层(SSL、TLS) ,加入安全层的主要目的是将传输内容加解密,这样就避免了传输内容被窃听后,泄露重要信息(如用户名、密码),加密后即便被窃听,窃听者得到的也是无用的密文(因为窃听者没有解密密钥)。
https执行逻辑
我们知道了https主要就是用来加密传输数据的(防止被窃听),那么他是如何进行加密、解密的呢?如下图所示,当client发送https请求时,client不会像http那样(先建立tcp)直接将url发送至server,发送url属于正式数据的传输,而https要保证数据传输的加密。所以,在tcp建立之后,在正式http请求(发送url)之前,会有一个ssl的握手过程,该过程就是安全套接字要完成的:
首先client会发送其支持的加密算法等信息;
server收到请求后选择加密算法算法,然后随同证书一起发送给client;
client收到响应后,先进行证书认证(认证会验证证书是否过期、域名是否一致,最主要的是验证发送证书的人是不是证书的持有人,CA签发的证书都会先使用hash摘要,然后使用私钥签名,通过CA的公钥和hash就可以验证签名),生成一个随机数并保存,然后使用证书上的公钥(申请证书时,server生成的)加密该随机数后发送至server;
server收到加密后的随机数后,使用私钥(申请证书时,server生成的)将其解密并保存;
(此时双方已经持有安全通信的必要信息(对称加密算法、随机数密钥),可以进行安全通信了)
加密url等数据,进行正式的http请求;
server收到http请求后,会由安全层使用之前握手生成的随机密钥解密数据,然后上传至http应用层(此时就是普通的http信息了),server响应时,同样会经过安全层加密,然后发送给client;
client接收到请求响应后,安全层使用之前握手生成的随机密钥解密响应内容,然后传给应用层,至此一次完整的https请求就结束了。
https证书属性
https的证书遵循X.509标准,会包含许多属性,如下列属性,签名算法、哈希算法、公钥就可以验证证书有没有被篡改(即验证发送证书的人是不是证书的持有人)。类似12306这样使用自己制作的证书,如果自己可以保证证书本身的安全性,其实和CA颁发的证书在数据传输安全性方面没有差别。如果无法保证证书的安全性,就无法保证数据传输安全性了。比如私钥泄露(别人就可以使用私钥伪造证书了)、泄露出相同域名不同ip的另一份证书,从而可以进行dns劫持。
https性能
看来https的握手过程还是蛮复杂的,来看一下https的性能到底怎么样,下图是打开一个https网站时间消耗情况,Initial connection就是tcp+ssl=50ms,ssl为25ms,可见ssl与tcp的耗时相当(略高)。