• 欢迎光临flyzy小站!分享一些学习路上遇到的坑坑洼洼~

adad

HTTPS加密协议与握手过程

HTTPS(超文本传输安全协议)是一种网络安全传输协议。在计算机网络上,HTTPS经由HTTP进行通信,但是利用了SSL/TLS来加密数据包。HTTPS开发的主要目的,是提供对网络服务器的身份认证,保护交换数据的隐私与完整性,对窃听中间人攻击提供合理的防护。TLS(传输层安全协议),及其前身SSL(安全套接层)是一种安全协议,目的是为互联网通信提供安全及数据完整性的保障,本文对HTTPS加密协议(SSL/TLS握手阶段)进行详细介绍。

 

HTTPS加密协议(SSL/TLS握手阶段)

SSL/TLS协议的基本思路是公钥加密法,客户端先向服务器索要公钥,然后用公钥加密信息,服务器收到密文后,用自己的私钥解密。

这里需要解决两个问题:

  1. 如何保证公钥不被篡改?
  2. 公钥加密计算量太大,如何减少耗用时间?

对于如何保证公钥不被篡改,将公钥放在数字证书中,只要证书是可信的(证书是经过证书颁发机构CA公证颁发的,客户端拿到后可以去CA验证,看这个证书是不是合格并且属于该域名的),公钥就是可信的。

对于减少公钥加密计算耗时,对于每一次通话,客户端和服务器都生成一个“对话密钥”,用它来加密信息。由于”对话密钥“是对称加密,所以运算速度非常快,而服务器公钥只用于加密”对话密钥“本身,这样就减少了加密运算的消耗时间。

https-ssl-tls

如上图所示,整个SSL/TLS握手阶段一共有4次通信:

1.客户端发出请求(ClientHello)

首先,客户端先向服务器发出加密通信的请求,并向服务器提供以下信息:

  • 支持的协议版本,如TLS 1.0
  • 一个客户端生成的随机数,稍后用于生成对话密钥
  • 支持的加密方法,如RSA公钥加密
  • 支持的压缩方法

2.服务器回应(ServerHello)

  • 确认加密通信协议版本。如果浏览器与服务器支持的版本不一致,则服务器关闭加密通信
  • 一个服务器生成的随机数,稍后用于生成对话密钥
  • 确认加密方法
  • 服务器证书

此处,如果服务器需要确认客户端的身份,如金融机构需要客户提供USB密钥(U盾),就会向客户端请求证书。

3.客户端回应

  • 一个随机数,稍后用于生成对话密钥,并且只用服务器的公钥加密,防止被窃听
  • 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送
  • 客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供服务器校验

如果前一步要求了客户端证书,则会发送证书及相关信息。

4.服务器回应

  • 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送
  • 服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供客户端校验

至此,整个握手阶段全部结束。接下来,客户端与服务器进入HTTPS加密通信,就完全是使用普通的HTTP协议,只不过用”会话密钥“加密内容。

 

总结

SSL/TLS握手阶段的所有通信都是明文传输的(除了随机数3):

  1. 客户端->服务器:随机数1,支持的协议,支持的加密方法
  2. 服务器->客户端:随机数2,确认协议和加密方法,证书
  3. 客户端->服务器:随机数3(加密),编码通知
  4. 服务器->客户端:编码通知
  5. 以后的所有通话都通过3个随机数生成的一个session key来进行加解密(由于随机数3中间人得不到,所以破解不了)
点赞