本篇文章, 我们以 TLS_RSA_WITH_AES_253_CBC_SHA256
为例,来学习一种 TLS Key 交换算法.: RSA key 交换算法
.
注意, 这种 key 交换算法已经被证明并不安全,因此请在实践中不要使用它,
这里我们只是以此来学习以下相关算法原理.
握手过程
使用 RSA Key 交换算法的 TLS 握手流程大体如下:
Client Server
ClientHello{CipherSuites: TLS_RSA_...} -->
<-- ServerHello{CipherSuite: TLS_RSA_...}
<-- Certificate(RSA)
<-- ServerHelloDone
ClientKeyExchange** -->
ChangeCipherSpec -->
EncryptedHandshakeMessage -->
<-- ChangeCipherSpec
<-- EncryptedHandshakeMessag
算法解析
RSA Key 交换算法流程:
1. TLS 服务器端
当 TLS 握手过程中选择了 RSA key 交换算法。 服务器会发送一个 RSA
的证书给客户端。这个证书有两个作用:
- 用于表示服务器的身份信息,用于身份认证。
- 用于进行 RSA key 交换
当使用 RSA key 交换算法的时候,通常不需要再额外的发送 ServerKeyExchange
包。
2. TLS 客户端
客户端收到服务器端的证书之后,进行如下操作:
- 使用一个安全的随机数生成方法,生成48个字节。
- 把前两个字节替换为
ClientHello
中所携带的 TLS 版本信息对应的字节。 此时,这个 48 字节的随机数就是此次 TLS 会话中要使用的premaster key
. - 客户端使用服务器端发送过来的公钥,对这个随机数组进行加密。
- 加密之后的内容,通过
ClientKeyExchage
发送给服务器端。
3. TLS 服务器端
当服务器端收到来自客户端的 ClientKeyExchage
之后, 使用对应的证书的私钥对其中携带的 premaster key
进行解密。
至此, 客户端和服务器已经共享了一个相同的 premaster key
。 Key 交换就此完成。
为什么不安全?
因为它不是完全正向保密(Perfect forward secrecy). 参考: https://en.wikipedia.org/wiki/Forward_secrecy
ClientKeyExchange 示例
Transport Layer Security
TLSv1.2 Record Layer: Handshake Protocol: Client Key Exchange
Content Type: Handshake (22)
Version: TLS 1.2 (0x0303)
Length: 134
Handshake Protocol: Client Key Exchange
Handshake Type: Client Key Exchange (16)
Length: 130
RSA Encrypted PreMaster Secret
Encrypted PreMaster length: 128
Encrypted PreMaster: 56dda7828..a4987ff…
Leave a Reply