Https
简介
http协议是明文协议,明文数据会经过中间代理服务器,路由器,wifi,运营商等物理节点,传输内容存在被劫持的风险,劫持者还可以通过篡改传输信息发动中间人攻击。
https(HyperText Transfer Protocol over Secure Socket Layer)基于http增加了加密的机制。一般理解为HTTP+SSL/TLS,通过 SSL证书来验证服务器的身份,并为浏览器和服务器之间的通信进行加密。
SSL(Secure Socket Layer)是1994年 Netscape 所研发的一种安全协议,SSL 协议位于 TCP/IP 协议与各种应用层协议之间,为数据通讯提供安全支持。基于 SSL,Netscape开发了TLS(Transport Layer Security)的最初几个版本(SSL 1.0、SSL 2.0、SSL 3.0),1999年TSL 3.1 开始被 IETF 标准化并改名,发展至今已经有 TLS 1.0、TLS 1.1、TLS 1.2 三个版本。SSL3.0和TLS1.0由于存在安全漏洞,已经很少被使用到。TLS 1.3 改动比较大,还在草案阶段,目前使用最广泛的是TLS 1.1、TLS 1.2。
原理
Https通信过程中使用的到的主要技术有对称加密,非对称加密,数字证书等。
非对称加密
非对称加密一组密钥分为公钥和私钥,公钥加密的数据用私钥解谜,反之,私钥加密的数据使用公钥解密。
非对称加密的效率较低,所以https协议会在建立网络连接的时候产生随机的对称密钥,之后通过网站的公钥加密发给网站服务端,之后双方就可以通过这个约定的密钥进行对称加密
对称加密
对称加密需要信息传输双方持有一个相同的保密的密钥。通过密钥加密的数据可以在另外一侧使用相同的密钥进行解密。
数字证书
数字证书其实是一种身份验真的手段,即使有了加密机制,但是通信的对端的身份需要一种验证机制,网站一般通过认证的CA机构申请颁发一份数字证书,数字证书里包含有证书持有者、证书有效期、公钥等信息,服务端将证书发送给客户端,客户端通过验证这份证书真伪确认网站的真实身份。
证书的验证机制是通过验签机制实现:
- CA机构在颁发证书时对证书明文信息进行哈希再利用CA机构的私钥进行加签生成数字签名
- Https网站将数字签名连同明文信息发给客户端
- 客户端使用CA结构的公钥对数字签名解密,同时使用证书中的Hash算法对证书明文数据进行Hash操作,比较解密数据和Hash数据是否相等就可以确定证书的有效性。
CA机构属于公信方,所以系统或浏览器中会内置的CA机构的证书和公钥。CA机构的证书也构成一条信任链,A信任B,B信任C,最终依赖根CA结构的公信力来实现该信任链条。
部分网站会要求使用者下载安装网站的根证书,原因就是这个网站的证书不能和系统内置的CA机构/根证书之间形成一条信任链,所以需要用户自行授权信任。
实现
通信过程
Https主要是通过SSL/TLS实现加密机制的,本文描述的过程也就是TLS的通信过程。
TLS的通信过程主要分为三个阶段,协商阶段,确定密钥,通信阶段等。
协商阶段主要是通过数字证书确定通信双方的身份,确定SSL/TLS版本以及加密算法。主要流程如下:
- 客户端发送支持的SSL/TLS协议版本、加密算法集合、压缩算法集合等信息给服务端。
- 服务端根据客户端发送的信息选定SSL/TLS版本、加密算法,压缩算法等,返回给客户端。
- 服务端发送证书给客户端,如果是双向验证,服务端同时向客户端请求证书。
- 服务端通知客户端协商结束,不需要等待客户端证书。
确定密钥
确定密钥是双方通过互信私密的协商,生成密钥的过程。
- 客户端使用服务器端公钥,对客户端公钥和密钥种子进行加密,再发送给服务器端。如果是双向验证,客户端用本地私钥生成数字签名,并发送给服务器端,让其通过收到的客户端公钥进行身份验证。
- 通信双方基于密钥种子等信息生成通讯密钥。
- 客户端通知服务器端已将通讯方式切换到加密模式。
- 服务器端通知客户端已将通讯方式切换到加密模式。
通信阶段
通信阶段客户端和服务端基于之前确定的密钥进行通信。