https分享

2020-05-13  本文已影响0人  元隐
https 分享_.png

开篇

https

https = HyperText Transfer Protocol Secure =超文本传输安全协议
即 HTTP over TLS、HTTP over SSL

tls/ssl区别与联系

简单的说可以认为tls和ssl是一回事. 为什么改了名字, 因为SSL是网景的, TLS是互联网标准化组织ISOC的
什么是tls=Transport Layer Security,ssl = Secure Sockets Layer

SSL是Netscape开发的专门用户保护Web通讯的,目前版本为3.0。最新版本的TLS 1.0是IETF(工程任务组)制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本。两者差别极小,可以理解为SSL 3.1,它是写入了RFC的

所以以后我们统一说TLS就好了。
[图片上传失败...(image-b07c3e-1589354193162)]

为什么大家都改用https了, 因为http 存在以下问题 @兔哥

(1) 窃听风险(eavesdropping):第三方可以获知通信内容。

(2) 篡改风险(tampering):第三方可以修改通信内容。

(3) 冒充风险(pretending):第三方可以冒充他人身份参与通信。

  1. 某电商用户报上来故障, 登录查看订单, 看到了别人的订单. WTF
  2. 打开一个网页, 这广告来的莫名其妙. 右下角弹出了联通电信的logo

网络包

https建立连接的交互过程抓包

[图片上传失败...(image-c1b5da-1589354193162)]

先说前先三个包

回忆一下tcp 的四层架构<漏掉了sctp>
[图片上传失败...(image-4753c4-1589354193162)]

[图片上传失败...(image-39054f-1589354193162)]
源端口目的端口各16位, 把以端口的最大数字为2^16=65536,后接32位的序列号和确认号
0xCD 08 --> 0x01 BB [port: 52488->443] 序号
SYN包:
0000 58 69 6c 32 b5 fd 88 e9 fe 69 0e 37 08 00 45 00
0010 00 40 00 00 40 00 40 06 27 68 1e 0b ab 2e 1e 0b
0020 2c 0c <b>cd 08 01 bb</b> <b>a7 91 4a 27</b> 00 00 00 00 b0 02
0030 ff ff 6b f4 00 00 02 04 05 b4 01 03 03 05 01 01
0040 08 0a 8a d1 6c 6a 00 00 00 00 04 02 00 00
SYN ACK+1 确认号=序号+1
0000 88 e9 fe 69 0e 37 58 69 6c 32 b5 fd 08 00 45 00
0010 00 34 00 00 40 00 3d 06 2a 74 1e 0b 2c 0c 1e 0b
0020 ab 2e <b>01 bb cd 08</b> 66 68 8e d4 <b>a7 91 4a 28</b> 80 12
0030 05 b4 a0 40 00 00 02 04 05 b4 01 01 04 02 01 03
0040 03 09
ACK
0000 58 69 6c 32 b5 fd 88 e9 fe 69 0e 37 08 00 45 00
0010 00 28 00 00 40 00 40 06 27 80 1e 0b ab 2e 1e 0b
0020 2c 0c <b>cd 08 01 bb</b> a7 91 4a 28 <b>66 68 8e d5</b> 50 10
0030 20 00 c6 c8 00 00

同回忆一下osi七层架构

[图片上传失败...(image-2a9f9a-1589354193162)]

再看一下TCP包结构

[图片上传失败...(image-a7fc97-1589354193162)]

源端口和目的端口字段——各占2字节。端口是传输层与应用层的服务接口。传输层的复用和分用功能都要通过端口才能实现。
  序号字段——占4字节。TCP连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。
  确认号字段——占4字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。
  数据偏移——占4bit,它指出TCP报文段的数据起始处距离 CP报文段的起始处有多远。“数据偏移”的单位不是字节而是32bit字(4字节为计算单位)。
  保留字段——占6bit,保留为今后使用,但目前应置为0。
  紧急比特URG——当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。
  确认比特ACK——只有当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。
  复位比特RST(Reset) —— 当RST=1时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。
  同步比特SYN——同步比特SYN置为1,就表示这是一个连接请求或连接接受报文。
  终止比特FIN(FINal)——用来释放一个连接。当FIN=1时,表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。
  窗口字段——占2字节。窗口字段用来控制对方发送的数据量,单位为字节。TCP连接的一端根据设置的缓存空间大小确定自己的接收窗口大小,然后通知对方以确定对方的发送窗口的上限。
  检验和——占2字节。检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。
  紧急指针字段——占16bit。紧急指针指出在本报文段中的紧急数据的最后一个字节的序号。
  选项字段——长度可变。TCP首部可以有多达40字节的可选信息,用于把附加信息传递给终点,或用来对齐其它选项。
  填充字段——这是为了使整个首部长度是4字节的整数倍。

顺便贴了一下udp的包结构

[图片上传失败...(image-8470ea-1589354193162)]

IP数据包

[图片上传失败...(image-6d43fc-1589354193162)]

[图片上传失败...(image-28cbef-1589354193162)]

65252ddd 这个就是tiaojie.tiaojiecloud.com对应的Ip地址
88:e9:fe:69:0e:37 是我本机的mac地址

Https连接建立

[图片上传失败...(image-9a6b25-1589354193162)]

(1) 客户端向服务器端索要并验证公钥。

(2) 双方协商生成"对话密钥"。

(3) 双方采用"对话密钥"进行加密通信。

clientHello

[图片上传失败...(image-e0307c-1589354193162)]

SeverHello:

[图片上传失败...(image-972039-1589354193162)]

[图片上传失败...(image-b167cb-1589354193162)]
[图片上传失败...(image-ca5cbf-1589354193162)]

客户端回应:

这里客户端会再生成一个随机数Random3。然后使用服务端传来的公钥进行加密得到密文PreMaster Key。服务端收到这个值后,使用私钥进行解密,得到Random3。这样客户端和服务端就都拥有了Random1、Random2和Random3。这样两边的秘钥就协商好了。后面数据传输就可以用协商好的秘钥进行加密和解密。

这一步是客户端通知服务端后面再发送的消息都会使用前面协商出来的秘钥加密了,是一条事件消息。

这一步对应的是 Client Finish 消息,客户端将前面的握手消息生成摘要再用协商好的秘钥加密,这是客户端发出的第一条加密消息。服务端接收后会用秘钥解密,能解出来说明前面协商出来的秘钥是一致的。

会话秘钥 = DES(random1+random2+rsa(ramdom3))
[图片上传失败...(image-215d64-1589354193162)]

New Session Ticket, Change Cipher Spec, Encrypted Handshake Message:

New Session Ticket

包含了一个加密通信所需要的信息,这些数据采用一个只有服务端知道的密钥进行加密。目标是消除服务器需要维护每个客户端的会话状态缓存的要求。

Change Cipher Spec,编码改变通知

Encrypted Handshake Message

这一步对应的是Server Finish消息,服务端也会根据握手过程的消息生成摘要再用秘钥加密,这个服务端发出的第一条加密消息。客户端接收后会用秘钥解密,能解出来说明协商的秘钥是正确的。
[图片上传失败...(image-bca908-1589354193162)]

preMasterSecret 与 MasterSecret

[图片上传失败...(image-5a197b-1589354193162)]
Master secret是有系列的hash值组成的,它将作为数据加解密相关的secret的Key Material。Master secret最终解析出来的数据如下:

其中,write MAC key,就是session secret或者说是session key。Client write MAC key是客户端发数据的session secret,Server write MAC secret是服务端发送数据的session key。MAC(Message Authentication Code),是一个数字签名,用来验证数据的完整性,可以检测到数据是否被串改。

master_secret = PRF(pre_master_secret, "master secret",
ClientHello.random + ServerHello.random)

nginx config

server {
       #ssl参数
       listen              443 ssl;
       server_name         shxb.taobao.net;
       #证书文件
       ssl_certificate     example_com.crt;
       #私钥文件
       ssl_certificate_key example_com.key;
       ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
       ssl_ciphers         HIGH:!aNULL:!MD5;

openssl req -x509 -nodes -days 36500 -newkey rsa:2048 -keyout example_com.key -out example_com.crt

这是一个自签名的证书
[图片上传失败...(image-2dd20b-1589354193162)]

certficate: 即example_com.crt

wireshark抓https的包

export SSLKEYLOGFILE=~/ssl/key.log

在wireshark中导入 key.log

hsts

[图片上传失败...(image-9061e5-1589354193162)]

chrome://net-internals

  1. HSTS可以禁止浏览器使用无效证书(浏览器的默认策略是让用户决定是否放行,而用户往往因为不能区分无效是因为配置问题还是攻击而选择继续访问从而导致遭受网络攻击)

  2. HSTS对以下情况可以仍然保持HTTPS通信:
    [图片上传失败...(image-d96bc0-1589354193162)]
    · 用户保存了原始网站的书签

· 不安全的Cookie

· HTTPS 剥离攻击

· 网站内容混布,但需配合CSP(内容安全策略)

上一篇下一篇

猜你喜欢

热点阅读