透视 HTTP 协议
罗剑锋(Chrono)
前奇虎 360 技术专家,Nginx/OpenResty 开源项目贡献者
63943 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 48 讲
开篇词 (1讲)
透视 HTTP 协议
15
15
1.0x
00:00/00:00
登录|注册

26 | 信任始于握手:TLS1.2连接过程解析

Client Key Exchange
Finished
Change Cipher Spec
Master Secret
Pre-Master
Client Key Exchange
Server Hello Done
Server Key Exchange
Server Certificate
Server Hello
Client Hello
设置Wireshark
设置系统变量
变更密码规范协议
握手协议
警报协议
记录协议
TCP连接
DNS解析
URI提取
课下作业
小结
双向认证
RSA握手过程
ECDHE握手过程
抓包的准备工作
TLS协议的组成
HTTPS建立连接
HTTPS/TLS握手

该思维导图由 AI 生成,仅供参考

经过前几讲的介绍,你应该已经熟悉了对称加密与非对称加密、数字签名与证书等密码学知识。
有了这些知识“打底”,现在我们就可以正式开始研究 HTTPS 和 TLS 协议了。

HTTPS 建立连接

当你在浏览器地址栏里键入“https”开头的 URI,再按下回车,会发生什么呢?
回忆一下第 8 讲的内容,你应该知道,浏览器首先要从 URI 里提取出协议名和域名。因为协议名是“https”,所以浏览器就知道了端口号是默认的 443,它再用 DNS 解析域名,得到目标的 IP 地址,然后就可以使用三次握手与网站建立 TCP 连接了。
在 HTTP 协议里,建立连接后,浏览器会立即发送请求报文。但现在是 HTTPS 协议,它需要再用另外一个“握手”过程,在 TCP 上建立安全连接,之后才是收发 HTTP 报文。
这个“握手”过程与 TCP 有些类似,是 HTTPS 和 TLS 协议里最重要、最核心的部分,懂了它,你就可以自豪地说自己“掌握了 HTTPS”。

TLS 协议的组成

在讲 TLS 握手之前,我先简单介绍一下 TLS 协议的组成。
TLS 包含几个子协议,你也可以理解为它是由几个不同职责的模块组成,比较常用的有记录协议、警报协议、握手协议、变更密码规范协议等。
记录协议(Record Protocol)规定了 TLS 收发数据的基本单位:记录(record)。它有点像是 TCP 里的 segment,所有的其他子协议都需要通过记录协议发出。但多个记录数据可以在一个 TCP 包里一次性发出,也并不需要像 TCP 那样返回 ACK。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

TLS1.2连接过程解析 HTTPS和TLS协议的握手过程是建立安全连接的关键步骤。当浏览器发起HTTPS请求时,首先进行TCP握手,然后执行TLS握手,交换随机数和密钥参数,最终生成会话密钥用于加密通信。TLS协议包括记录、警报、握手和变更密码规范协议,其中握手协议是最复杂的部分,涉及版本号、随机数、密码套件、证书和密钥参数的协商。通过Wireshark工具可以分析握手过程中的秘密信息,实现HTTPS数据的抓取和解密。 握手过程中使用ECDHE算法实现密钥交换,服务器发送“Server Key Exchange”消息,然后双方生成主密钥和会话密钥。另外,文章还介绍了RSA握手过程和双向认证的流程。总结了HTTPS/TLS握手的关键要点:TCP握手、随机数交换、密钥协商、加密通信等。读者可以通过本文了解HTTPS/TLS握手的复杂性和安全性,以及握手过程中各个步骤的作用。 文章深入解析了HTTPS/TLS握手过程,包括ECDHE和RSA两种密钥交换方式,以及双向认证的流程。通过对密码套件中算法的作用、RSA握手过程和双向认证流程的理解,读者可以加深对HTTPS/TLS握手的认识。整体而言,本文内容丰富、难度较大,但通过简洁的总结,读者可以快速了解HTTPS/TLS握手的关键内容和技术特点。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《透视 HTTP 协议》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(129)

  • 最新
  • 精选
  • 彩色的沙漠
    浏览留言区,留言区同学和我有一样的疑问“Client Params 和 Server Params 都可以被截获,为何中间人没法通过这两个信息计算 Pre-Master Secret 呢?” 我去网上找了关于ECDHE握手过程,这个可以帮助大家更好的理解ECDHE,具体过程如下: (1):客户端随机生成随机值Ra,计算Pa(x, y) = Ra * Q(x, y),Q(x, y)为全世界公认的某个椭圆曲线算法的基点。将Pa(x, y)发送至服务器。 (2):服务器随机生成随机值Rb,计算Pb(x,y) = Rb * Q(x, y)。将Pb(x, y)发送至客户端。 (3):客户端计算Sa(x, y) = Ra * Pb(x, y);服务器计算Sb(x, y) = Rb *Pa(x, y) (4):算法保证了Sa = Sb = S,提取其中的S的x向量作为密钥(预主密钥)。 @引用 --------------------- 作者:Mrpre 来源:CSDN 原文:https://blog.csdn.net/mrpre/article/details/78025940 版权声明:本文为博主原创文章,转载请附上博文链接!

    作者回复: 非常好的同学,大力表扬!

    2019-08-01
    24
    90
  • J.Smile
    之前面试阿里第二轮的时候,面试官就问我关于ssl握手的问题,其实我觉得像这种问题回答不出来也很正常,毕竟这么复杂的流程谁能记得住呢?使用现成的nginx+ssl的配置已经可以解决大多数问题了。 ------------------------------------------------- 总结下TLS的握手过程: 第一阶段:C/S两端共享Client Random、Server Random 和 Server Params信息 客户端--->服务器: 客户端的版本号、支持的密码套件,还有一个随机数(Client Random) 服务端--->客户端: 客户端的版本号、选择的客户端列表的密码套件如:TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384、随机数随机数(Server Random) 服务端--->客户端: 服务端证书(Server Certificate) 服务端--->客户端: 发送Server Key Exchange类型的请求,携带椭圆曲线的公钥(Server Params)用以实现密钥交换算法,另附私钥签名 服务端--->客户端: 发送完毕 第二阶段:证书验证 前验条件:客户端证书链逐级验证、证书公钥验证签名,服务端身份验证成功(证书合法) 客户端--->服务端 发送Client Key Exchange类型的请求,携带椭圆曲线的公钥(Client Params)用以实现秘钥交换算法 第三阶段:主密钥生成 客户端、服务端分别使用Client Params、Server Params通过ECDHE算法计算出随机值pre-master,然后用 Client Random、Server Random 和 Pre-Master三个值作为原材料,用PRF伪随机数函数(利用密码套件的摘要算法再次强化结果 值maser secert的随机性)计算出主密钥Master Secret, 主密钥并不是会话秘钥,还会再用PRF扩展出更多的密钥,比如客户端发送用的会话密钥(client_write_key)、服务器发送用的会话密钥(server_write_key) 客户端--->服务端: 客户端发一个“Change Cipher Spec”,然后再发一个“Finished”消息,把之前所有发送的数据做个摘要,再加密一下,让服务器做个验证. 服务端--->客户端: 服务器也是同样的操作,发“Change Cipher Spec”和“Finished”消息,双方都验证加密解密 OK,握手正式结束.

    作者回复: 总结的非常好。

    2020-01-19
    7
    55
  • 全麦小面包
    老师,我通过nslookup获得百度的一个ip为180.101.49.11,然后用https://180.101.49.11访问,浏览器会提示建立的连接不安全。在chrome浏览器的security页面中,连接走的还是TLS , 但该网页缺失认证。我的理解是,证书在访问网页的时候就返回了,但证书只能证明某个公钥是属于某个域名的,不能证明公钥是否归属某个IP,是不是这样呢?

    作者回复: 这是因为申请证书的时候一般都是绑定在域名上,证书证明的是域名而不是ip,所以无法验证网址的合法性。 如果申请证书时就绑定ip,那么就没问题了,但几乎没有人会这么做,因为ip地址会变,而域名通常是稳定的。

    2019-08-30
    19
  • 亚洲舞王.尼古拉斯赵四
    第二个问题:客户端使用tcp链接明文将自己的随机数、密码套件、tls版本号发送给服务端,服务端根据自己支持的密码套件从客户端的密码套件中选取一个最合适的密码套件,协商出tls版本,将协商好的密码套件、tls版本以及自己的随机数明文告诉客户端,并将自己的证书发送给客户端,并结束 客户端收到证书之后去ca一级一级验证证书的有效性,验证通过后,客户端使用随机数生成pre-master并 用服务器的公钥进行加密传给服务端,服务端使用自己的私钥进行解密,使用解密后的值与客户端随机数,自己的随机数进行计算,得出master secret;这时候,客户端使用三个值也能计算出master secret,客户端告诉服务器我之后都使用加密进行通信了,结束;服务端也告诉客户端,我也要开始使用加密通信了,over 接下来两个人使用计算出来的master secret进行消息加密,两人balabala,并使用master secret进行解密

    作者回复: good。

    2019-08-07
    17
  • 看,有只猪
    老师,你看看我这样理解对吗? ECDHE中,没有采用服务器公钥来加密数据,而是采用交换两端的椭圆曲线公钥来保证pre_master的安全性 RSA中pre_master由客户端生成,采用服务器公钥加密pre_master来保证pre_master的安全性

    作者回复: 理解的非常正确。

    2019-08-27
    3
    16
  • magicnum
    比如TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:使用ECDHE进行密钥交换(文中已经讲了,用它算出Pre_Master,成会话密钥Master Secret。密钥交换过程中应该会使用到非对称加密中的公钥加密),RSA进行身份验证(私钥加密公钥解密),使用128位GCM分组工作模式的AES进行消息和会话密钥的对称加密(加密真正的消息),使用SHA256摘要算法(如HMAC、PRM)对数据签名,保证数据完整性

    作者回复: 说的很好。

    2019-07-26
    3
    14
  • 追风筝的人
    在非对称加密算法中,公钥是公开信息,不需要保密,那用私钥加密,公钥解密的话(验证签名过程),其他知道公钥的人也可以解密,怎么确认发送者的身份?

    作者回复: 这里确实有点绕,要静下心来慢慢理解。 1.私钥只能被一个人秘密持有,别人是不会有的。 2.任何人都可以用公钥解密私钥加密的数据,那么就证明数据是被对应的私钥加密的。 3.从1/2可以推出,数据必然是私钥持有者发出的,否则公钥必然会解密失败。 4.从3推出,发送者就是私钥持有者,也就确认了发送者的身份。

    2020-05-11
    12
  • 乐潇游
    “主密钥有 48 字节,但它也不是最终用于通信的会话密钥,还会再用 PRF 扩展出更多的密钥,比如客户端发送用的会话密钥(client_write_key)、服务器发送用的会话密钥(server_write_key)等等,避免只用一个密钥带来的安全隐患。”这个没太理解,这个不一样的会话密钥,在对称加密算法中怎么解密呢?

    作者回复: 因为客户端和服务器都共享了master secret,所以两边可以一致地生成多个密钥,比如key1、key2、key3,两边完全一样,本质上都是master secret。 这样比如客户端发数据用key1加密,服务器就用key1解密;服务器发数据不用key1,而是用key2加密,客户端收到数据用key2解密。 用多个不同的密钥就是为了安全,对抗密码分析。

    2020-10-22
    4
    8
  • lesserror
    老师,以下问题,麻烦回答一下: 1.为了更好地分析 TLS 握手过程,你可以再对系统和 Wireshark 做一下设置,让浏览器导出握手过程中的秘密信息,这样 Wireshark 就可以把密文解密,还原出明文。这不是明文传输的嘛? Wireshark 就可以把密文解密这句话是不是有问题啊? 2.浏览器直接发送的TLS1.2的版本,那么为什么只发这个,不发TLS1.3的呢? 3.这里服务器是不是有两套公私钥,一个是证书的公私钥,一个是椭圆曲线的公私钥匙。服务器在证书后发送“Server Key Exchange”消息之后的签名用的是证书的私钥加密的?

    作者回复: 1.对于tls通信的双方来说,tls只是加密了通信链路,在通信的两个端点必然是要解密的,也就是明文,不然就无法操作了。 设置系统和wireshark就是告诉浏览器,把密钥导出来,然后wireshark用这个密钥来解密,但传输的数据仍然是加密的,如果没有这个密钥wireshark也是看不出明文的。 密文解密的前提是有密钥,如果没有密钥通信就是安全的。 2.看后面一讲,介绍了tls1.3,这里就不重复了。 3.是的。椭圆曲线的密钥用于ecdhe交换会话密钥,证书的私钥用来身份验证,对消息签名。 但椭圆曲线的密钥是临时生成的,每次握手都不固定,见答疑篇。

    2019-12-18
    8
  • 刘政伟
    老师,还是没有明白服务端/客户端发送public key的用途是什么,麻烦老师再重点说一下,感谢!

    作者回复: 服务器客户端不会直接发送public key,如果你指的是密钥交换的过程,它实际上是ECDHE算法锁要求的参数,交换这些参数就可以在两边分别算出pre-master,而外部的黑客是无法计算得到的。 发送证书是为了配合私钥签名验证客户端或服务器是身份,只要签名对,就说明对方是证书所标记的实体。

    2019-08-17
    8
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部