传输层安全性 (TLS) 旨在为网络通信增加安全性。 就是浏览互联网时HTTP和HTTPS的区别。
使用 TLS 为客户端和服务器增加了额外的工作,但它有其好处,包括:
- 机密性:TLS 将流量包装在加密隧道中。 这使得窃听者不可能在到达目的地的途中读取或修改流量。
- 身份验证:TLS 向客户端证明服务器的身份。 这有助于防止网络钓鱼站点。
- 完整性:TLS 包括有助于识别数据在传输过程中是否被修改或损坏的保护措施。
所有这些都是浏览网页时有价值的功能。 这就是 TLS 如此受欢迎以及大多数网站访问都以 TLS 握手开始的原因。
什么是 TLS 握手?
就像现实生活中的握手一样,TLS 握手是一个介绍。 它确定两台计算机想要以安全的方式相互交谈。
TLS 握手还定义了此对话的一些规则。 客户端和服务器都同意他们想要 TLS 的好处,但他们需要就细节达成一致。 TLS 握手让他们从最初的“你好”到可以开始私下交谈的地步。
在深入了解 TLS 握手的细节之前,了解一些关键词汇很重要。 TLS 是一种以安全为中心的协议,这意味着它使用了大量的密码学。 谈论 TLS 时需要了解的一些重要术语包括:
- 非对称加密:非对称或“公钥”加密使用两个相关的密钥:公钥和私钥。 任何用公钥加密的东西都可以用相应的私钥解密。 同样,可以使用关联的公钥验证使用私钥生成的数字签名。
- 对称加密:对称加密使用相同的密钥进行加密和解密。 这很有用,因为它比使用非对称密码术的加密更有效。 TLS 握手旨在设置共享对称加密密钥。
- 密码套件:密码套件是 TLS 协议中使用的密码算法的组合。 这包括用于握手的非对称加密算法、用于加密通过连接发送的数据的对称加密算法、数字签名算法以及用于验证数据在传输过程中未被破坏的哈希函数。
- 数字证书:数字证书证明了公钥的所有权。 服务器在 TLS 握手期间提供数字证书,以便客户端知道他们正在与正确的人通信。
TLS 握手内部
TLS 握手的目标是让客户端和服务器以安全的方式就共享的对称加密密钥达成一致。 为此,他们使用非对称加密,允许仅使用公钥发送加密消息。
TLS 握手的细节取决于所使用的非对称加密算法。 使用 RSA 的客户端和服务器经过以下步骤:
编辑切换为居中
添加图片注释,不超过 140 字(可选)
- 客户端问候:客户端通过向服务器发送配置信息来启动 TLS 握手。 这包括客户端支持的 TLS 版本、它可以使用的密码套件等数据,以及一些称为“客户端随机”的随机数据。
- 服务器问候:服务器响应一条消息,包括它对 TLS 版本和密码套件的选择、它的数字证书和“服务器随机数”。
- Premaster Secret:服务器提供的数字证书包含其公钥,可用于加密发送到服务器的消息。 在验证证书的有效性后,客户端会生成另一个随机值,称为预主密钥。 使用服务器的公钥,客户端加密此值并将其发送到服务器。
- 会话密钥:服务器使用其私钥来解密预主机密。 此时,client 和 server 都有 client random、server random 和 premaster secret。 他们从中计算出一个共享会话密钥。 由于 premaster secret 是一个秘密值——它仅以加密形式通过网络发送——会话密钥也是秘密的。
- Client Finished:为了完成 TLS 握手,客户端向服务器发送一条消息,该消息使用会话密钥加密。 服务器解密此消息并验证其正确性。 如果匹配,则服务器知道客户端正确计算了会话密钥。
- 服务器完成:服务器还发送一条使用共享会话密钥加密的消息。 解密和验证此消息向客户端证明服务器正确计算了会话密钥。
此时,客户端和服务器拥有一个只有他们自己知道的共享加密密钥。 对于 TLS 会话的其余部分,所有消息都将使用此会话密钥进行加密。
另一种结构
如上所述,使用不同的非对称加密算法会导致步骤的微小变化。 例如,如果客户端和服务器选择使用 Diffie-Hellman 而不是 RSA,则对第 2 步和第 3 步发送的消息内容稍作修改:
- 在第 2 步中,服务器将发送一个包含客户端随机数、服务器随机数及其 Diffie-Hellman 参数的数字签名包。
- 验证数字签名后,客户端用包含其 Diffie-Hellman 参数而不是预主密钥的消息进行响应。
使用这些 Diffie-Hellman 参数以及客户端和服务器随机数,客户端和服务器可以计算共享的秘密私钥。 最后,Diffie-Hellman 和 RSA 以略有不同的方式产生相同的结果。
超越基本握手
这里描述的过程是基本的 TLS 握手,在大多数 TLS 会话中使用。 但是,可以添加提供某些好处的额外步骤。
例如,基本的 TLS 握手使用数字证书向客户端验证服务器,但不向服务器验证客户端。 TLS 握手的修改版本也可以将客户端的数字证书发送到服务器,实现相互认证。