TLS1.2抓包解析
1.TLS1.2记录层消息解析
Transport Layer SecurityTLSv1.2 Record Layer: Handshake Protocol: Client HelloContent Type: Handshake (22)Version: TLS 1.0 (0x0301)Length: 253
- Content Type:消息类型,1个字节。
i = 0
- Version:协议版本,2个字节。
i = 1
- Length:长度,2个字节。
i = 3
2.Client Hello消息解析
下图展示了Client hello消息。
Handshake Protocol: Client HelloHandshake Type: Client Hello (1)Length: 249Version: TLS 1.2 (0x0303)Random: 8f8f55540f230fdab368448a24b2e5182b7fef7830dafd315defcd114abc55beGMT Unix Time: Apr 28, 2046 21:36:20.000000000 中国标准时间Random Bytes: 0f230fdab368448a24b2e5182b7fef7830dafd315defcd114abc55beSession ID Length: 32Session ID: 8b0e809778170dfa75738b0b9399f23169b0ae1f83019fb878124b341d3a42d8Cipher Suites Length: 36Cipher Suites (18 suites)Cipher Suite: TLS_AES_128_GCM_SHA256 (0x1301)Cipher Suite: TLS_AES_256_GCM_SHA384 (0x1302)Cipher Suite: TLS_CHACHA20_POLY1305_SHA256 (0x1303)Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f)Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 (0xc02b)Cipher Suite: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (0xc030)Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 (0xc02c)Cipher Suite: TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 (0xcca9)Cipher Suite: TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (0xcca8)Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA (0xc009)Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (0xc013)Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA (0xc00a)Cipher Suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (0xc014)Cipher Suite: TLS_RSA_WITH_AES_128_GCM_SHA256 (0x009c)Cipher Suite: TLS_RSA_WITH_AES_256_GCM_SHA384 (0x009d)Cipher Suite: TLS_RSA_WITH_AES_128_CBC_SHA (0x002f)Cipher Suite: TLS_RSA_WITH_AES_256_CBC_SHA (0x0035)Cipher Suite: TLS_RSA_WITH_3DES_EDE_CBC_SHA (0x000a)Compression Methods Length: 1Compression Methods (1 method)Compression Method: null (0)Extensions Length: 140Extension: server_name (len=20)Type: server_name (0)Length: 20Server Name Indication extensionServer Name list length: 18Server Name Type: host_name (0)Server Name length: 15Server Name: selflias.com.cnExtension: extended_master_secret (len=0)Type: extended_master_secret (23)Length: 0Extension: renegotiation_info (len=1)Type: renegotiation_info (65281)Length: 1Renegotiation Info extensionRenegotiation info extension length: 0Extension: supported_groups (len=8)Type: supported_groups (10)Length: 8Supported Groups List Length: 6Supported Groups (3 groups)Supported Group: x25519 (0x001d)Supported Group: secp256r1 (0x0017)Supported Group: secp384r1 (0x0018)Extension: ec_point_formats (len=2)Type: ec_point_formats (11)Length: 2EC point formats Length: 1Elliptic curves point formats (1)EC point format: uncompressed (0)Extension: session_ticket (len=0)Type: session_ticket (35)Length: 0Data (0 bytes)Extension: signature_algorithms (len=20)Type: signature_algorithms (13)Length: 20Signature Hash Algorithms Length: 18Signature Hash Algorithms (9 algorithms)Signature Algorithm: ecdsa_secp256r1_sha256 (0x0403)Signature Hash Algorithm Hash: SHA256 (4)Signature Hash Algorithm Signature: ECDSA (3)Signature Algorithm: rsa_pss_rsae_sha256 (0x0804)Signature Hash Algorithm Hash: Unknown (8)Signature Hash Algorithm Signature: SM2 (4)Signature Algorithm: rsa_pkcs1_sha256 (0x0401)Signature Hash Algorithm Hash: SHA256 (4)Signature Hash Algorithm Signature: RSA (1)Signature Algorithm: ecdsa_secp384r1_sha384 (0x0503)Signature Hash Algorithm Hash: SHA384 (5)Signature Hash Algorithm Signature: ECDSA (3)Signature Algorithm: rsa_pss_rsae_sha384 (0x0805)Signature Hash Algorithm Hash: Unknown (8)Signature Hash Algorithm Signature: Unknown (5)Signature Algorithm: rsa_pkcs1_sha384 (0x0501)Signature Hash Algorithm Hash: SHA384 (5)Signature Hash Algorithm Signature: RSA (1)Signature Algorithm: rsa_pss_rsae_sha512 (0x0806)Signature Hash Algorithm Hash: Unknown (8)Signature Hash Algorithm Signature: Unknown (6)Signature Algorithm: rsa_pkcs1_sha512 (0x0601)Signature Hash Algorithm Hash: SHA512 (6)Signature Hash Algorithm Signature: RSA (1)Signature Algorithm: rsa_pkcs1_sha1 (0x0201)Signature Hash Algorithm Hash: SHA1 (2)Signature Hash Algorithm Signature: RSA (1)Extension: key_share (len=38)Type: key_share (51)Length: 38Key Share extensionClient Key Share Length: 36Key Share Entry: Group: x25519, Key Exchange length: 32Group: x25519 (29)Key Exchange Length: 32Key Exchange: a61abd6c612929a731944317da01f71321bad1cb973895cfe8421c73e70fcd72Extension: psk_key_exchange_modes (len=2)Type: psk_key_exchange_modes (45)Length: 2PSK Key Exchange Modes Length: 1PSK Key Exchange Mode: PSK with (EC)DHE key establishment (psk_dhe_ke) (1)Extension: supported_versions (len=9)Type: supported_versions (43)Length: 9Supported Versions length: 8Supported Version: TLS 1.3 (0x0304)Supported Version: TLS 1.2 (0x0303)Supported Version: TLS 1.1 (0x0302)Supported Version: TLS 1.0 (0x0301)[JA3 Fullstring: 771,4865-4866-4867-49199-49195-49200-49196-52393-52392-49161-49171-49162-49172-156-157-47-53-10,0-23-65281-10-11-35-13-51-45-43,29-23-24,0][JA3: dda262729e5413660ec0e6a8d4279860]
-
Handshake Type:握手类型,1个字节。
i = 5
-
Length:长度,3个字节。
i = 6
-
Version:协议版本,2个字节。
i = 9
-
Random:随机数,32个字节。
i = 11
-
Session ID Length:会话ID长度,1个字节。
i = 43
-
Session ID:会话ID,32个字节(不确定)。
i = 44
-
Cipher Suite Length:加密套件长度,2个字节。
i = 44 + Session ID Length
-
Cipher Suite:加密套件。支持的密码套件(Cipher Suite)有18个,占36字节,优先支持TLS_AES_128_GCM_SHA256。
i = 46 + Session ID Length
-
Compression Method Len:压缩方法长度,1个字节。
i = 46 + Session ID Length + Cipher Suite Length
-
Compression Method:压缩方法。Compression Methods压缩方法为null。
i = 47 + Session ID Length + Cipher Suite Length
-
Extensions Length:拓展长度,2个字节。
i = 47 + Session ID Length + Cipher Suite Length + Compression Method Len
-
接下来就是Extensions的各个字段值。
扩展占140字节,第一个扩展是SNI扩展,请求的主机名为 selflias.com.cn。
supported_groups扩展,支持三个曲线x25519、secp256r1、secp384r1。
还支持SessionTicket扩展。
signature_algorithms签名算法支持9种。
i = 49 + Session ID Length + Cipher Suite Length + Compression Method Len
- 需要关注
session_ticket
,有关会话复用。 - 需要关注
extended_master_secret
,标识 Client 和 Server 使用增强型主密钥计算方式, Server 在 ServerHello 中响应该扩展。
- 需要关注
3. Server Hello消息解析
Transport Layer SecurityTLSv1.2 Record Layer: Handshake Protocol: Server HelloContent Type: Handshake (22)Version: TLS 1.2 (0x0303)Length: 69Handshake Protocol: Server HelloHandshake Type: Server Hello (2)Length: 65Version: TLS 1.2 (0x0303)Random: fbdf8dffb78c84c8923d6499ff957f595694009ec2a88dd451a12263e416df36GMT Unix Time: Nov 29, 2103 06:28:15.000000000 中国标准时间Random Bytes: b78c84c8923d6499ff957f595694009ec2a88dd451a12263e416df36Session ID Length: 0Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f)Compression Method: null (0)Extensions Length: 25Extension: renegotiation_info (len=1)Type: renegotiation_info (65281)Length: 1Renegotiation Info extensionRenegotiation info extension length: 0Extension: server_name (len=0)Type: server_name (0)Length: 0Extension: ec_point_formats (len=4)Type: ec_point_formats (11)Length: 4EC point formats Length: 3Elliptic curves point formats (3)EC point format: uncompressed (0)EC point format: ansiX962_compressed_prime (1)EC point format: ansiX962_compressed_char2 (2)Extension: session_ticket (len=0)Type: session_ticket (35)Length: 0Data (0 bytes)Extension: extended_master_secret (len=0)Type: extended_master_secret (23)Length: 0[JA3S Fullstring: 771,49199,65281-0-11-35-23][JA3S: 098e26e2609212ac1bfac552fbe04127]
- Handshake Type:握手类型,1个字节。
i = 5
- Length:长度,3个字节。
i = 6
- Version:协议版本,2个字节。
i = 9
- Random:随机数,32个字节。
i = 11
- Session ID Length:会话ID长度,1个字节。
i = 43
- Session ID:会话ID。Session ID为空,服务器不适用Session ID作为会话恢复,而是支持SessionTicket。
i = 44
- Cipher Suite:加密套件,2个字节。协商的密码套件为TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256。
i = 44 + Session ID Length
- Compression Method:压缩方法,1个字节。不启用压缩。
i = 46 + Session ID Length + Cipher Suite Length
- Extensions Length:拓展长度,2个字节。扩展长度为25字节,共处理客户端的5个扩展。
i = 47 + Session ID Length + Cipher Suite Length
- 接下来就是Extensions的各个字段值,不再详细展开介绍。
i = 49 + Session ID Length + Cipher Suite Length
- 需要关注
extended_master_secret(EMS)
,Server 返回了一个空的 extended_master_secret 扩展,表明会使用增强型主密钥计算方式。关于增强型主密钥计算方式,见 HTTPS 温故知新(五) —— TLS 中的密钥计算 这篇文章。
- 需要关注
4. Certificate消息解析
Transport Layer SecurityTLSv1.2 Record Layer: Handshake Protocol: CertificateContent Type: Handshake (22)Version: TLS 1.2 (0x0303)Length: 2972Handshake Protocol: CertificateHandshake Type: Certificate (11)Length: 2968Certificates Length: 2965Certificates (2965 bytes)Certificate Length: 1668Certificate: 30820680308204e8a003020102021100f0bb16defd41d3ba7cf205dccec0ae01300d0609… (id-at-commonName=selflias.com.cn)signedCertificateversion: v3 (2)serialNumber: 0x00f0bb16defd41d3ba7cf205dccec0ae01signature (sha384WithRSAEncryption)issuer: rdnSequence (0)rdnSequence: 3 items (id-at-commonName=TrustAsia RSA DV TLS CA G2,id-at-organizationName=TrustAsia Technologies, Inc.,id-at-countryName=CN)validitysubject: rdnSequence (0)rdnSequence: 1 item (id-at-commonName=selflias.com.cn)subjectPublicKeyInfoextensions: 9 itemsalgorithmIdentifier (sha384WithRSAEncryption)Algorithm Id: 1.2.840.113549.1.1.12 (sha384WithRSAEncryption)Padding: 0encrypted: 3bebea7d478c774f6b636cc081dafd75507d70bc2f007be5fa75a4ee841265b8bf64e486…Certificate Length: 1291Certificate: 30820507308203efa003020102021100b20ced552e31a0bf343a7528743be9ab300d0609… (id-at-commonName=TrustAsia RSA DV TLS CA G2,id-at-organizationName=TrustAsia Technologies, Inc.,id-at-countryName=CN)signedCertificateversion: v3 (2)serialNumber: 0x00b20ced552e31a0bf343a7528743be9absignature (sha256WithRSAEncryption)issuer: rdnSequence (0)rdnSequence: 5 items (id-at-commonName=AAA Certificate Services,id-at-organizationName=Comodo CA Limited,id-at-localityName=Salford,id-at-stateOrProvinceName=Greater Manchester,id-at-countryName=GB)validitysubject: rdnSequence (0)rdnSequence: 3 items (id-at-commonName=TrustAsia RSA DV TLS CA G2,id-at-organizationName=TrustAsia Technologies, Inc.,id-at-countryName=CN)subjectPublicKeyInfoextensions: 8 itemsalgorithmIdentifier (sha256WithRSAEncryption)Algorithm Id: 1.2.840.113549.1.1.11 (sha256WithRSAEncryption)Padding: 0encrypted: 1cc5289b97312237b6222154ee6382b01af617a098794e5cc9f43f01ea7d9005d8503b96…
-
Handshake Type:握手类型,1个字节。
i = 5
-
Length:长度,3个字节。
i = 6
-
Certificates Length:证书长度,3个字节。
i = 9
-
Certificates :证书相关信息,可能是多个证书形成的证书链(服务器证书、中间证书和)。通常情况下,证书链的第一个证书是服务器公钥证书。
对于上述例子,可以看出服务器发送了两张证书,一张是服务器自己的证书,一张是中间证书。我们只需要保存服务器公钥证书,用于后续加密预主密钥。
服务器自己的证书由TrustAsia RSA DV TLS CA G2颁发,中间证书由AAA Certificate Services颁发。两张证书都使用sha256WithRSA算法签名。- Certificate Length:服务器公钥证书信息证书长度,3个字节。
i = 12
- Certificate :服务器公钥证书信息。
i = 15
-
signedCertificate:已签名的证书。
- version:证书版本。在这个例子中,版本为v3,表示这是一个符合X.509版本3标准的证书。
- serialNumber:证书的序列号。
- signature:证书的签名算法。这个例子中使用了sha256WithRSA算法进行签名。
- issuer:证书的颁发者(发行者)。在这个例子中,由TrustAsia RSA DV TLS CA G2颁发。
- validity:证书的有效期。它包含了证书的生效日期和失效日期。
- subject:证书的主体(拥有者)。在这个例子中,主体信息为空。
- subjectPublicKeyInfo:证书的公钥信息。subjectPublicKey给出了公钥值。
- extensions:证书的扩展字段,包含一些额外的证书信息,如密钥用途、颁发者信息等。其中重要的扩展,即critical=True的有:
id-ce-keyUsage,表示该证书可以用于密钥交换和数字签名。
id-ce-basicConstraints,表示该证书是一张普通证书,不能签发其他证书。
-
algorithmIdentifier:证书的签名算法标识符。
-
Padding:填充字段,用于对齐证书结构。
-
encrypted:加密部分,可能包含证书中的敏感信息。
-
- Certificate Length:服务器公钥证书信息证书长度,3个字节。
5. ServerKeyExchange
Transport Layer SecurityTLSv1.2 Record Layer: Handshake Protocol: Server Key ExchangeContent Type: Handshake (22)Version: TLS 1.2 (0x0303)Length: 300Handshake Protocol: Server Key ExchangeHandshake Type: Server Key Exchange (12)Length: 296EC Diffie-Hellman Server ParamsCurve Type: named_curve (0x03)Named Curve: x25519 (0x001d)Pubkey Length: 32Pubkey: 37cb1755840758875116cb24435a7edb61228ce7d353b56ddaae691168c13176Signature Algorithm: rsa_pss_rsae_sha256 (0x0804)Signature Hash Algorithm Hash: Unknown (8)Signature Hash Algorithm Signature: SM2 (4)Signature Length: 256Signature: 37936b9ead1368308a601245cf01e35274774210b59fe3343f48f4e202c54a7df8ee1de4…
- Handshake Type:握手类型,1个字节。
i = 5
- Length:长度,3个字节。
i = 6
- Curve Type:曲线类型,1个字节。
i = 9
- Named Curve:曲线名称,2个字节。
i = 10
- Pubkey Length:公钥长度,1个字节。
i = 12
- Pubkey:公钥字节流。
i = 13
- Signature Algorithm:签名算法,2个字节。
i = 13 + Pubkey Length
- Signature Length:签名长度,2个字节。
i = 15 + Pubkey Length
- Signature:签名字节流。
i = 17 + Pubkey Length
上述例子采用的是曲线是x25519,公钥:37cb1755840758875116cb24435a7edb61228ce7d353b56ddaae691168c13176,签名算法是rsa_pss_rsae_sha256。
6. ClientKeyExchange
略
7. NewSessTicket
略
8. ECDHE密钥交换算法原理
ECDHE 密钥协商算法是 DH 算法演进过来的,所以我们先从 DH 算法说起。
8.1 离散对数
DH 算法是非对称加密算法, 因此它可以用于密钥交换,该算法的核心数学思想是离散对数。 离散对数是在对数运算的基础上加了「模运算」,也就说取余数,对应编程语言的操作符是「%」,也可以用 mod 表示。离散对数的概念如下图:
上图中底数 a
和模数 p
是离散对数的公共参数,也就说是公开的,b
是真数,i
是对数。知道了对数,就可以用上面的公式计算出真数。但反过来,知道真数却很难推算出对数。
特别是当模数 p 是一个很大的质数,即使知道底数 a 和真数 b ,在现有的计算机的计算水平是几乎无法算出离散对数的,这就是 DH 算法的数学基础。
8.2 DH 算法
认识了离散对数,我们来看看 DH 算法是如何密钥交换的。
现假设小红和小明约定使用 DH 算法来交换密钥,那么基于离散对数,小红和小明需要先确定模数和底数作为算法的参数,这两个参数是公开的,用 P 和 G 来代称。
然后小红和小明各自生成一个随机整数作为私钥,双方的私钥要各自严格保管,不能泄漏,小红的私钥用 a 代称,小明的私钥用 b 代称。
现在小红和小明双方都有了 p 和 g 以及各自的私钥,于是就可以计算出公钥:
小红的公钥记作 A,A = g ^ a ( mod p )
小明的公钥记作 B,B = g ^ b ( mod p )
A 和 B 也是公开的,因为根据离散对数的原理,从真数(A 和 B)反向计算对数 a 和 b 是非常困难的。
双方交换各自 DH 公钥后,小红执行运算: B ^ a( mod P )
,其结果为 K,小明执行运算: A ^ b ( mod P )
,得到的结果也是 K。 此时,小红和小明就得到了相同的密钥 K。
8.3 DHE 算法
根据私钥生成的方式,DH 算法分为两种实现:
- static DH 算法【废弃】:服务器私钥固定,客户端私钥随机;
- DHE 算法【常用】:双方私钥都是随机的。
static DH 算法里有一方的私钥是静态的,也就说每次密钥协商的时候有一方的私钥都是一样的,一般是服务器方固定,即 a 不变,客户端的私钥则是随机生成的。
于是,DH 交换密钥时就只有客户端的公钥是变化,而服务端公钥是不变的,那么随着时间延长,黑客就会截获海量的密钥协商过程的数据,因为密钥协商的过程有些数据是公开的,黑客就可以依据这些数据暴力破解出服务器的私钥,然后就可以计算出会话密钥了,于是之前截获的加密数据会被破解,所以 static DH 算法不具备前向安全性。
既然固定一方的私钥有被破解的风险,那么干脆就让双方的私钥在每次密钥交换通信时,都是随机生成的、临时的,这个方式也就是 DHE 算法,E 全称是 ephemeral(临时性的)。
所以,即使有黑客破解了某一次通信过程的私钥,其他通信过程的私钥仍然是安全的,因为每个通信过程的私钥都是没有任何关系的,都是独立的,这样就保证了「前向安全」。
8.4 ECDHE 算法
DHE 算法由于计算性能不佳,因为需要做大量的乘法,为了提升 DHE 算法的性能,所以就出现了现在广泛用于密钥交换算法 —— ECDHE 算法。
ECDHE 算法是在 DHE 算法的基础上利用了 ECC 椭圆曲线特性,可以用更少的计算量计算出公钥,以及最终密钥。
小红和小明使用 ECDHE 密钥交换算法的过程:
- 双方事先确定好使用哪种椭圆曲线,和曲线上的基点 G,这两个参数都是公开的;
- 双方各自随机生成一个随机数作为私钥 d,并与基点 G相乘得到公钥Q(Q = dG),此时小红的公私钥为 Q1 和 d1,小明的公私钥为 Q2 和 d2;
- 双方交换各自的公钥,最后小红计算点(x1,y1) = d1Q2,小明计算点(x2,y2) = d2Q1,由于椭圆曲线上是可以满足乘法交换和结合律,所以 d1Q2 = d1d2G = d2d1G = d2Q1 ,因此双方的 x 坐标一样,所以它是共享密钥。
这个过程中,双方的私钥都是随机、临时生成的,都是不公开的,即使根据公开的信息(椭圆曲线、公钥、基点 G)也是很难计算出椭圆曲线上的离散对数(私钥)。
8.5 ECDHE 握手过程
知道了 ECDHE 算法基本原理后,我们就结合实际的情况来看看。
我用 Wireshark 工具抓了用 ECDHE 密钥协商算法的 TSL 握手过程,可以看到是四次握手:
使用了 ECDHE,在 TLS 第四次握手前,客户端就已经发送了加密的 HTTP 数据,而对于 RSA 握手过程,必须要完成 TLS 四次握手,才能传输应用数据。
所以,ECDHE 相比 RSA 握手过程省去了一个消息往返的时间,这个有点「抢跑」的意思,它被称为是「TLS False Start」,跟「TCP Fast Open」有点像,都是在还没连接完全建立前,就发送了应用数据,提高了传输效率。
接下来,分析每一个 ECDHE 握手过程。
1.TLS 第一次握手
客户端首先会发一个「Client Hello」消息,消息里面有客户端使用的 TLS 版本号、支持的密码套件列表,以及生成的随机数(Client Random)。
2. TLS 第二次握手
服务端收到客户端的「打招呼」,同样也要回礼,会返回「Server Hello」消息,消息面有服务器确认的 TLS 版本号,也给出了一个随机数(Server Random),然后从客户端的密码套件列表选择了一个合适的密码套件。
不过,这次选择的密码套件就和 RSA 不一样了,我们来分析一下这次的密码套件的意思。
「TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384」
- 密钥协商算法使用 ECDHE;
- 签名算法使用 RSA;
- 握手后的通信使用 AES 对称算法,密钥长度 256 位,分组模式是 GCM;
- 摘要算法使用 SHA384;
接着,服务端为了证明自己的身份,发送「Certificate」消息,会把证书也发给客户端。
这一步就和 RSA 握手过程有很大到区别了,因为服务端选择了 ECDHE 密钥协商算法,所以会在发送完证书后,发送「Server Key Exchange」消息。 而 RSA 握手过程是没有这个消息的。
这个过程服务器做了三件事:
- 选择了名为 named_curve 的椭圆曲线,选好了椭圆曲线相当于椭圆曲线基点 G 也定好了,这些都会公开给客户端;
- 生成随机数作为服务端椭圆曲线的私钥,保留到本地;
- 根据基点 G 和私钥计算出服务端的椭圆曲线公钥,这个会公开给客户端。
为了保证这个椭圆曲线的公钥不被第三方篡改,服务端会用 RSA 签名算法给服务端的椭圆曲线公钥做个签名。
随后,就是「Server Hello Done」消息,服务端跟客户端表明:“这些就是我提供的信息,打招呼完毕”。
至此,TLS 两次握手就已经完成了,目前客户端和服务端通过明文共享了这几个信息:Client Random、Server Random 、使用的椭圆曲线、椭圆曲线基点 G、服务端椭圆曲线的公钥,这几个信息很重要,是后续生成会话密钥的材料。
3. TLS 第三次握手
客户端收到了服务端的证书后,自然要校验证书是否合法,如果证书合法,那么服务端到身份就是没问题的。校验证书到过程,会走证书链逐级验证,确认证书的真实性,再用证书的公钥验证签名,这样就能确认服务端的身份了,确认无误后,就可以继续往下走。
客户端会生成一个随机数作为客户端椭圆曲线的私钥,然后再根据服务端前面给的信息,生成客户端的椭圆曲线公钥,然后用「Client Key Exchange」消息发给服务端。
至此,双方都有对方的椭圆曲线公钥、自己的椭圆曲线私钥、椭圆曲线基点 G。于是,双方都就计算出点(x,y),其中 x 坐标值双方都是一样的,这个是预主密钥。
还记得 TLS 握手阶段,客户端和服务端都会生成了一个随机数传递给对方吗?
主密钥由密码导出函数(KDF)转换为主密钥, 常见的KDF有PBKDF2、PRF等。 TLS1.2使用 PRF进行密码推导(TLS1.3 是用的 HKDF),它需要三个参数(secret,label,seed),其中:secret是输入,label是个固定值,seed就是salt,是一个随机值,计算过程大体如下:
master_secret = PRF(pre_master_secret, "master secret",ClientHello.random + ServerHello.random)[0..47];
在ECDHE中,label 是 “master secret”,以字符的形式参与计算;seed 是 将客户端和服务器在 “hello” 消息产生的随机数进行拼接。
之后会话密钥/密钥块是由「客户端随机数 + 服务端随机数 + 主密钥 」通过 PRF 函数来生成,会话密钥里面包含对称加密密钥、消息认证和 CBC 模式的初始化向量,对于非 CBC 模式的加密算法来说,就没有用到这个初始化向量。
之所以这么麻烦,是因为 TLS 设计者不信任客户端或服务器「伪随机数」的可靠性,为了保证真正的完全随机,把三个不可靠的随机数混合起来,那么「随机」的程度就非常高了,足够让黑客计算出最终的会话密钥,安全性更高。
算好会话密钥后,客户端会发一个「Change Cipher Spec」消息,告诉服务端后续改用对称算法加密通信。
接着,客户端会发「Encrypted Handshake Message」消息,把之前发送的数据做一个摘要,再用对称密钥加密一下,让服务端做个验证,验证下本次生成的对称密钥是否可以正常使用。
4. TLS 第四次握手
最后,服务端也会有一个同样的操作,发「Change Cipher Spec」和「Encrypted Handshake Message」消息,如果双方都验证加密和解密没问题,那么握手正式完成。于是,就可以正常收发加密的 HTTP 请求和响应了。
5. 总结:RSA 和 ECDHE 握手过程的区别
- RSA 密钥协商算法「不支持」前向保密,ECDHE 密钥协商算法「支持」前向保密;
- 使用了 RSA 密钥协商算法,TLS 完成四次握手后,才能进行应用数据传输,而对于 ECDHE 算法,客户端可以不用等服务端的最后一次 TLS 握手,就可以提前发出加密的 HTTP 数据(其实是之前发送的数据的摘要),节省了一个消息的往返时间;
- 使用 ECDHE, 在 TLS 第 2 次握手中,会出现服务器端发出的「Server Key Exchange」消息,而 RSA 握手过程没有该消息。
参考资料
- HTTPS 温故知新(六) —— TLS 中的 Extensions
- HTTPS 温故知新(五) —— TLS 中的密钥计算
- (十)Diffie-Hellman协议
- 图解 ECDHE 密钥交换算法
相关文章:

TLS1.2抓包解析
1.TLS1.2记录层消息解析 Transport Layer SecurityTLSv1.2 Record Layer: Handshake Protocol: Client HelloContent Type: Handshake (22)Version: TLS 1.0 (0x0301)Length: 253Content Type:消息类型,1个字节。 i 0Version:协议版本&…...

使用两个队列实现栈
在计算机科学中,栈是一种数据结构,它遵循后进先出(LIFO)的原则。这意味着最后一个被添加到栈的元素将是第一个被移除的元素。然而,Java的标准库并没有提供栈的实现,但我们可以使用两个队列来模拟一个栈的行…...

通过ffmpeg实现视频背景色替换
最近遇到一个需求,希望可以将素材视频的绿幕背景替换为指定的颜色,然后通过裁剪,拼接等处理制作一个新的视频。所以替换背景色成为了重要的一环,看能否通过ffmpeg来实现。通过一番搜索尝试,发现方案可行。下面我整理一…...

后轮位置反馈控制与算法仿真实现
文章目录 1. 后轮反馈控制2. 算法原理3. 算法和仿真实现 1. 后轮反馈控制 后轮反馈控制(Rear wheel feedback)算法是利用后轮中心的跟踪偏差来进行转向控制量计算的方法,属于Frenet坐标系的一个应用。通过选择合适的李雅普诺夫函数设计控制率…...

实战 vue3 使用百度编辑器ueditor
前言 在开发项目由于需求vue自带对编辑器不能满足使用,所以改为百度编辑器,但是在网上搜索发现都讲得非常乱,所以写一篇使用流程的文章 提示:以下是本篇文章正文内容,下面案例可供参考 一、下载ueditor编辑器 一个“…...

N种方法解决1(CTF)
这里遇到的问题:一开始采用的base64解码平台有问题;默认解密出的格式为GBK格式;直接复制粘贴发现无法还原图片;又尝试了其他编码的;发现只有hex格式可以保证图片正常还原; 图片是以二进制存储的࿱…...

Istio实战:Istio Kiali部署与验证
目录 前言一、Istio安装小插曲 注意事项 二、Kiali安装三、Istio测试参考资料 前言 前几天我就开始捣腾Istio。前几天在执行istioctl install --set profiledemo -y 的时候老是在第二步就报错了,开始我用的istio版本是1.6.8。 后面查看k8s与istio的版本对应关系后发…...
ASPxGridView中使用PopupEditForm表单字段联动填充
c#中devexpress的控件ASPxGridView中使用PopupEditForm表单字段联动填充 //选择项目名称,自动填充项目编号 <Columns><dx:GridViewDataTextColumn FieldName"id" ReadOnly"True" VisibleIndex"0" Visible"False"…...

基于Pytorch的猫狗图片分类【深度学习CNN】
猫狗分类来源于Kaggle上的一个入门竞赛——Dogs vs Cats。为了加深对CNN的理解,基于Pytorch复现了LeNet,AlexNet,ResNet等经典CNN模型,源代码放在GitHub上,地址传送点击此处。项目大纲如下: 文章目录 一、问题描述二、数据集处理…...

flutter sliver 多种滚动组合开发指南
flutter sliver 多种滚动组合开发指南 视频 https://youtu.be/4mho1kZ_YQU https://www.bilibili.com/video/BV1WW4y1d7ZC/ 前言 有不少同学工作中遇到需要把几个不同滚动行为组件(顶部 appBar、内容固定块、tabBar 切换、tabBarView视图、自适应高度、横向滚动&a…...

kafka生产者2
1.数据可靠 • 0:生产者发送过来的数据,不需要等数据落盘应答。 风险:leader挂了之后,follower还没有收到消息。。。。 • 1:生产者发送过来的数据,Leader收到数据后应答。 风险:leader应答…...

【LNMP】云导航项目部署及环境搭建(复杂)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、项目介绍1.1项目环境架构LNMP1.2项目代码说明 二、项目环境搭建2.1 Nginx安装2.2 php安装2.3 nginx配置和php配置2.3.1 修改nginx文件2.3.2 修改vim /etc/p…...

nginx之状态页 日志分割 自定义图表 证书
5.1 网页的状态页 基于nginx 模块 ngx_http_stub_status_module 实现,在编译安装nginx的时候需要添加编译参数 --with-http_stub_status_module,否则配置完成之后监测会是提示语法错误注意: 状态页显示的是整个服务器的状态,而非虚拟主机的状态 server{…...

数字人的未来:数字人对话系统 Linly-Talker + 克隆语音 GPT-SoVITS
🚀数字人的未来:数字人对话系统 Linly-Talker 克隆语音 GPT-SoVITS https://github.com/Kedreamix/Linly-Talker 2023.12 更新 📆 用户可以上传任意图片进行对话 2024.01 更新 📆 令人兴奋的消息!我现在已经将强…...

SpringMVC 学习(五)之域对象
目录 1 域对象介绍 2 向 request 域对象共享数据 2.1 通过 ServletAPI (HttpServletRequest) 向 request 域对象共享数据 2.2 通过 ModelAndView 向 request 域对象共享数据 2.3 通过 Model 向 request 域对象共享数据 2.4 通过 map 向 request 域对象共享数据 2.5 通过…...

✅技术社区项目—JWT身份验证
通用的JWT鉴权方案 JWT鉴权流程 基本流程分三步: ● 用户登录成功之后,后端将生成的jwt返回给前端,然后前端将其保存在本地缓存; ● 之后前端与后端的交互时,都将iwt放在请求头中,比如可以将其放在Http的身份认证的请求头 Author…...

5.2 Ajax 数据爬取实战
目录 1. 实战内容 2、Ajax 分析 3、爬取内容 4、存入MySQL 数据库 4.1 创建相关表 4.2 数据插入表中 5、总代码与结果 1. 实战内容 爬取Scrape | Movie的所有电影详情页的电影名、类别、时长、上映地及时间、简介、评分,并将这些内容存入MySQL数据库中。 2、…...
276.【华为OD机试真题】矩阵匹配(二分法—JavaPythonC++JS实现)
🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-矩阵匹配二.解题思路三.题解代码Python题解代码…...

java——多线程基础
目录 线程的概述多线程的创建方式一:继承Thread类方式二:实现Runnable接口方式三:利用Callable接口、FutureTask类来实现。Thread常用的方法 线程安全问题线程安全问题概述线程安全问题案例取钱案例描述模拟代码如下:执行结果 线程…...

Python服务器监测测试策略与工具:确保应用的高可用性!
在构建高可用性的应用程序时,服务器监测测试是至关重要的一环。Python作为一种强大的编程语言,提供了丰富的工具和库来帮助我们进行服务器监测测试。本文将介绍一些关键的策略和工具,帮助你确保应用的高可用性。 1. 监测策略的制定ÿ…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...