安全连接的建立
在 TLS 握手过程中,客户端和服务器一同执行以下操作:
- 指定将要使用的 TLS 版本(TLS 1.0、1.2、1.3 等)
- 决定将要使用哪些密码套件
- 通过服务器的公钥和 SSL 证书颁发机构的数字签名来验证服务器的身份
- 生成会话密钥,以在握手完成后使用对称加密
TLS 握手步骤
- 浏览器向服务器发送消息(client hello),消息包含
- TLS 版本
- 支持的密码套件
- 临时值 ra(客户端随机数 client random)
- 服务端回复消息(server hello),消息包含
- 数字证书
- 服务器选择的密码套件
- 临时值 rb(服务器随机数 server random)
- 服务器发送结束信号
- 客户端验证服务器的数字证书(具体见下文数字证书、数字签名部分)
- 客户端再发送一串随机字节(预设主密钥 premaster secret),预设主密钥是使用数字证书里的公钥进行加密
- 服务器收到加密后的预设主密钥(premaster secret)后,用私钥进行解密
- 这个时候浏览器、服务器都具有 ra+rb+预设主密钥,据此计算出最终的会话密钥,这个密钥不在传输
- 浏览器通知服务器双方用新的密钥进行通信
- 浏览器发送结束信号
- 服务器回复确认更改密钥
- 服务器发送结束信号
数字证书(digital certificate)
证书认证机构(Certificate Authority, 简称 CA)将公钥合并到数字证书中,然后服务器会把公钥连同证书一起发送给客户端,私钥则由服务器自己保存以确保安全。
数字证书一般包含以下内容:
- 公钥
- 持有者信息
- 证书认证机构(CA)的信息
- CA 对这份文件的数字签名及使用的算法
- 证书有效期
- ...
数字签名(digital signature)
如何生成
- 首先 CA 会把持有者的公钥、用途、颁发者、有效时间等信息打成一个包,然后对这些信息进行 Hash 计算,得到一个 Hash 值
- 然后 CA 会使用自己的私钥将该 Hash 值加密,生成证书签名(Certificate Signature),也就是 CA 对证书做了签名
- 最后将证书签名(Certificate Signature)添加在文件证书上,形成数字证书
如何验证
- 首先客户端会使用同样的 Hash 算法获取该证书的 Hash 值 H1
- 通常浏览器和操作系统中集成了 CA 的公钥信息,浏览器收到证书后可以使用 CA 的公钥解密证书签名(Certificate Signature) 内容,得到一个 Hash 值 H2
- 最后比较 H1 和 H2,如果值相同,则为可信赖的证书,否则则认为证书不可信
密码规范和密码组合
- 握手期间所使用的的密钥交换和认证算法(最常用的是 RSA 算法)
- 加密算法(用于握手完成后的对称加密,常用的有 AES、3DES 等)
- 信息摘要算法(常用的有 SHA-256、SHA-1 和 MD5 等)