HTTPS-知识点整理

2017-07-26  本文已影响0人  songsongJ

HTTPS

一、SSL/TLS协议运行机制的概述

握手阶段的详细过程

握手阶段所有的通讯都是明文的

(一) 第一阶段 客户端和服务器端安全信息的互相发送

1.1 客户端发出请求(ClientHello)

首先,客户端(通常是浏览器)先向服务器发出加密通信的请求,这被叫做ClientHello请求。
在这一步,客户端主要向服务器提供以下信息。
(1)客户端可以支持的SSL的最高版本号
(2)一个用于生成密钥的32字节的随机数
(3)一个确定会话的会话ID
(4)一个客户端可以支持的密码套件列表
(5)一个客户端可以支持的压缩算法列表

1.2 服务端回应 (serverHello)

服务器收到客户端请求后,向客户端发出回应,这叫做SeverHello。服务器的回应包含以下内容。
(1)SSL版本号,取客户端支持的最高版本号和服务器端支持的最高版本号中的较低者
(2)一个用于生成密钥的32字节的随机数
(3)会话ID
(4)从客户端的密码套件列表中选择的一个密码套件
(5)从客户端的压缩方法列表中选择的压缩方法

这个阶段之后,客户端服务端知道了下列内容:
(1)SSL版本
(2)密钥交换算法(也就是,非对称加密算法)、信息验证算法(也就是,HASH算法)和加密算法(也就是,对称加密算法)
(3)压缩方法
(4)有关密钥生成的两个随机数

握手阶段所有的通讯都是明文的

(二) 第二阶段 服务器推送证书到客户端进行密钥交换与客户端证书鉴别

(a)证书:服务器将数字证书和到根CA的整个证书链发给客户端,使客户端能够认证服务器
(b)服务器密钥交换(可选):这里视密钥交换算法而定
(c)证书请求:服务器可能要求客户端发送客户端证书
(d)服务器握手完成:第二阶段结束,第三阶段开始
上图中省略了:客户端利用服务器传过来的信息验证服务器的合法性,服务器的合法性包括:证书是否过期,发行服务器证书的 CA 是否可靠,发行者证书的公钥能否正确解开服务器证书的“发行者的数字签名”,服务器证书上的域名是否和服务器的实际域名相匹配。如果合法性验证没有通过,通讯将断开;如果合法性验证通过,通讯将继续。

(三) 第三阶段 客户端推送证书密钥到服务器端

客户端收到服务器回应以后,首先验证服务器证书。如果证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信。

与上一步类似,上一步是服务器端向客户端推送证书,客户端已经信任了服务器端,但是服务器端还要验证客户端,这一步的操作完成后,双向的SSL就完成了。

如果证书没有问题,客户端就会从证书中取出服务器的公钥
(a)证书(可选):为了向服务器证明自身,客户端要发送客户端证书
(b)预备主密钥(Pre-master-secret):客户端生成预备主密钥,并将其发送给服务端,注意这里会使用服务端的公钥进行加密
(c)证书验证(可选):对预备主密钥和随机数进行签名,证明客户端拥有(a)证书的公钥
至此,服务器端和客户端各有一把私钥和公钥,私钥都是自己的,公钥都是对方的。
上面第一项的随机数,是整个握手阶段出现的第三个随机数,又称"pre-master key"。有了它以后,客户端和服务器就同时有了三个随机数,接着双方就用事先商定的加密方法,各自生成本次会话所用的同一把"会话密钥"。

(四) 第四阶段 服务器确认,SSL通讯建立,定期修改密码规范

服务器收到客户端的第三个随机数pre-master key之后,计算生成本次会话所用的"会话密钥"。然后,向客户端最后发送下面信息
(1)编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
(2)服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供客户端校验。

但是,每一次后期的传输,也可以通过设置实现:不使用同一个密码,而是像上图中最后一步一样,将摘要散列值和密码定期更换。
至此,SSL通道就建立成功了。

二、HTTPS中的密码学

2.1 概念

HTTPS 在证书的数字签名中使用了哈希算法和非对称加密算法,在加密通信的过程中使用了对称加密算法,为了防止传输的数据被篡改和重放还使用了 MAC(消息认证码)等。

名称 密钥交换 验证算法 加密算法 散列算法
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 ECDH RSA AES_256_GCM 256 SHA384
TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 DH RSA AES_256_CBC 256 SHA384
TLS_RSA_WITH_AES_256_GCM_SHA384 RSA RSA AES_256_GCM 256 SHA384
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA ECDH ECDSA AES_256_CBC 256 SHA

2.2 关于证书

三、Keyless服务

1.SSL协议的握手过程

SSL协议握手过程

2.私钥的作用

握手阶段有三点需要注意。
(1)生成对话密钥一共需要三个随机数。
(2)握手之后的对话使用"对话密钥"加密(对称加密),服务器的公钥和私钥只用于加密和解密"对话密钥"(非对称加密),无其他作用。
(3)服务器公钥放在服务器的数字证书之中。
从上面第二点可知,整个对话过程中(握手阶段和其后的对话),服务器的公钥和私钥只需要用到一次。这就是CloudFlare能够提供Keyless服务的根本原因。
某些客户(比如银行)想要使用外部CDN,加快自家网站的访问速度,但是出于安全考虑,不能把私钥交给CDN服务商。这时,完全可以把私钥留在自家服务器,只用来解密对话密钥,其他步骤都让CDN服务商去完成。

with keyless

3.session恢复

握手阶段用来建立SSL连接。如果出于某种原因,对话中断,就需要重新握手。
这时有两种方法可以恢复原来的session:一种叫做session ID,另一种叫做session ticket。
session ID的思想很简单,就是每一次对话都有一个编号(session ID)。如果对话中断,下次重连的时候,只要客户端给出这个编号,且服务器有这个编号的记录,双方就可以重新使用已有的"对话密钥",而不必重新生成一把。


session ID

上图中,客户端给出session ID,服务器确认该编号存在,双方就不再进行握手阶段剩余的步骤,而直接用已有的对话密钥进行加密通信。
session ID是目前所有浏览器都支持的方法,但是它的缺点在于session ID往往只保留在一台服务器上。所以,如果客户端的请求发到另一台服务器,就无法恢复对话。session ticket就是为了解决这个问题而诞生的,目前只有Firefox和Chrome浏览器支持。

session ticket

上图中,客户端不再发送session ID,而是发送一个服务器在上一次对话中发送过来的session ticket。这个session ticket是加密的,只有服务器才能解密,其中包括本次对话的主要信息,比如对话密钥和加密方法。当服务器收到session ticket以后,解密后就不必重新生成对话密钥了。

四 参考链接

图解SSL/TLS协议
HTTPS和Nginx的HTTPS配置

上一篇 下一篇

猜你喜欢

热点阅读