网上的文字千千万,但是看完是不真的觉得自己都懂了呢?其实还是知其然而不知其所以然
,不如从头开始自己动手用swift实现一遍TLS协议不就能更加深入的理解了。本文不讲理论
只重实践
。Just do it.卷卷更健康
理论知识详见参考资料或自行谷歌,本文仅实现TLS 1.2、1.3协议的基本功能
调试工具: NSS Key Log & Wireshark
git clone git@github.com:BinaryParadise/PracticeTLS.git
cd PracticeTLS
swift run
浏览器打开 http://127.0.0.1:8443
Client Server
ClientHello -------->
ServerHello
Certificate*
ServerKeyExchange*
CertificateRequest*
<-------- ServerHelloDone
Certificate*
ClientKeyExchange
CertificateVerify*
[ChangeCipherSpec]
Finished -------->
[ChangeCipherSpec]
<-------- Finished
Application Data <-------> Application Data
* 可选、视情况而定
名称 | 占用字节 | 说明 |
---|---|---|
Content Type | 1 | 协议类型 |
Version | 2 | TLS版本号 |
Length | 2 | 协议体字节数 |
Handshake Type | 1 | 握手协议类型 |
Length | 3 | 握手协议内容字节数 |
... | n | 内容字段 |
master_secret = PRF(ClientKeyExchange.pre_master_secret, "master secret", ClientHello.random + ServerHello.random)[0..47];
key_block = PRF(SecurityParameters.master_secret, "key expansion", SecurityParameters.server_random + SecurityParameters.client_random);
client_write_MAC_key[SecurityParameters.mac_key_length]
server_write_MAC_key[SecurityParameters.mac_key_length]
client_write_key[SecurityParameters.enc_key_length]
server_write_key[SecurityParameters.enc_key_length]
client_write_IV[SecurityParameters.fixed_iv_length]
server_write_IV[SecurityParameters.fixed_iv_length]
TLS1.2 PreMasterSecret And MasterSecret
图解 ECDHE 密钥交换算法 TLS 1.3 Handshake Protocol ChaCha20-Poly1305 Cipher Suites for Transport Layer Security (TLS) TLS1.3---密钥的计算... HTTPS 温故知新(五) —— TLS 中的密钥计算