您的位置:晶晶的博客>速记>https的请求流程

https的请求流程

https全称:Hyper Text Transfer Protocol over SecureSocket Layer,即基于安全嵌套字的超文本协议。基于ssl/tls的安全http请求。SSL(Secure Sockets Layer 安全套接字协议)及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层与应用层之间对网络连接进行加密。

加解密和验签

八股文做一个了解。

1、散列摘要--哈希

本质是对目标对象提取特征码,获取的是目标对象的一段摘要信息,并尽量保证不同的对象的摘要是不同的;散列哈希并不是加密,只能单方向的将目标对象转换为一串摘要而不能反向从摘要反推出目标对象,散列摘要是不可逆的。例如:MD系列哈希函数如用到比较多md5,sha系列摘要函数如用到比较多的sha1。

2、对称加密

采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,也称为单密钥加密。对称加密严格依赖唯一的秘钥。例如:DES、3DES、AES等

3、非对称加密

非对称加密算法需要两个密钥来进行加密和解密,这两个密钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。这两个秘钥任意一个加密另外一个都可以用来解密。

一般来说:

  • 公钥加密私钥解密用来对数据进行加密传输,是一种加解密行为,因为公开的公钥加密的数据只能私钥才能解密。
  • 私钥加密公钥解密一般用来对数据进行验签,即证明这段数据是持有私钥的人所签发的不可否认,因为公钥是公开的任何人都可以拿来解密就谈不上保密性了,是一种验证数据来源的行为。

非对称加密算法有RSA、Elgamal、背包算法、Rabin、D-H、ECC等,其中使用最广泛的是RSA算法,Elgamal是另一种常用的非对称加密算法。

https请求流程

https协议的实现需要引入CA、ssl证书等机制。

1、ssl证书

ssl证书是什么如何申请和搭建不表,这里罗列申请到的ssl证书本身包含的核心信息:

  • 证书颁发机构信息,该颁发机构的根证书预装在客户端系统里或浏览器自带;
  • 证书持有人信息:组织信息、域名信息、有效期等;
  • 证书持有人的非对称加密的公钥;
  • 证书的签名算法,如:sha256-RSA
  • 证书签名:即证明这个证书是由证书颁发机构所颁发的自证签名。

证书签名和签名认证大概流程:证书颁发机构颁发证书时对签发的证书做哈希摘要,然后用证书颁发机构的私钥加密这个摘要得到证书签名并附在证书中。https建立连接时服务端下发证书后由浏览器读取内置在系统中的证书颁发机构的根证书使用相同摘要算法得到摘要,然后使用根证书的公钥解密证书摘要得到解密出的摘要,核对两个摘要一致则证明这个证书是由该证书颁发机构所颁发;

2、https建立过程

找到一张图,汇总的比较完善。

https建立过程

一个https请求建立过程大概如下:

  1. client发起建立tcp连接:三次握手;
  2. client say-hello:client发送hello包给server,报文包含时间戳和随机数、会话ID(session_id)、密文族(即client支持的加密方法名称列表)等;
  3. server say-hello:server接收到client的hello包后进行一些处理,如果客户端传过来的会话ID有效则尝试恢复上次会话(可用话可跳过交换证书过程),报文包含时间和随机数、会话ID和和从密文族中选择使用的加密方法;
  4. server将证书发送给client:client接收到证书后按证书声称的证书颁发机构用系统内置的对应证书颁发机构的根证书对server发过来的证书进行验证(证书签名验证、是否是声称的域名的证书、有效期验证等);
  5. 交换秘钥:过程比较复杂,核心是client生成服务端选定的对称加密算法可使用的秘钥,通过证书中的公钥加密后传递给server端,server端接收到后用证书私钥解密,证书中的公钥在此处使用;
  6. 后续client与server之间传输的数据都经过这个秘钥和上方server say-hello选中的密文族方法进行加密,接收后到用同样方法解密,保证数据的安全性;

交换秘钥过程因ssl/tls协议不同而有不同的交换方法实现,其中一种流程大概描述如下:

  1. 协商pre-master随机数:client发送一个public-key给server后server响应一个public-key给client<我这儿抓包发现这个过程没有先后顺序,就是可能是server先发public-key给client,client再发public-key给server>;完成这个操作后client依据两个public-key经过复杂的算法计算出pre-master随机数;
  2. 交换加密秘钥:client使用两个say-hello包中的随机数和这个pre-master随机数经过client自己的加密算法得出一个秘钥,使用server端发过来的证书中的公钥加密发给server,server接收到后用私钥解密即可得到后续用于数据加解密的秘钥;

可以看到一个https连接的安全性用到了哈希摘要(证书签名和签名认证)、非对称加密算法交换对称加密用到的秘钥、对称加密等多种密码技术。

下图是我本地连接一个https网站抓包的截图,过程一目了然:

https建立连接过程

参考资料:

① http://t.zoukankan.com/xdyixia-p-11642480.html

② https://www.cnblogs.com/mddblog/p/6948980.html

③ https://www.cnblogs.com/xdyixia/p/11610102.html

④ https://zhuanlan.zhihu.com/p/22142170

⑤ https://www.cnblogs.com/814467783sweet/p/9647197.html

转载请注明本文标题和链接:《https的请求流程
分享到:

相关推荐

哟嚯,本文评论功能关闭啦~