SSL/TSL握手过程详解

本文详细解析了SSL/TLS握手过程,包括ClientHello与ServerHello消息交换、证书验证、PreMasterKey生成及交换等关键步骤,并解释了为何采用三个随机数以增强安全性。
部署运行你感兴趣的模型镜像

SSL/TLS 握手过程

这里写图片描述

  1. Client Hello

    握手第一步是客户端向服务端发送 Client Hello 消息,这个消息里包含了一个客户端生成的随机数 Random1、客户端支持的加密套件(Support Ciphers)和 SSL Version 等信息。
    这里写图片描述

  2. Server Hello
    第二步是服务端向客户端发送 Server Hello 消息,这个消息会从 Client Hello 传过来的 Support Ciphers 里确定一份加密套件,这个套件决定了后续加密和生成摘要时具体使用哪些算法,另外还会生成一份随机数 Random2。注意,至此客户端和服务端都拥有了两个随机数(Random1+ Random2),这两个随机数会在后续生成对称秘钥时用到。
    这里写图片描述

  3. Certificate
    这一步是服务端将自己的证书下发给客户端,让客户端验证自己的身份,客户端验证通过后取出证书中的公钥。
    这里写图片描述

  4. Server Key Exchange
    如果是DH算法,这里发送服务器使用的DH参数。RSA算法不需要这一步。
    这里写图片描述

  5. Certificate Request
    Certificate Request 是服务端要求客户端上报证书,这一步是可选的,对于安全性要求高的场景会用到。

  6. Server Hello Done
    Server Hello Done 通知客户端 Server Hello 过程结束。
    这里写图片描述

  7. Certificate Verify
    客户端收到服务端传来的证书后,先从 CA 验证该证书的合法性,验证通过后取出证书中的服务端公钥,再生成一个随机数 Random3,再用服务端公钥非对称加密 Random3 生成 PreMaster Key。

  8. Client Key Exchange
    上面客户端根据服务器传来的公钥生成了 PreMaster Key,Client Key Exchange 就是将这个 key 传给服务端,服务端再用自己的私钥解出这个 PreMaster Key 得到客户端生成的 Random3。至此,客户端和服务端都拥有 Random1 + Random2 + Random3,两边再根据同样的算法就可以生成一份秘钥,握手结束后的应用层数据都是使用这个秘钥进行对称加密。为什么要使用三个随机数呢?这是因为 SSL/TLS 握手过程的数据都是明文传输的,并且多个随机数种子来生成秘钥不容易被暴力破解出来。客户端将 PreMaster Key 传给服务端的过程如下图所示:
    这里写图片描述

  9. Change Cipher Spec(Client)
    这一步是客户端通知服务端后面再发送的消息都会使用前面协商出来的秘钥加密了,是一条事件消息。
    这里写图片描述

  10. Encrypted Handshake Message(Client)
    这一步对应的是 Client Finish 消息,客户端将前面的握手消息生成摘要再用协商好的秘钥加密,这是客户端发出的第一条加密消息。服务端接收后会用秘钥解密,能解出来说明前面协商出来的秘钥是一致的。
    这里写图片描述

  11. Change Cipher Spec(Server)
    这一步是服务端通知客户端后面再发送的消息都会使用加密,也是一条事件消息。

  12. Encrypted Handshake Message(Server)
    这一步对应的是 Server Finish 消息,服务端也会将握手过程的消息生成摘要再用秘钥加密,这是服务端发出的第一条加密消息。客户端接收后会用秘钥解密,能解出来说明协商的秘钥是一致的。
    这里写图片描述

  13. Application Data
    到这里,双方已安全地协商出了同一份秘钥,所有的应用层数据都会用这个秘钥加密后再通过 TCP 进行可靠传输。

CA颁发证书主要内容:
指纹算法:将证书内容进行HASH计算的算法,如sha1

指纹:证书内容HASH以后的内容(不可逆),用户识别证书是否篡改

签名算法:对指纹进行签名的算法(CA用自己的私钥对指纹签名,浏览器通过内置CA跟证书公钥进行解密,如果解密成功就确定证书是CA颁发的)。

原文地址:http://www.jianshu.com/p/7158568e4867

您可能感兴趣的与本文相关的镜像

PyTorch 2.6

PyTorch 2.6

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

SSL/TLS握手阶段主要包含以下步骤: 1. **客户端发送Client Hello**:客户端向服务器发送Client Hello消息,包含支持的协议版本、加密套件列表以及一个随机数[^3]。 2. **服务器响应Server Hello**:服务器收到Client Hello后,发送Server Hello消息,其中包含选择的协议版本、加密套件,以及自己的随机数。同时,服务器会发送Server Certificate消息,包含服务器的公钥证书。最后,服务器发送Server Hello Done消息,表示服务器的初始响应结束[^3]。 3. **客户端发送Client Key Exchange**:客户端收到服务器的消息后,生成一个预主密钥,并使用服务器公钥对其加密,通过Client Key Exchange消息发送给服务器。之后,客户端根据预主密钥和之前的两个随机数生成对称密钥,并发送用对称密钥加密的Client Finished消息,表示客户端握手完成[^3]。 4. **服务器生成对称密钥并发送Server Finished**:服务器接收到客户端加密的预主密钥后,解密得到预主密钥,然后也根据预主密钥和两个随机数生成对称密钥。服务器发送用对称密钥加密的Server Finished消息,表示服务器握手完成[^3]。 5. **开始对称加密的数据传输**:双方握手完成后,开始使用对称密钥进行加密的数据传输[^3]。 ```plaintext # 以下是一个简单的SSL/TLS握手流程示意图 +-----------------------------------------------+ | 客户端 | +-----------------------------------------------+ | | Client Hello | (支持的版本,加密套件,随机数) v +-----------------------------------------------+ | 服务器 | +-----------------------------------------------+ ^ | Server Hello | (选择的版本,加密套件,随机数) | | Server Certificate | (服务器公钥证书) | | Server Hello Done v +-----------------------------------------------+ | 客户端 | +-----------------------------------------------+ ^ | Client Key Exchange | (用服务器公钥加密的预主密钥) | | [生成对称密钥] | Client Finished | (用对称密钥加密的完成消息) v +-----------------------------------------------+ | 服务器 | +-----------------------------------------------+ ^ | [解密预主密钥并生成对称密钥] | Server Finished | (用对称密钥加密的完成消息) v +-----------------------------------------------+ | 客户端 | +-----------------------------------------------+ [对称加密的数据传输开始] ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值