HTTPS: 基于HTTP+SSL/TLS的安全通信协议

何为HTTPS

HTTP(HyperText Transfer Protocol )是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。

HTTPS(HyperText Transfer Protocol over Secure Socket Layer),从其名字也可以看出,是在安全套接层之上的HTTP协议。其中的S可以理解为SSL/TLS协议,其中TLS又是SSL的改进版本。HTTPS的安全数据传输就依赖于SSL/TLS协议。

为什么要有HTTPS

先来放一张图:

通过浏览器访问这个网站,同时用wireshark抓包,

上图是我访问http://highscalability.com/all-time-favorites/这个http协议类型的网站时,通过wireshark抓到的包:

前三个报文很明显可以看出来是TCP连接三次握手的协商报文了,第四个报文则是浏览器发起的GET请求,很明显可以看出浏览器请求的是xxx.jpg这个资源,说明这些数据是明文传输的,相当于在公网上面裸奔。

试想也没人愿意在访问银行官网时被人看到自己银行卡上可怜的数字吧,为了保护这些隐私类的数据,保证数据的安全性、完整性、确认数据源的身份并使数据源不可抵赖,于是便有了HTTPS。

安全隧道的协商

画了个图,方便理接HTTPS如何协商出安全的连接:

        HTTPS: 基于HTTP+SSL/TLS的安全通信协议_第1张图片

下面的原理涉及到密码学原理,关于公钥密码及对称密码的详细内容可以参考《密码学原理》这本书。

  1. client向server发送请求,发送的信息包含rand1和支持的加密算法
  2. server接收到信息之后给予client响应握手信息,包括server的数字证书、rand2和选定的加密算法
  3. client解析校验证书通过后,生成一个新的随机值(预主密钥)
    1. 首先client读取证书中的证书所有者、有效期等信息进行一一校验
    2. 查找操作系统中内置的受信任的证书发布机构CA,与server发来的证书中的颁发者CA比对,用于校验证书是否为受信任的机构颁发
    3. 从匹配的CA证书中提取出颁发者CA的公钥,然后对server发来的证书里面的签名进行解密
    4. 使用相同的hash算法计算出server发来的证书的hash值,将这个计算的hash值与证书中签名做对比
    5. 1~4任一步校验失败,浏览器将提示网站不安全,是否继续访问选择权移交给用户
  4. 校验通过或用户选择信任服务后,client通过rand1、rand2和预主秘钥组装成会话秘钥,然后用证书中的公钥加密会话秘钥
  5. client传送加密后的会话密钥,server用证书中的私钥解密得到会话密钥
  6. 接下来的通信数据全部通过会话密钥进行对称加密,已经是安全的通信隧道了

偷一张图(来源:https://blog.csdn.net/xiaoming100001/article/details/81109617),这张图对上述第三步中证书校验的过程是一个更加形象的展示:

    HTTPS: 基于HTTP+SSL/TLS的安全通信协议_第2张图片

上述协商过程中:

  • client通过校验服务端的证书,确保公钥来源的可靠性,确认服务器身份的合法性
  • 通过证书中的公私钥+非对称加密算法对会话密钥进行加解密,保障的会话密钥的安全传输
  • 通过会话密钥+对称加密算法加密数据,保障数据传输的安全性,同时加解密性能也不会过低

附一个HTTPS的报文

这次访问的是https://www.baidu.com,你还能看出来消息内容吗?

HTTPS: 基于HTTP+SSL/TLS的安全通信协议_第3张图片

 

你可能感兴趣的:(教程)