SSL证书的工作原理
Secure Socket Layer(SSL)是一种在两台机器之间提供安全通道的协议,具有保护传输数据及识别通信机器的功能。SSL提供的安全通道是透明的,意思是它不变更两台机器之间传输的数据,保证数据经过加密后,一端写入的数据与另一端读取到的内容是完全一致的。本文通过阐述SSL协议在握手过程中的交互,使用户了解SSL证书的工作原理。
SSL握手过程
在SSL握手阶段,客户端和服务器间的交互过程图如下所示:
上述过程图一共可分为六个阶段,每个阶段的具体工作是:
1.客户端发起请求
客户端以明文传输发起请求。请求信息包含版本信息、加密套件候选列表、压缩算法候选列表、随机数、扩展字段等。具体细节如下:
- 支持的TSL协议版本:从低到高依次是SSLv2、SSLv3、TLSv1、TLSv1.1和TLSv1.2。
- 支持的加密套件: 每个加密套件对应前面TLS原理中的四个功能的组合,包含认证算法 Au (身份验证)、密钥交换算法 KeyExchange(密钥协商)、对称加密算法 Enc (信息加密)和信息摘要算法MAC(完整性校验)。
- 支持的压缩算法:用于后续信息的压缩传输。
- 随机数:用于后续的密钥的生成。
- 扩展字段:支持协议与算法的相关参数以及其它辅助信息等,常见的Server Name Indication(SNI)就属于扩展字段。
2.服务端响应请求
- 服务端返回协商的信息结果,包括选择使用的协议版本(version)、选择的加密套件(cipher suite)、选择的压缩算法(compression method)、随机数(random_S)等,其中,随机数用于后续的密钥协商。
- 服务器端配置对应的证书链,来验证身份与交换密钥。
- 通知客户端信息发送结束。
3.客户端校验证书
客户端验证证书的合法性,如果验证通过,则进行下一步通信。否则,根据错误情况做出响应的提示或操作。合法性验证的内容如下:
- 证书链的可信性:方法如前文所述。
- 证书是否吊销:离线 CRL(证书吊销列表)与在线 OCSP(在线证书列表)两类方式校验,不同的客户端行为会不同。
- 有效期:证书是否在有效时间范围。
- 域名:核查证书域名是否与当前的访问域名匹配,匹配规则后续分析。
4.客户端密钥交换
- 客户端密钥交换:合法性验证通过之后,客户端计算产生随机数字Pre-master,并用证书公钥加密,发送给服务器。此时,客户端已经获取全部的计算协商密钥需要的信息,即两个明文随机数(random_C和random_S) 以及自己计算产生的Pre-master,计算得到协商密钥enc_key=Fuc(random_C, random_S, Pre-Master)。
- 更改密码规范:客户端通知服务器后续的通信都采用协商的通信密钥和加密算法进行加密通信。
- 加密的握手消息:结合之前所有通信参数的hash值与其它相关信息生成一段数据,采用协商密钥session secret与算法进行加密,然后发送给服务器用于数据与握手验证。
5.服务端改变密码规范
- 验证数据和密钥:收到被加密的数据后,用私钥解密,基于之前交换的两个明文随机数(random_C 和random_S),计算得到协商密钥enc_key=Fuc(random_C, random_S, Pre-Master)。通过计算之前所有接收信息的hash值,解密客户端发送的加密握手消息,验证数据和密钥正确性。
- 改变密码规范:验证通过之后,服务器同样发送改变后的密码规范以告知客户端后续的通信都采用协商的密钥与算法进行加密通信。
- 加密的握手消息:服务器结合所有当前的通信参数信息,生成一段数据,并采用协商密钥加密会话与算法加密并发送到客户端;
6.握手结束
客户端计算所有接收信息的哈希值,并采用协商好的密钥解密,验证服务器发送的数据和密钥,验证通过则握手完成。开始使用协商密钥与算法进行加密通信。
握手协议的作用
简单概述,SSL握手过程也是SSL证书作用的实现。如:
- 用户和服务器的合法性认证,对应握手协议中的第三阶段
- 加密数据来隐藏被传送的数据,对应握手协议中的第四就和第五阶段
- 保护数据的完整性,对应握手协议中的第六阶段。
- 有效防止被“冒牌”网站钓鱼。下图为安装了SSL证书后的网站效果:
更多有关SSL证书作用的信息,参阅SSL证书有什么用。
更多信息
公钥和私钥
公钥(Public Key)与私钥(Private Key)就是俗称的不对称加密方式。它们是通过一种算法得到的一个密钥对,公钥是密钥对中公开的部分,常用于加密会话密钥、验证数字签名,或加密可以用相应的私钥解密的数据。私钥则是非公开的部分,需自行保管。
通过这种算法得到的密钥对,能保证在世界范围内是唯一的。使用这个密钥对时,如果用其中一个密钥加密一段数据,则必须用另一个密钥才能解密。比如:用公钥加密的数据就必须用对应的私钥才能解密,否则将无法成功解密。反之亦然。