安全SSL/TLS连接的建立是SSH握手的过程。在所有以https://开头的网站中都会执行这个过程。
首先,客户端(通常是服务器)先向服务器发出加密通信的请求,这个过程叫做Client Hello请求。
在这一步客户端主要提供了一下信息。
(1) 支持的协议版本,比如TLS 1.2版。
(2) 一个客户端生成的随机数,稍后用于生成"会话密钥"。
(3) 支持的加密方法,这里通常是一组加密套件(Cipher Suites)。
(4) 支持的压缩方法。
加密套件通常包含以下信息:
Cipher Suite | Key Exchange | Cipher | Mac |
---|---|---|---|
TLS_RSA_WITH_3DES_EDE_CBC_SHA | RSA | 3DES_EDE_CBC | SHA |
TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 | DHE_RSA | AES_128_CBC | SHA256 |
这里需要注意的是,客户端发送的信息之中不包括服务器的域名。也就是说,理论上服务器只能包含一个网站,否则会分不清应该向客户端提供哪一个网站的数字证书。这就是为什么通常一台服务器只能有一张数字证书的原因。
对于虚拟主机的用户来说,这当然很不方便。2006年,TLS协议加入了一个Server Name Indication扩展,允许客户端向服务器提供它所请求的域名。
服务器收到客户端请求后,向客户端发出响应,这个过程叫做Server Hello。服务器响应包含以下内容。
(1) 确认使用的加密通信协议版本,比如TLS 1.2版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。
(2) 一个服务器生成的随机数,稍后用于生成"会话密钥"。
(3) 确认使用的加密方法,示例中返回的加密套件是 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,这个密码套件的意思是使用ECDHE_RSA算法进行密钥交换、使用AES_128算法进行对称加密、使用SHA256算法计算摘要。
Server Certificate: 服务器发送自己的证书给客户端。
Server Key Exchange: 该消息是否发送取决于服务器选定的密钥交换算法,如果密钥交换算法是DHE_DSS、DHE_RSA或DH_anon时需要发送该消息。
The ServerKeyExchange message is sent by the server only when the server Certificate message (if sent) does not contain enough data to allow the client to exchange a premaster secret. This is true for the following key exchange methods:
除了上面这些信息,如果服务器需要确认客户端的身份,就会再包含一项请求,要求客户端提供"客户端证书"。比如,金融机构往往只允许认证客户连入自己的网络,就会向正式客户提供USB密钥,里面就包含了一张客户端证书。
Server Hello Done: Server Hello消息发送结束。
客户端收到服务器响应后,如果服务器要求客户端上传证书,客户端发送自己的证书给服务器。
如果密钥交换算法是DHE_DSS、DHE_RSA或DH_anon,客户端发送自己的公钥给服务器。客户端和服务器各自依据DH参数生成premaster secret 和 master secret。
客户端验证服务器证书。如果证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信。
发送编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供服务器校验。
编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供客户端校验。
至此,整个握手阶段全部结束。接下来,客户端与服务器进入加密通信,就完全是使用普通的HTTP协议,只不过用"会话密钥"加密内容。
The Transport Layer Security (TLS) Protocol Version 1.2
Https传输中加密和密钥交换涉及到的算法总结与介绍
SSL/TLS协议运行机制的概述
图解SSL/TLS协议
SSL Handshake Explained
SSL协议详解(可参考会话恢复部分)
The TLS Handshake Protocol involves the following steps:
Exchange hello messages to agree on algorithms, exchange random
values, and check for session resumption.
Exchange the necessary cryptographic parameters to allow the
client and server to agree on a premaster secret.
Exchange certificates and cryptographic information to allow the
client and server to authenticate themselves.
Generate a master secret from the premaster secret and exchanged
random values.
Provide security parameters to the record layer.
Allow the client and server to verify that their peer has
calculated the same security parameters and that the handshake
occurred without tampering by an attacker.