暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

HTTPS协议运行机制说明

红牛编程 2016-12-18
763


1, hello https

“HTTPS时代要到来了”, 这是最近互联网上最风靡的了. 确实如此, 随着互联网巨头(百度,苹果)不断向HTTPS阵营转移, HTTPS在web应用中, 越来越重要. 本文就是是为大家了解HTTPS是怎么一回事而行文的.
web互联网上需要安全通讯, 就需要使用https协议.
https协议, 可以理解为http的安全版, 是构建与SSL/TLS之上的Http. 全称为: Hyper Text Transfer Protocol over Secure Socket Layer. 通过使用加密传播, 摘要校验以及身份证书来解决http明文传输时带来的被窃听(eavesdropping), 被篡改(tampering)以及被冒充(pretending)的典型三大风险的.
SSL/TLS, 就是安全传输的基础.

  • SSL: Secure Socket Layer. 安全套接层

  • TLS: Transport Layer Security. 安全传输层协议
    TLS是SSL的升级版. 目前市场上广泛使用的为SSL3.0版本和TLS1.0版本.
    下面就看看SSL/TLS是怎么一回事.

2, SSL/TLS思路

基本过程

  • 首先握手(handshake)通过客户端于服务器端协商, 获取会话密钥.

  • 其次客户端于服务器端的通讯采用会话密钥进行加密传输.

会话密钥: session key, 就是传输数据时所使用的对称加密算法的密钥. 该会话密钥在客户端与服务器端每次会话中仅仅需要生成一次.
握手阶段, 是为了获取会话密钥. 但是会话密钥, 在生成和传输时, 使用了公钥私钥非对称加密算法, 进行加密传输. 而为了使客户端相信服务器提供的公钥, 需要将公钥放在第三方证书中(CA).


这样设计的目的是:
1.公钥私钥非对称加密算法, 每次计算的时间过长, 如果全部传输数据都采用该公私钥算法, 时间成本过大. 而利用公钥仅仅加密会话密钥, 再使用会话密钥加密传输数据, 这样效率和安全性都可以兼顾. 就是SSL/TLS的方案.
2.客户端从服务器端提供的证书中获取公钥, 只要认证了证书, 那么公钥就是可靠的.

以上就是HTTPS的思路. 下面就详细说一下这个核心的握手过程.

3, SSL/TLS握手流程

如图所示


流程描述如下, 经过客户端于服务器端的4次传输, 则握手完成

3.1, 第一次: 客户端向服务器端发送握手请求, 称之为client-hello

客户端需要在发出请求时, 携带下面的数据:

  • SSL协议及版本

  • 加密算法

  • 客户端随机数(用于生成会话密钥)

  • 其他信息

3.2, 第二次: 服务器端向客户端回应, 成为server-hello

服务器端, 接收到客户端请求后, 先确认SSL/TLS版本. 如果支持, 则向客户端发送如下数据:

  • SSL协议及版本

  • 服务器端随机数(用于生成会话密钥)

  • 加密算法

  • 服务器证书,包含公钥

  • [要求客户端证书]可选的

其中要求客户端证书是可选的, 在服务器需要确认客户端身份时需要. 典型的情况就是大家使用网银时, 使用的U盾, 典型的内容就是客户端证书.

3.3, 第三次: 客户端确认握手

客户端接收到服务器端响应后, 验证服务器证书的合法性. 包括:证书是否过期,发行服务器证书的CA 是否可靠,发行者证书的公钥能否正确解开服务器证书的“发行者的数字签名”,服务器证书上的域名是否和服务器的实际域名相匹配.
合法后, 说明此服务器端值得信任.
确认服务器端后, 客户端再次生成一个随机数(共第三个了)用于生成会话密钥, 并使用从服务器证书中获取的公钥, 对该随机数进行加密, 在向服务器发出请求时, 传递给服务器端. 该加密后的随机数称之为 pre-master-key预主密码.
此时客户端, 就可以使用约定的会话密钥生成算法, 依据生成的三个随机数来生成后边数据传输使用的会话密钥了.

此时, 客户端向服务器端再次发送请求, 携带如下内容:

  • Pre-master-key(预主密码)

  • 编码加密改变通知

  • [客户端证书]取决于上一步, 服务器端是否有要求

  • 客户端握手结束既签名

其中, 签名是为了校验数据不被中途篡改的.

3.4, 第四步: 服务器端确认握手

服务器端接收到请求后, 如果要求客户端证书, 则先校验证书的合法型.
校验通过后, 利用拥有的私钥, 解密传递过来的预主密码, 获取第三个随机数.
通过第三个随机数, 形成会话密钥. 与客户端的算法一致, 三个随机数一致, 因此形成的会话密钥也是一致的.

完毕后, 响应给客户端, 携带下面的数据:

  • 编码加密改变通知

  • 服务器端握手结束既签名

3.5, 握手完毕.

至此:
客户端, 服务器端相互信任
客户端, 服务器端拥有相同的会话密钥, 一次连接会话, 仅需要一个会话密钥.

额外的, 使用三个随机数作为会话密钥的生成依据, 主要是为了保证随机数的强随机性. 因为生成随机数的算法, 不能保证是完全随机的, 三个在一起, 随机性增强.

4, 会话密钥加密传输

握手完成确定会话密钥后, 之后的的传输就是基于会话密钥安全传输.
就相当于将原来的HTTP协议传输的内容, 加密后再传输!

5, 结语

一家之言, 欢迎拍砖讨论.
如果方便, 多谢转载!

还要继续讨论的:

  • 如何搭建HTTPS服务器?

  • 站点如何Https化?

  • CA证书是什么, 如何获取?

  • 加密算法是什么?


文章转载自红牛编程,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论