HTTPS 通信过程
与 SSL 组合使用的 HTTP 被称为 HTTPS 或 HTTP over SSL。HTTPS 用来解决 HTTP 不安全传输的问题,HTTP 之所以不安全,是因为:
1. 传输的内容都是明文,可能会被窃听;
2. 不会验证通信双方的身份;
3. 传输内容可能被篡改。
SSL 提供了加密、认证以及摘要的功能,使用 HTTPS 可以有效防止以上问题:
1. HTTPS 会对传输的内容进行加密,加密采用的是对称加密的方式,但对称加密的密钥使用了服务器证书进行了非对称加密;
2. HTTPS 可以在通信前查明对方的证书,从而确认对方的身份;
3. HTTPS 提供了证书验证功能,确保证书来自于目标服务器且未被篡改。
HTTPS 握手
握手过程如下:
客户端与服务器协商 SSL 的版本和加密组件(加密算法、密钥长度);
- 客户端发送 Client Hello 报文,报文中包含客户端支持的 SSL 版本及加密组件;
- 服务端返回 Server Hello 报文,报文中包含服务器支持的 SSL 版本及加密组件;
- Client Hello 和 Server Hello 报文中还分别包含客户端 random 和服务器 random(通信双方各自生成的随机数)。
服务端发送 Certificate 报文,报文中包含服务器证书,证书中又包含了服务器公钥;
- 客户端进行证书验证,验证通过后生成一个随机数 pre-master secret,并使用客户端 random、服务器 random 以及 pre-master secret 生成 master secret,master secret 为会话密钥,之后的数据传输使用会话密钥进行加密/解密。
- 服务端发送 Server Hello Done 报文,通知客户端最初阶段的 SSL 握手协商部分结束;
客户端发送 Client Key Exchange 报文进行回应,报文中包含使用了服务器公钥进行加密的 pre-master secret;
- 服务器收到报文后生成 master secret(生成方式与客户端相同)。
- 客户端发送 Change Cipher Spec 报文,提示服务器之后的通信采用 pre-master secret 密钥加密;
- 客户端发送 Finished 报文,该报文包含连接至今全部报文的整体校验值(采用 pre-master secret 加密),若服务器能够正确解密该报文,则此次握手协商成功;
- 服务器发送 Change Cipher Spec 报文;
- 服务器发送 Finished 报文;
- SSL 连接建立完成,客户端和服务端使用会话密钥(master secret)对通信的数据进行加密/解密。
证书验证
证书由受信任的第三方认证机构颁发,且多数浏览器系统已植入了认证机构的机构公钥。
证书(部分)内容包括:
1. 证书的有效时间、域名;
2. 服务器公钥;
3. 指纹算法(哈希算法,用来生成指纹,指纹是一个哈希值);
4. 数字签名(服务器私钥对指纹进行加密得到数字签名)。
证书颁发过程:
- 服务器向认证机构申请证书;
- 认证机构使用指纹算法对证书(部分)内容进行哈希运算得到指纹,并使用机构私钥对指纹进行加密得到数字签名,然后将该签名和服务器公钥存入证书,并向服务器颁发证书。
浏览器证书验证过程:
- 首先验证证书是否过期以及证书的域名是否与请求的域名相同,不相同则验证不通过;
- 获取证书的颁发机构,然后从浏览器系统中查询该机构的机构公钥;
- 使用机构公钥解密证书上的数字签名,得到一个哈希值 H1;
- 浏览器使用指纹算法对证书(部分)内容进行哈希运算,得到另一个哈希值 H2;
- 比较 H1 和 H2 是否相同,不相同说明证书被篡改过。
欢迎批评指正!!!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。