HTTPS

TLS 1.2

TLS包含几个子协议,你也可以理解为它是由几个不同职责的模块组成,比较常用的有记录协议、警报协议、握手协议、变更密码规范协议等。

  1. 记录协议(RecordProtocol)规定了TLS收发数据的基本单位:记录(record)。它有点像是TCP里的segment,所有的其他子协议都需要通过记录协议发出。但多个记录数据可以在一个TCP包里一次性发出,也并不需要像TCP那样返回ACK。
  2. 警报协议(AlertProtocol)的职责是向对方发出警报信息,有点像是HTTP协议里的状态码。比如,protocol_version就是不支持旧版本,bad_certificate就是证书有问题,收到警报后另一方可以选择继续,也可以立即终止连接。
  3. 握手协议(HandshakeProtocol)是TLS里最复杂的子协议,要比TCP的SYN/ACK复杂的多,浏览器和服务器会在握手过程中协商TLS版本号、随机数、密码套件等信息,然后交换证书和密钥参数,最终双方协商得到会话密钥,用于后续的混合加密系统。
  4. 更密码规范协议(ChangeCipherSpecProtocol),它非常简单,就是一个“通知”,告诉对方,后续的数据都将使用加密保护。那么反过来,在它之前,数据都是明文的。

下图简要地描述了TLS的握手过程,其中每一个“框”都是一个记录,多个记录组合成一个TCP包发送。所以,最多经过两次消息往返(2*RTT)就可以完成握手,然后就可以在安全的通信环境里发送HTTP报文,实现HTTPS协议。

TLS握手的前几个消息都是明文的,但只要出现了“ChangeCipherSpec”,后面的数据就都是密文

TLS握手过程

1. HTTPS 协议会先与服务器执行TCP握手,然后执行TLS握手,才能建立安全连接;

2.握手的目标是安全地交换对称密钥,需要三个随机数,第三个随机数"Pre-Master"必须加密传输,绝对不能黑客(中间人)破解:

3. "Hello"消息交换随机数,"Key Exchange"消息交换"Pre-Master" ;

4. "Change Cipher Spec"之前传输的都是明文,之后都是对称密钥加密的密文。

ECDHE握手过程

  1. 在TCP建立连接之后,浏览器会首先发一个“ClientHello”消息,也就是跟服务器“打招呼”。里面有客户端的版本号、支持的密码套件,还有一个随机数(ClientRandom),用于后续生成会话密钥。
  2. 服务器收到“ClientHello”后,会返回一个“ServerHello”消息。把版本号对一下,也给出一个随机数(ServerRandom),然后从客户端的列表里选一个作为本次通信使用的密码套件,在这里它选择了“TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384”
  3. 服务器为了证明自己的身份,就把证书也发给了客户端(ServerCertificate)
  4. 接下来是一个关键的操作,因为服务器选择了ECDHE算法,所以它会在证书后发送“ServerKeyExchange”消息,里面是椭圆曲线的公钥(ServerParams),用来实现密钥交换算法,再加上自己的私钥签名认证。
  5. 这相当于说:“刚才我选的密码套件有点复杂,所以再给你个算法的参数,和刚才的随机数一样有用,别丢了。为了防止别人冒充,我又盖了个章。”之后是“ServerHelloDone”消息,服务器说:“我的信息就是这些,打招呼完毕。”这样第一个消息往返就结束了(两个TCP包),结果是客户端和服务器通过明文共享了三个信息:ClientRandom、ServerRandom和ServerParams。
  6. 然后,客户端按照密码套件的要求,也生成一个椭圆曲线的公钥(ClientParams),用“ClientKeyExchange”消息发给服务器。
  7. 现在客户端和服务器手里都拿到了密钥交换算法的两个参数(ClientParams、ServerParams),就用ECDHE算法一阵算,算出了一个新的东西,叫“Pre-Master”,其实也是一个随机数。
  8. 现在客户端和服务器手里有了三个随机数:ClientRandom、ServerRandom和Pre-Master。用这三个作为原始材料,就可以生成用于加密会话的主密钥,叫“MasterSecret”。而黑客因为拿不到“Pre-Master”,所以也就得不到主密钥。
  9. 主密钥有48字节,但它也不是最终用于通信的会话密钥,还会再用PRF扩展出更多的密钥,比如客户端发送用的会话密钥(client_write_key)、服务器发送用的会话密钥(server_write_key)等等,避免只用一个密钥带来的安全隐患。有了主密钥和派生的会话密钥,握手就快结束了。客户端发一个“ChangeCipherSpec”,然后再发一个“Finished”消息,把之前所有发送的数据做个摘要,再加密一下,让服务器做个验证。
  10. 服务器也是同样的操作,发“ChangeCipherSpec”和“Finished”消息,双方都验证加密解密OK,握手正式结束,后面就收发被加密的HTTP请求和响应了。

TLS 1.3  

握手分析

可自行抓取NginxGitHub,观察TLS 1.3协议

TLS 1.3小结

  1. 为了兼容 1.1、1.2 等“老”协议,TLS1.3 会“伪装”成 TLS1.2,新特性在“扩展”里实现;
  2. 1.1、1.2 在实践中发现了很多安全隐患,所以 TLS1.3 大幅度删减了加密算法,只保留了 ECDHE、AES、ChaCha20、SHA-2 等极少数算法,强化了安全;
  3. TLS1.3 也简化了握手过程,完全握手只需要一个消息往返,提升了性能。

http与https比较

HTTP vs HTTPS — Test them both yourself

免费的证书申请

Let's Encrypt

实验5:解密HTTPS数据

如果网站服务器使用的是HTTPS协议的话,则使用Wireshark捕获到的包是加密的包。如果想要分析传输的内容,则需要进行解密。其中,解密后的内容为HTTP和HTTP2协议。如果没有解密,则所有的数据包都为TLS协议。Wireshark中支持通过导入服务器证书日记文件两种方式来解密HTTPS数据。

1.使用日记文件方式

对于普通用户来说,如果要拿到服务器证书,显然不是一件很容易的事。此时,使用日记文件的方式相对来说就比较简单了。Chrome和Firefox浏览器都支持用日记文件的方式记录用来加密TLS数据包对称会话的密钥,然后在Wireshark中指定该日记文件,就可以快速地解密HTTPS数据了。

日记文件方式主要是通过在系统中配置一个环境变量SSLKEYLOGFILE来实现的。当用户配置SSLKEYLOGFILE环境变量后,就表示告诉浏览器(Chrome和Firefox)想知道其每次HTTPS会话的Key记录。这样,浏览器将会在每次HTTPS会话结束后,将会话数据解密的Key记录到keylog文件中,然后Wireshark通过访问keylog文件,使用里面的key就可以解密字节捕获到浏览器中产生的HTTPS会话数据流。

在Windows中,使用日记文件的方式解密HTTPS数据。具体操作步骤如下:

  1. 配置环境变量。在桌面中,右击“此电脑”图标,然后选择快捷菜单中的“属性”命令,打开“系统”窗口。
  2. 选择“高级系统设置”选项,打开“系统属性”对话框
  3. 在该对话框中,单击“环境变量”按钮,打开“环境变量”对话框
  4. 在“系统变量”区域中单击“新建”按钮,打开“新建系统变量”对话框
  5. 在该对话框中指定变量名为SSLKEYLOGFILE,变量值为一个日志文件路径。变量值可以随意指定,如D:\sslkeylog.log(路径和文件名可自定义)。然后依次单击“确定”按钮,使环境变量生效。接着在Wireshark中指定该日志文件的路径。在菜单栏依次选择“编辑”|“首选项”|Protocols|TLS命令,打开TLS协议设置对话框,在其中指定日记文件的存储路径。
  6. 在对话框中指定日记文件的存储路径为D:\sslkeylog.log。然后单击OK按钮使配置生效。接下来,用户通过Chrome或Firefox浏览器访问HTTPS网站,并用Wireshark捕获到的包即可成功解密。此时,用户使用显示过滤器tlsandhttp或tlsandhttp2即可过滤解密后的数据包。
  7. 从窗口中可以看到,成功显示过滤出了解密后的数据包。而且从状态栏上可以看到,出现了一个DecryptedTLS(250bytes)(被解密的TLS数据包)标签,表示解密成功。

如图:

2.使用服务器证书方式

如果用户可以拿到服务器证书的话,则可以使用服务器证书方式来解密HTTPS数据。

使用服务器证书方式解密HTTPS数据。具体操作步骤如下:

(1)在菜单栏依次选择“编辑”|“首选项”|Protocols|TLS命令,打开TLS协议设置对话框。

(2)单击RSAkeyslist对应的Edit按钮,将打开TLS解密对话框。

(3)该对话框中共包括5列,分别为IPaddress、Port、Protocol、KeyFile和Password。其中,每列的含义如下:

  1. ·IPaddress:服务器的IP地址。
  2. ·Port:HTTPS监听的端口,一般为443。
  3. ·Protocol:指定协议,一般为HTTP。
  4. ·KeyFile:指定从服务器上获取到的RSAKey。这个RSAKey需要是一个解密后的PKCS#8PEM格式的(RSA)Key。
  5. ·password:一般不填写。如果keyfile需要一个密码,可以在这里填写。

此时,根据获取到的服务器证书来配置每个选项。

(4)单击OK按钮使配置生效。接下来就可以成功解密与指定服务器证书相关的HTTPS数据流了。

  • 20
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值