1 网络分层协议栈
网络可以按4层分,由下往上分别为:
- L2:数据链路层,常见协议为ethernet
- L3:网络层,常见协议为IPv4/IPv6
- L4:传输层,常见协议为TCP/UDP/SCTP
- L5:应用层,常见协议为DNS/HTTP/TLS/SSL
4层网络视图如下:
L5 |
---|
L4 |
L3 |
L2 |
2 TLS
2.1 TLS协议
2.1.1 概述
TLS,即Transport Layer Security,是当今使用最为广泛的安全加密协议。
TLS,为IETF的标准协议,可为2个通信的计算机应用提供认证、加密、数据完整性的服务。
TLS,保证应用(如浏览器)与网络之间进行安全的数据交换,因为交换的数据全部被TLS加密难以破解/监听。
- 加密的网络浏览,如https
- 加密的文件传输
- VPN连接
- 加密的VoIP
- 加密的mail
- 加密的RAN-5GC通信
2.1.2 TLS协议的组成
TLS协议可分为2大部分:
- TLS Record Protocol:提供加密、可靠的安全信道
- TLS Handshake Protocol:提供通信双方认证、交换加密算法、交换加密密钥的服务
2.1.3 TLS协议的版本情况
TLS协议的版本如下:
- TLS 1.0:
替代SSL3.0,等价于SSL3.1
- TLS 1.1
- TLS 1.2
- TLS 1.3:
最新版本
2.2 TLS协议的识别
TLS协议一般承载于传输层即L4,比如TCP。
TLS协议,通常用传输层端口识别,比如tcp.port为443
。
4层网络视图如下:
L5:TLS |
---|
L4:TCP.port=443 |
L3 |
L2 |
2.3 TLS协议在TCP/IP协议栈的位置
参考https://zhuanlan.zhihu.com/p/575773514,TLS在TCP层上面提供加密的可靠信道,在HTTP层之下封装HTTP数据保证不被监听。
下图绿色框图为TLS协议:包含TLS Record Protocol/TLS Handshake Protocol等
2.4 TLS协议文档
TLS协议文档,参考:
- The TLS Protocol Version 1.0 https://www.ietf.org/rfc/rfc2246.txt
- The TLS Protocol Version 1.1 https://datatracker.ietf.org/doc/html/rfc4346
- The TLS Protocol Version 1.2 https://datatracker.ietf.org/doc/html/rfc5246
- The TLS Protocol Version 1.3 https://datatracker.ietf.org/doc/html/rfc8446
2.5 TLS报文格式
根据rfc2246,TLS报文分为TLS Record报文与TLS Handshake报文。
- TLS Record 报文是最底层,封装来自上层应用的数据
- TLS Handshake 报文
- HTTP 报文,属于 TLS.application_data
- TLS Handshake 报文承载于 TLS Record 报文,具体分为3类报文
- Change cipher spec 报文
- Alert 报文
- Handshake 报文
TLS报文之间的封装关系如下:
2.5.1 TLS Record报文的生成
TLS Record报文的生成如下:
- 从上层应用获取明文数据:
TLSPlaintext
- 对明文数据进行压缩:
TLSCompressed
- 根据TLS握手期间协商的加密套件完成压缩后的明文数据的加密:
TLSCiphertext
2.5.2 TLS Record报文格式
TLS Record报文格式如下:
type | version | length | encrypted data |
---|---|---|---|
1 byte | 2 bytes | 2 bytes | length bytes |
TLS Record报文,参考数据结构如下:
struct {
ContentType type;
ProtocolVersion version;
uint16 length;
select (CipherSpec.cipher_type) {
case stream: GenericStreamCipher;
case block: GenericBlockCipher;
} fragment;
} TLSCiphertext;
2.5.3 TLS Handshake报文格式
TLS Handshake报文,具体分为3种报文:
- change cipher spec 报文
- alert 报文
- handshake 报文
2.5.3.1 change cipher spec报文格式
change cipher spec报文格式如下:
type |
---|
1 byte |
change cipher spec报文,参考数据结构如下:
struct {
enum { change_cipher_spec(1), (255) } type;
} ChangeCipherSpec;
2.5.3.2 alert报文格式
alert报文格式如下:
level | description |
---|---|
1 byte | 1 byte |
alert 报文,参考数据结构如下:
enum { warning(1), fatal(2), (255) } AlertLevel;
enum {
close_notify(0),
unexpected_message(10),
bad_record_mac(20),
decryption_failed(21),
record_overflow(22),decompression_failure(30),
handshake_failure(40),
bad_certificate(42),
unsupported_certificate(43),
certificate_revoked(44),
certificate_expired(45),
certificate_unknown(46),
illegal_parameter(47),
unknown_ca(48),
access_denied(49),
decode_error(50),
decrypt_error(51),
export_restriction(60),
protocol_version(70),
insufficient_security(71),
internal_error(80),
user_canceled(90),
no_renegotiation(100),
(255)
} AlertDescription;
struct {
AlertLevel level;
AlertDescription description;
} Alert;
2.5.3.3 handshake报文格式
handshake报文格式如下:
msg_type | length | msg_data |
---|---|---|
1 byte | 3 bytes | length bytes |
handshake报文,参考数据结构如下:
struct {
HandshakeType msg_type; /* handshake type */
uint24 length; /* bytes in message */
select (HandshakeType) {
case hello_request: HelloRequest;
case client_hello: ClientHello;
case server_hello: ServerHello;
case certificate: Certificate;
case server_key_exchange: ServerKeyExchange;
case certificate_request: CertificateRequest;
case server_hello_done: ServerHelloDone;
case certificate_verify: CertificateVerify;
case client_key_exchange: ClientKeyExchange;
case finished: Finished;
} body;
} Handshake;
2.6 TLS交互流程
TLS交互流程,参考TCP交互流程,可以分为4部分:
- TCP握手:建立TCP信道
非加密
- TLS握手协商:协商加密套件
加密密钥
证书认证
- TLS加密通信:使用协商的通信密钥,加密通信
加密
- TCP挥手:通信完成,释放TCP信道
上述4部分里,TLS握手协商是最重要的。
TLS握手协商流程,参考rfc2246,分为全协商、快速协商2种:
全协商TLS握手流程
2.快速TLS握手流程
2.7 TLS与SSL
TLS的前身为SSL,因此TLS是基于SSL演进的新版本并最终取代SSL。
- SSL最早由网景netscape开发,仅有SSL2.0/SSL3.0 2个版本
- SSL除了在旧系统上仍有使用外,新系统出于安全考虑已经不再使用
- TLS由IETF对SSL进行规范后产生,如今取代SSL,主流版本为TLS1.2
- TLS1.0存在一种降级机制,使TLS1.0降级到SSL3.0以便兼容旧系统
TLS由SSL演进的路线:
SSL2.0->SSL3.0->TLS1.0->TLS1.1->TLS1.2->TLS1.3
在没有特别说明的情况下,TLS/SSL可以互换,指代同一种含义。
若有特别说明,那么SSL专指旧版本的协议即SSL2.0/SSL3.0,TLS专指新版本协议即TLS1.0-TLS1.3
2.8 TLS版本的差异
TLS 版本也在不断升级,升级的效果基本为"更快更安全":
- 修复发现的漏洞,如TLS1.2发现的heartbeat漏洞在TLS1.3修复
- 加快握手的过程,如TLS1.3比TLS1.2握手少了1次TTL,合并其中操作
- 加快加密解密,如使用新的加密算法
- 废弃不安全的加密算法,如MD5/RC4算法
2.9 TLS与DTLS
TLS 一般承载于TCP,而DTLS 一般承载于UDP。
DTLS 基于TLS协议标准进行开发与实现。
参考DTLS文档,http://tools.ietf.org/html/4347
2.10 OpenSsl
OpenSsl 是一个开源库,实现SSL/TLS/DTLS协议。
OpenSsl 为C库,提供很多其他语言的api,方便其他语言调用。
OpenSsl 官网,https://www.openssl.org/
2.11 TLS示例报文
可以自行配置wireshark(设置个人的密钥),之后https访问百度并同时wireshark抓包就能得到TLS报文。
这里可以参考已经内嵌密钥的TLS报文,直接完成TLS解密方便分析。 内嵌解密密钥
- https://gitlab.com/wireshark/wireshark/-/blob/master/test/captures/tls12-dsb.pcapng
2.12 参考资料
- https://zhuanlan.zhihu.com/p/575773514
- https://wiki.wireshark.org/TLS.md
- https://www.techtarget.com/searchsecurity/definition/Transport-Layer-Security-TLS?Offer=abMeterCharCount_var2
。
这里可以参考已经内嵌密钥的TLS报文,直接完成TLS解密方便分析。 内嵌解密密钥
- https://gitlab.com/wireshark/wireshark/-/blob/master/test/captures/tls12-dsb.pcapng