图示的TLS连接

2020-08-16 02:38:39

在本演示中,客户端连接到服务器,协商TLS 1.2会话,发送ping,接收ping,然后终止会话。单击下面开始浏览。

记录头16030100A5TLS会话被分成记录的发送和接收,这些记录是具有类型、协议版本和长度的数据块。有趣的是,版本是3.1(TLS1.0),而不是预期的3,3&34;(TLS1.2)。查看Golang加密/TLS库,我们会发现以下注释:If vers==0{//如果初始ClientHello的记录版本高于//TLS 1.0,则某些TLS服务器会出现故障。版本=版本TLS10}。

握手报头01 00 00 A1客户端版本03 03给出了协议版本";3,3";(意思是TLS 1.2)。不寻常的版本号(";3,3";代表TLS 1.2)是由于TLS 1.0是SSL 3.0协议的微小修订。因此,TLS 1.0由#34;3,1&34;表示,TLS 1.1由";3,2&34;表示,依此类推。

客户端随机00 01 02 03 04 05 06 07 08 09 0A 0b 0C 0d 0E 0f 10 11 12 13 14 15 16 17 19 1a 1b 1c 1d 1f客户端提供32字节的随机数据。在本例中,我们使随机数据成为可预测的字符串。TLS1.2规范规定,前4个字节应该是自1970年以来的当前时间(以秒为单位),但现在不建议这样做,因为它支持主机和服务器的指纹识别。

会话ID 00客户端可以提供它能够恢复的针对此服务器的先前TLS会话的ID。为此,服务器和客户端都将在内存中记住来自上一次连接的关键信息。恢复连接节省了大量计算和网络往返时间,因此只要有可能就会执行。

密码套件0020ccA8ccA9c02fc030c02bc02c013c09c014c00A009c009d002f0035c01200A客户端提供其将支持密钥交换、用交换的密钥加密和消息认证的加密方法的有序列表。该列表按照客户首选的顺序排列,优先顺序最高。

压缩方法01 00客户端提供它将支持的压缩方法的有序列表。该压缩将在加密之前应用(因为加密的数据通常是不可压缩的)。压缩的特性会削弱加密数据的安全性(请参阅犯罪)。因此,此功能已从未来的TLS协议中删除。

扩展长度0058客户端已经提供了服务器可以用来采取动作或启用新特征的可选扩展的列表。每个扩展都将以两个字节开始,指示它是哪个扩展,然后是一个双字节的内容长度字段,然后是扩展的内容。

分机-服务器名称00 00 00 18 00 16 00 00 13 65 78 61 6d 70 6c 65 2e 75 6c 66 68 65 69 6d 2e 6e 6e 65 74客户端已提供其正在联系的服务器的名称,也称为SNI(服务器名称指示)。如果没有此扩展,HTTPS服务器将无法为单个IP地址(虚拟主机)上的多个主机名提供服务,因为在协商TLS会话并发出HTTP请求之前,它无法知道要发送哪个主机名的证书。

扩展状态请求0005 0005 01 00 00 00客户端在其响应中向服务器提供提供OCSP信息的许可。OCSP可用于检查证书是否已被吊销。这种形式的客户端发送空扩展是必要的,因为服务器使用客户端首先没有提供的扩展进行回复是一个致命的错误。因此,客户端发送扩展的空表单,服务器使用填充了数据的扩展进行回复。

支持扩展的组00 0A 00 0A 00 08 00 1D 00 17 00 18 00 19客户端已表示其支持4条曲线的椭圆曲线(EC)加密。此扩展最初命名为椭圆曲线,但已重命名为支持其他加密类型的组。

扩展EC点格式000B 00 02 01 00在椭圆曲线(EC)加密期间,客户端和服务器将以压缩或未压缩的形式交换关于所选点的信息。此扩展表示客户端只能解析来自服务器的未压缩信息。在下一个版本的TLS中,不存在协商点的功能(相反,会为每条曲线预先选择一个点),因此不会发送此扩展。

扩展签名算法000D00120010004 0400305050030060603002 01003随着TLS的发展,已经有必要支持更强的签名算法,例如SHA-256,同时仍然支持使用MD5和SHA1的早期实现。此扩展指示客户端能够理解哪些签名算法,并可能影响服务器发送给客户端的证书选择。000d-扩展";签名算法";00 12-0x12(18)字节";签名算法"的赋值;扩展数据跟随00 10-0x10(16)字节的数据在以下算法列表中。

扩展-重新协商信息ff 01 00 01 00此扩展的存在可防止使用TLS重新协商执行的攻击类型。此协议的下一个版本(TLS 1.3)中已删除重新协商连接的功能,因此将来将不再需要此扩展。

Extension-SCT 00 12 00 00客户端允许服务器返回签名的证书时间戳。这种形式的客户端发送空扩展是必要的,因为服务器使用客户端首先没有提供的扩展进行回复是一个致命的错误。因此,客户端发送扩展的空表单,服务器使用填充了数据的扩展进行回复,或者基于发送了扩展的客户端更改行为。

记录头1603 03 0031TLS会话被分成记录的发送和接收,这些记录是具有类型、协议版本和长度的数据块。

握手报头02 00 00 2d服务器版本03 03给出了";3,3";(TLS 1.2)的协议版本。不寻常的版本号(";3,3";代表TLS 1.2)是由于TLS 1.0是SSL 3.0协议的微小修订。因此,TLS 1.0由#34;3,1&34;表示,TLS 1.1由";3,2&34;表示,依此类推。

服务器随机70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f 80 81 82 83 84 85 86 88 89 8a 8b 8c 8d 8e 8f服务器提供32字节的随机数据。在本例中,我们使随机数据成为可预测的字符串。TLS1.2规范规定,前4个字节应该是自1970年以来的当前时间(以秒为单位),但现在不建议这样做,因为它支持主机和服务器的指纹识别。

会话ID 00服务器可以提供该会话的ID,客户端可以在以后的会话协商中提供该ID,以尝试重用密钥数据并跳过大部分TLS协商过程。为此,服务器和客户端都将以前连接的密钥信息存储在内存中。恢复连接节省了大量计算和网络往返时间,因此只要有可能就会执行。

密码套件c0 13服务器已从客户端提供的选项列表中选择了密码套件0xC013(TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA)。

压缩方法00服务器已从客户端提供的选项列表中选择了压缩方法0x00(";Null";,不执行压缩)。

扩展长度0005服务器已向客户端返回扩展列表。由于禁止服务器使用客户端未在其hello消息中发送的分机进行回复,因此服务器知道客户端将支持列出的所有分机。

扩展-重新协商信息ff 01 00 01 00此扩展的存在可防止使用TLS重新协商执行的攻击类型。此协议的下一个版本(TLS 1.3)中已删除重新协商连接的功能,因此将来将不再需要此扩展。

服务器提供包含以下内容的证书:服务器的主机名此服务器使用的公钥来自受信任的第三方证明此主机名的所有者持有此公钥的私钥

浏览服务器证书。

记录头1603 03 03 2f TLS会话被分成记录的发送和接收,这些记录是具有类型、协议版本和长度的数据块。

握手报头0b 00 03 2b证书长度00 03 28证书长度00 03 25证书30 82 03 21 30 82 02 09 a0 03 02 01 02 08 15 5a 92 ad c2 04 8f 90 30 0d 06 09 2a 86 48 86 f7 0d 01 0b 05 00 30 22 31 0b 30 09 06 03 55 04 06 13 02 55 53 31 13 30 11 06 03 55 04 0a 13 045 78 61 6d 6c 65 20 43 41 30 1e 17 0d 38 31 30 35。5a 17 0d 31 39 31 30 35 30 31 33 38 31 37 5a 30 2b 31 0b 30 30 09 06 03 55 04 13 02 53 31 1c 30 1a 06 03 55 04 03 13 65 78 61 6d 70 6c 70 6c 65 2e 75 6c 66 68 65 69 6d 2e 6e 65 74 30 82 01 22 30 0d 06 09 2a 86 48 86 f7 0d 01 01 05 00 03 82 01 0f 00 00 82 01 0a 02 01 01 00 c4 80 36 06 ba。A8 0d 00 1e 7b 4b 4a 4a e6 0f e8 c0 71 fc 73 e7 02 4c 0d bc f4 bd d1 1d 39 6b ba 70 46 4a 13 e9 4a f8 3d f3 e1 09 59 54 7b c9 55 fb 41 2d a3 76 52 11 e1 f3 dc 77 6c aa 53 37 6e ca 3a ec be c3 aa b7 3b 31 d5 6c b6 52 9c 80 98 b9 e0 28。A1 e7 bf 8a 86 f6 46 6d 0d 9f 16 95 1a 4c f7 a0 46 92 59 5c 13 52 f2 54 9e 5a fb 4e bf d7 7a 37 95 01 44 e4 c0 26 87 4c 65 3e 40 7d 7d 23 07 44 01 f4 84 ff d0 8f 7a 1f a0 52 10 d1 f4 f0 d5 ce 79 70 29 32 e2 ca be 70 1f df 6b 4b b7 11 01。0e 06 03 55 1d 0f 01 ff 04 04 03 02 05 a0 30 1d 06 03 55 1d 25 04 16 30 14 06 08 2b 06 01 05 05 07 03 02 08 2b 06 01 05 05 07 03 03 30 1f 06 03 55 1d 23 04 18 30 16 80 14 89 4f de 5b cc 69 e2 52 cf 3e a3 00 df b1 97 b8 1d e1 46 30 0d 06 09 2a 86 48 86 f7 0d 01 0b 05 00 03。B5 e7 c3 6e 53 3e ff 36 59 08 43 24 c9 e7 a5 04 07 9d 39 e0 d4 29 87 ff e3 eb dd 09 c1 cf 1d 91 44 55 87 0b 57 1d d1 9b df 1d 24 f8 bb 9a 11 fe 80 fd 59 2b a0 39 8c de 11 e2 65 1e 61 8c e5 98 fa 96 e5 37 2e ef 3D 24 8a fd e1 74 63 eb bf ab 8 e4 d1 ab 50 2。97 f3 2e 3e 93 49 d4 c6 6c 9e a6 39 6d 74 44 62 a0 6b 42 c6 d5 ba 68 8e ac 3a 01 7b dd fc 8e 2c fc ad 27 cb 69 d3 cc dc dc a2 80 41 44 65 d3 ae 34 8c e0 f3 4a b2 fb 9c 9c 61 83 71 31 2b 19 10 41 64 1c 23 7f 11 a5 d6 5c 84 4f 04 84 84 38 71 2b 95 99a。有关此格式的详细信息和此二进制有效负载的内容,请参阅另一页。可以在命令行将证书转换为此消息中的二进制数据:$openssl x509-outform der<;Server.crt|hatdump p0000000 30 82 03 21 30 82 02 09 a0 03 02 01 02 08 150000010 5a 92 ad c2 04 8f 90 30 0d 06 09 2a 86 48 86 f7...。剪断..。

服务器计算用于密钥交换的私钥/公钥对。密钥交换是一种数学技术,通过该技术,双方可以就同一数字达成一致,而窃听者无法知道该数字是什么。它将通过使用x25519曲线的椭圆曲线方法来实现这一点。通过选择0到2256-1之间的整数来选择私钥。它通过生成32字节(256位)的随机数据来实现这一点。所选择的私钥是:通过将x25519曲线上的点x=9乘以私钥来选择公钥。计算出的公钥为:公钥计算可用命令行工具确认:#需要OpenSSL 1.1.0或更高版本$openssl pkey-noout-text<;SERVER-EMPEMEAL-PRIVAT.keyX25519私钥:PRIV:90:91:92:93:94:95:96:97:98:99:9A:9B:9C:9D:9E:9F:A0:A1:A2:A3:A4:A5:A6:A7:A8:A9:AA:AB:AC:AD:AE:afpub:9F:D7:AD:6D:CF:F4:29:8A3:A4:A5:A6:A7:A8:A9:AA:AB:AC:AD:AE:afpub:9F:D7:AD:6D:CF:F4:29:8。:f8:fa:bb:34:9a:98:28:80:b6:15。

服务器提供用于密钥交换的信息。作为密钥交换过程的一部分,服务器和客户端都将具有公钥和私钥的密钥对,并将它们的公钥发送给另一方。然后,将使用每一方的私钥和另一方的公钥的组合来生成共享加密密钥。双方已就使用ECDHE的密码套件达成一致,这意味着密钥对将基于选定的椭圆曲线,将使用Diffie-Hellman,并且密钥对是短暂的(为每个连接生成),而不是使用证书中的公钥/私钥。

记录头1603 03 01 2c TLS会话被分成记录的发送和接收,这些记录是具有类型,协议版本,

记录头1603 03 0004TLS会话被分成记录的发送和接收,这些记录是具有类型、协议版本和长度的数据块。

握手报头0E 00 00 00。

客户端计算用于密钥交换的私钥/公钥对。密钥交换是一种数学技术,通过该技术,双方可以就同一数字达成一致,而窃听者无法知道该数字是什么。它将通过使用x25519曲线的椭圆曲线方法来实现这一点。通过选择0到2256-1之间的整数来选择私钥。它通过生成32字节(256位)的随机数据来实现这一点。所选择的私钥是:通过将x25519曲线上的点x=9乘以私钥来选择公钥。计算出的公钥是:公钥计算可以在命令行确认:#需要OpenSSL 1.1.0或更高版本$openssl pkey-noout-text<;Client-临时性-Private.keyX25519私钥:PRIV:20:21:22:23:24:25:26:27:28:29:2A:2B:2C:2D:2E:2F:30:31:32:33:34:35:36:37:38:39:3A:3B:3C:3D:3E:3fpub:35:80:72:D6:36:58:80:D1:AE:EA:32:9A:DF。:3b:75:e9:65:d0:d2:cd:16:62:54。

客户端提供用于密钥交换的信息。作为密钥交换过程的一部分,服务器和客户端都将具有公钥和私钥的密钥对,并将它们的公钥发送给另一方。然后,将使用每一方的私钥和另一方的公钥的组合来生成共享加密密钥。双方已就使用ECDHE的密码套件达成一致,这意味着密钥对将基于选定的椭圆曲线,将使用Diffie-Hellman,并且密钥对是短暂的(为每个连接生成),而不是使用证书中的公钥/私钥。

记录头1603 03 0025TLS会话被分成记录的发送和接收,这些记录是具有类型、协议版本和长度的数据块。

握手报头10 00 00 21公钥20 35 80 72 d6 36 58 80 d1 ae ea 32 9a df 91 21 38 38 51 ed 21a28e 3b 75 e9 65 d0 d2 cd 16 62 54。

客户端现在拥有计算每一端将使用的加密密钥的信息。它在此计算中使用以下信息:客户端使用curve25519()算法将服务器的公钥与客户端的私钥相乘。32字节的结果称为PreMasterSecret,结果是:i';已经提供了一个执行此计算的工具:$GCC-o curve25519-mult curve25519-mult.c$./curve25519-mult client-临时性-private.key\server-临时性-public.key|hatdump p0000000 df4a 29 1b aa 1e b7 cf a6 93 4b 29 b4 74 ba ad00000。

然后,客户端计算48个字节的

.