wsxk / wsxk.github.io

MIT License
5 stars 0 forks source link

SSL/TLS协议 #192

Open wsxk opened 1 month ago

wsxk commented 1 month ago

https://wsxk.github.io/SSL_TLS_learn/

什么是SSL/TLS

  SSL/TLS的功能
  SSL/TLS的底层原理

TLS1.2握手过程

  ECDHE握手

      1.client hello
      2.server hello
      3.certificate
      4.server key exchange
      5.server hello done
      6.client key exchange
      7.change cipher spec
      8.Finished(Encrypted Handshake Message)
      9.change cipher spec
      10.Finished(Encrypted Handshake Message)

  RSA握手

      1. client hello
      2. server hello
      3. certificate
      4. Server Hello Done
      5. Client Key Exchange
      6. ChangeCipher Spec
      7. Finished
      8. changeCipher Spec
      9. Finished

  RSA握手和ECDHE握手的区别
  RSA握手情况下知道服务器证书私钥后可以破解流量包
  ECDHE握手情况下知道服务器证书私钥不可以破解流量包

reference

什么是SSL/TLS SSL(secure socket layer)是进行安全传输的一种新型协议,建立在应用层和传输层之间。 TLS(transport layer security)是SSL的升级版本 总的来说,SSL/TLS是一个协议不同阶段的不同称呼(其实是一个东西) 这个协议经历了SSL 1.0,SSL 2.0,SSL 3.0,TLS 1.0,TLS 1.1, TLS 1.2(目前最常用), TLS 1.3(目前最新)

SSL/TLS的功能 SSL/TLS的功能主要如下:

数据机密性: 保证传输的数据不会被窃听
数据完整性: 保证传输的数据在传输过程中不会被篡改
身份认证:保证进行传输的“目标”确实是你应该要传输的目标(即证明你妈是你妈)

总而言之,这玩意就是保护你传输数据的安全的。

SSL/TLS的底层原理 SSL/TLS 完全是建立在密码学的发展上的。 即 非对称加密算法(由此诞生的证书和签名),对称加密算法 ,摘要算法 可以去看看 《图解密码技术》。看完后,即使不知道算法的细节,也能理解SSL/TLS的运作机制

TLS1.2握手过程 ECDHE握手 先看图

1.client hello TLS连接由client开始 client hello报文主要向服务器发送了 client生成的随机数(random_c) 、 可支持的加密套件(cipher suite) 2.server hello server从client支持的加密套件中,选一套,并生成 session id(会话id) ,服务端随机数(random_s) 然后发送给客户端 使用ECDHE握手的话,会使用 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 这是什么意思呢,RSA是进行身份认证时使用的算法,AES指的是对整个会话进行加密时使用的算法,SHA256指对会话进行hash(保证数据没被篡改),ECDHE指的是加密 AES的会话密钥 的方法

3.certificate server把自己的证书链发送给client(client根据证书验证server是否可信) 4.server key exchange 这个过程中,服务器主要做了三件事

选择一条名为 name_curve的椭圆曲线,选好椭圆曲线相当于G点选好了,这些会公开给client
生成随机数作为服务端椭圆曲线的私钥,保存在本地
根据基点G和服务端椭圆曲线私钥生成服务端椭圆曲线公钥,发送给客户端

在发送包前,会使用摘要算法对这些公开信息进行哈希,并使用服务器证书的私钥进行签名(防止篡改) 5.server hello done server发送server hello done,告知client 相关信息发送完毕 6.client key exchange 在client验证完成server端证书的合法性后,会生成一个随机数作为client端的椭圆曲线私钥。并根据server发送的信息生成client端的椭圆曲线公钥。 并将自己的公钥发送给server端。 至此,双方都有对方的椭圆曲线公钥、自己的椭圆曲线私钥和公钥、椭圆曲线基点 G。于是,双方都就计算出点(x,y),其中 x 坐标值双方都是一样的,前面说 ECDHE 算法时候,说 x 是会话密钥,但实际应用中,x 还不是最终的会话密钥。 TLS 握手阶段,客户端和服务端都会生成了一个随机数传递给对方 最终的会话密钥,就是用「客户端随机数 + 服务端随机数 + x(ECDHE 算法算出的共享密钥) 」三个材料生成的。 之所以需要3个,是因为客户端或服务器「伪随机数」的可靠性不可信,为了保证真正的完全随机,把三个不可靠的随机数混合起来,那么「随机」的程度就非常高了 7.change cipher spec 告知server以后会使用加密会话(换句话说其实前6个都是明文,但是不会有安全问题),其实这个报文没什么用 8.Finished(Encrypted Handshake Message) 其实也没什么用,就是用来check 生成的公钥(这里指ECDHE公钥)是否正确 9.change cipher spec 与7一致 10.Finished(Encrypted Handshake Message) 同8

RSA握手

  1. client hello 有client端使用的TLS 版本号、支持的密码套件列表,以及生成的随机数(Client Random)
  2. server hello server端选择 密码套件列表,生成随机数(server random) 在RSA握手过程中,选择的密码套件很有可能是 Cipher Suite: TLS_RSA_WITH_AES_128_GCM_SHA256
  3. certificate 服务端为了证明自己的身份,会发送「Server Certificate」给客户端,这个消息里含有数字证书
  4. Server Hello Done 表示server信息传输完毕.
  5. Client Key Exchange 首先客户端验证证书,证书验证通过后,继续后面的操作。 客户端产生一个新的随机数 (pre-master),并使用服务端的RSA公钥加密该随机数,通过「Change Cipher Key Exchange」消息传给服务端。该随机数就是后面会话密钥的重要组成成分之一
  6. ChangeCipher Spec 告诉server开始加密会话
  7. Finished 客户端再发一个「EncryptedHandshake Message(Finished)」消息,把之前所有发送的数据做个摘要,再用会话密钥(master secret)加密一下,让服务器做个验证,验证加密通信是否可用,以及验证之前握手信息是否有被中途篡改过。会话密钥(master secret)为randomClient+randomServer+ pre-master。
  8. changeCipher Spec 同6
  9. Finished 同7

RSA握手和ECDHE握手的区别 RSA 密钥协商算法「不支持」前向保密,ECDHE 密钥协商算法「支持」前向保密; 使用了 RSA 密钥协商算法,TLS 完成四次握手后,才能进行应用数据传输,而对于 ECDHE 算法,客户端可以不用等服务端的最后一次 TLS 握手,就可以提前发出加密的 HTTP 数据,节省了一个消息的往返时间; 使用 ECDHE, 在 TLS 第 2 次握手中,会出现服务器端发出的「Server Key Exchange」消息,而 RSA 握手过程没有该消息;

RSA握手情况下知道服务器证书私钥后可以破解流量包 由前面的流程可以看到,RSA密钥交换过程中,是客服端选择一个随机数作为会话密钥,然后用服务端证书的公钥加密,加密后的密文传输过去,然后服务端用私钥解密。

表面看是实现了密钥交换,但实际上,会话密钥还是在网络中进行了传输,因此每次数据表中都可以得到。得到后如果有服务端的证书和私钥,就可以解密了。

因此也称此为不具有前向安全性,只要服务端不换证书,那么所有证书范围内的会话都可以进行解密。对于旁路监听流量,拥有全量数据包的情况下,是可以全部解密的

ECDHE握手情况下知道服务器证书私钥不可以破解流量包 由前面的流程可以看到,与RSA密钥协商算法不同的是,ECDHE在进行会话密钥协商时,第2和第3次握手中,都是服务端与客服端生成自己的临时公私钥对,在网络中交换时,仅仅只是传输了公钥,会话密钥完全在本地计算,而且双方的私钥也未暴露在网络中,所以只是抓包和知道证书与私钥,也是不能恢复出会话密钥的

reference https://wonderful.blog.csdn.net/article/details/77866773 https://blog.csdn.net/s493197604/article/details/104612970 https://www.nuomiphp.com/serverfault/zh/604782192a6fd71e7017e2b2.html https://www.cnblogs.com/20179203li/p/7875451.html 图解 ECDHE 密钥交换算法 一文读懂https中密钥交换协议的原理及流程