还得从HTTP和HTTPS的区别说起。HTTP 使用 TCP 三次握手建立连接,客户端和服务器需要交换 3 个包,而 HTTPS除了 TCP 的三个包,还要加上 ssl 握手所以慢一点。 问题来了,SSL是怎么握手的? 一图胜千言:
ClientHello 阶段 这一步中,客户端向浏览器发出加密通信请求。并向服务器提供: 支持的协议版本,比如TLS 1.0版。一个客户端生成的随机数session ticket1,稍后用于生成"对话密钥"。支持的加密方法,比如RSA公钥加密。支持的压缩方法。 ServerHello 阶段 服务器回应: 确认使用的加密通信协议版本,比如TLS 1.0版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。一个服务器生成的随机数session ticket2,稍后用于生成"对话密钥"。确认使用的加密方法,比如RSA公钥加密。服务器证书。 CipherSpec 阶段 客户端收到服务器返回的证书后, 会验证证书有效性. 验证步骤大概如下: 验证证书有效期(起止时间)验证证书域名(与浏览器地址栏中域名是否匹配)验证证书吊销状态(CRL+OCSP)验证证书颁发机构, 如果颁发机构是中间证书, 在验证中间证书的有效期/颁发机构/吊销状态. 一直验证到最后一层证书, 如果最后一层证书是在操作系统或浏览器内置, 那么就是可信的, 否则就是自签名.以上验证步骤, 需要全部通过,否则就会显示警告。
如果上述验证没有问题,客户端会取出CA中的公钥,然后向服务器发送随机的预主密钥(pre-master key)(session ticket3),对于RSA密钥交换算法来说三个随机的session ticket通过一个密钥导出器可以得到一个对称密钥 session key。
内容传输阶段 非对称加密非常消耗 CPU,所以只有在协商秘钥时候使用非对称加密, 而应用层数据交换就用协商成功的秘钥作为私钥对称加密传输(服务器响应的加密返回, 客户端提交的也加密提交).