传输层安全协议(Transport Layer Security, TLS)是一种安全协议,目的是为互联网通信提供安全及数据完整性保障。 TLS协议使用TCP协议进行传输,其他应用层协议(HTTP、DNS、SMTP等)可以在TLS协议之上建立安全的通信连接。
TLS诞生于1999年,最新版本为TLS 1.3发布于2018年。TLS协议的前身是安全套接层(Secure Sockets Layer, SSL)。 SSL共有 1.0 2.0 3.0 三个版本,SSL 3.1更名为TLS。TLS目前共有 1.0 1.1 1.2 1.3 四个版本,浏览器对TLS 1.0 1.1的支持将于2020年3月终止。
TLS协议主要做三件事:
- 数据加密
- 身份认证
- 保证数据完整性
TLS工作过程
TLS协议是可选的,必须在客户端和服务器进行配置。
TLS工作过程分成3个阶段:
- 对等协商支持的密钥算法
- 基于非对称密钥的信息传输加密、身份认证以及基于PKI证书的身份认证
- 基于对称密钥的数据传输保密
TLS 握手(TLS Handshake)
TLS协议建立安全连接的过程称为TLS握手。
要理解TLS握手过程,首先需要理解RSA密钥交换或迪菲-赫尔曼密钥交换。
客户端和服务器端首先建立TCP连接,然后开始进行TLS握手。
客户端发起clientHello请求 告诉服务器端自己支持的TLS协议版本、支持的加密套件以及随机数等其他一些参数
服务器端收到clientHello请求后确定TLS协议版本以及将要使用的加密套件,然后连带自己的CA证书、随机数等参数返给客户端
客户端使用根证书内的公钥验证服务器端提供的CA证书。证书验证通过后用进行RSA密钥交换或迪菲-赫尔曼密钥交换(Diffie–Hellman key exchange), 客户端用前面协商好的算法生成premaster secret并用服务器CA证书内的公钥加密后发送给服务器端
服务器端用自己的私钥解密出premaster secret,并用premaster secret、客户端随机数和服务器随机数生成48位master secret, 再用master secret 生成用于加密和解密的一对key
客户端和服务器端用premaster secret、客户端随机数和服务器随机数生成48位master secret 服务器端和客户端再使用master secret各生成一对key分别用于加密数据和校验数据
- client_write_MAC_key/client_write_IV
- server_write_MAC_key/server_write_IV
- client_write_key
- server_write_key
TLS 记录(TLS Record)
参考资料
- https://en.wikipedia.org/wiki/Cipher_suite
- https://en.wikipedia.org/wiki/Message_authentication_code
- https://ldapwiki.com/wiki/Master%20Secret
- https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange
- https://www.cloudflare.com/learning/ssl/what-is-an-ssl-certificate/
- https://en.wikipedia.org/wiki/Root_certificate
- ssl.com/article/browsers-and-certificate-validation/
- https://stackoverflow.com/questions/188266/how-are-ssl-certificates-verified
- https://hpbn.co/transport-layer-security-tls/
- https://www.cloudflare.com/learning/ssl/what-happens-in-a-tls-handshake/
- A Readable Specification of TLS 1.3
- How SSL and TLS provide authentication
- TLS, Pre-Master Secrets and Master Secrets
- https://hpbn.co/transport-layer-security-tls/