HTTPS是为了让数据在传输的时候更加安全
HTTPS 协议(HyperText Transfer Protocol over Secure Socket Layer):一般理解为
HTTP
+SSL/TLS
,通过 SSL 证书来验证服务器的身份,并为浏览器和服务器之间的通信进行加密。HTTPS 是一种通过计算机网络进行安全通信的传输协议,经由 HTTP 进行通信,利用
SSL/TLS
建立全信道,加密数据包。HTTPS 使用的主要目的是提供对网站服务器的身份认证,同时保护交换数据的隐私与完整性。
一、在HTTP协议栈中引入安全层
HTTP数据提交给TCP层之后,用户会经过用户电脑、WiFi路由器、运营商和目标服务器,在这中间的每个环节中,数据都有可能被窃取或篡改。比如用户电脑被黑客安装了恶意软件,那么恶意软件就能抓取和篡改所发出的HTTP请求的内容。或者用户一不小心连接上了WiFi钓鱼路由器,那么数据也有可能被黑客抓取或篡改
从HTTP协议栈层面来看,我们可以在TCP和HTTP之间插入一个安全层,所有经过安全层的数据都会被加密或者解密。
HTTPS中,HTTP先和安全层进行通信,然后安全层再和TCP层通信。也就是说HTTPS所有的安全核心都在安全层。安全层既不影响上层也不会影响下层。搞清楚HTTPS,就是要搞清楚安全层。
安全层有两个职责
- 对发起HTTP请求的数据进行加密操作
- 对接收到HTTP的内容进行解密操作
二、HTTPS版本演进过程
总的来说HTTPS版本有四个:对称加密、非对称加密、对称加密非对称加密混合使用、在混合方式的基础上添加数字证书
屏蔽掉HTTP的其他东西,下面只讨论安全层做了什么。
1、对称加密
第一版的HTTPS使用的是对称加密
对称加密就是指加密和解密都是用的同一把密钥
① 使用对称加密建立安全连接
使用对称加密时建立安全连接的过程(指的是服务器和浏览器之间协商加密方式和密钥.)
- 浏览器发送它所支持的加密套件列表和一个随机数 client-random,这里的加密套件是指加密的方法,加密套件列表就是指浏览器能支持多少种加密方法列表。
- 服务器会从加密套件列表中选取一个加密套件,然后还会生成一个随机数 service-random,并将 service-random 和加密套件返回给浏览器。
- 最后浏览器和服务器分别返回确认消息。
这样浏览器端和服务器端都有相同的 client-random 和 service-random 了.收发双方会利用这两个random生成密钥.安全连接建立完成,可以利用密钥传输数据了.
② 优缺点
使用对称加密的安全连接有一个优点和一个缺点
- 拥有密钥的双方都可以发送加密的数据,对方都可以正确解密.
- 但是client-random和service-random是明文传输的,黑客可以获取到并利用它们来合成密钥,这样黑客也可以解密数据.
2、非对称加密
第二版的HTTPS使用的是非对称加密
非对称加密就是有A、B两把密钥。如果你用A来加密,就只能利用B来解密;如果你用B来加密,就只能利用A来解密。
① 使用非对称加密建立安全连接
使用非对称加密时建立安全连接的过程
- 浏览器发送加密套件列表给服务器
- 服务器选择一个加密套件,服务器返回这个加密套件和公钥给浏览器
- 浏览器和服务器返回确认消息
② 优缺点
使用非对称加密建立的安全连接有一个优点和两个缺点
- 浏览器端发送数据时可以使用公钥加密,只有拥有私钥的服务端可以解密.实现了浏览器端到服务器端发送数据时的安全.
- 服务器向浏览器发送的数据不能加密.
- 非对称加密的加解密效率低,影响用户打开页面的速度.
3、对称加密和非对称加密搭配使用
第三版的HTTPS使用的是非对称加密搭配使用
在传输阶段使用对称加密,对称加密的密钥采用非对称加密来传输
① 使用对称加密和非对称加密搭配建立安全连接
使用对称加密和非对称加密搭配建立安全连接的过程
- 首先浏览器向服务器发送对称加密套件列表、随机数 client-random和非对称加密套件列表
- 服务器保存随机数 client-random,选择对称加密和非对称加密的套件,然后生成随机数 service-random,向浏览器发送选择的加密套件、service-random 和公钥;
- 浏览器保存公钥,并生成随机数 pre-master,然后利用公钥对 pre-master 加密,并向服务器发送加密后的数据;
- 最后服务器拿出自己的私钥,解密出 pre-master 数据,并返回确认消息。
就是说浏览器先得到非对称加密中的私钥,加密随机数pre-master发送给服务端,这样双方都有pre-master.然后双方都使用client-random,service-random和pre-master生成密钥.黑客获取不到pre-master而得不到密钥.
4、现在的HTTPS
黑客可以通过DNS劫持将IP地址替换成了黑客的IP地址,这样就访问的是黑客的服务器了。解决的办法就是向服务端添加数字证书(在对称加密和非对称加密搭配使用的基础上).
CA(Certificate Authority):数字证书认证机构
Digital Certificate:数字证书
服务端的数字证书有两个作用:第一向浏览器证明自己的身份;第二数字证书包含服务器公钥.
① 现在的HTTPS如何建立安全连接
假设服务端已经向CA申请到了数字证书,看现在的HTTPS是如何建立安全连接的.
- 服务器没有直接返回公钥给浏览器,而是返回了数字证书,而公钥是包含在数字证书中的;
- 在浏览器端多了一个证书验证的操作,验证了证书之后,才继续后续流程。
即
- 首先浏览器向服务器发送对称加密套件列表、随机数 client-random和非对称加密套件列表
- 服务器保存随机数 client-random,选择对称加密和非对称加密的套件,然后生成随机数 service-random,向浏览器发送选择的加密套件、service-random 和数字证书(包含公钥);
- 浏览器验证证书,保存证书中的公钥,并生成随机数 pre-master,然后利用公钥对 pre-master 加密,并向服务器发送加密后的数据;
- 最后服务器拿出自己的私钥,解密出 pre-master 数据,并返回确认消息。
② 服务器如何申请数字证书
理解申请数字证书的过程,才能理解浏览器如何验证数字证书
申请两个数字证书
- 服务器填写一张表单,包含自己公钥、站点资料、公司资料等信息,提交给CA机构.
- CA机构审核通过
- 然后CA机构会生成两个数字证书.第一个是服务器的数字证书,包含了服务器发来的公钥、服务器方的基础信息和CA数字签名;第二个是CA的数字证书包含了自己的公钥(用来解密数字签名)、CA的基础信息、数字签名。这两个证书会一并发回给服务器。
服务器数字证书申请过程
- 首先CA机构根据服务器发来的表单数据的重要信息进行哈希计算,生成信息摘要,然后服务器根据消息摘要使用私钥加密信息摘要,生成数字签名(这个数字签名由CA数字证书中的公钥解密)。然后生成的数字证书的内容包括三部分:服务器的信息、服务器的公钥、数字签名。
③ 浏览器如何验证服务器数字证书合法性
浏览器拿到数字证书后要做三件事情:证书的有效期、证书是否被 CA 吊销、证书是否是对应的 CA 机构颁发的。主要是第三步.
验证服务器证书是否是合法的CA机构颁发
- 首先利用证书的原始信息进行哈希计算,得到信息摘要A.
- 然后利用CA的公钥解密数字签名,又得到一个信息摘要B.
- 最后判断A、B是是否相等,相等则证明合法服务器数字证书合法。
④ 验证CA机构的合法性
验证了服务器数字证书的合法性,但不能验证CA机构和它颁发的证书的合法性。
数字证书链
- 一般颁发给服务器证书的CA浏览器不会直接信任,被称为中间CA.
- 操作系统会内置一些信任的CA机构的数字证书,称为根CA。根证书是通过WebTrust认证的.所以是值得信任的.
- 验证中间CA的合法性,会找上一级中间CA,直到追溯到浏览器内置的那一个根CA.
- 只有数字证书链上所有的CA都受信任才会完成数字证书认证.
三、总结
1、HTTP和HTTPS的区别
- HTTP 的 URL 以
http://
开头,而 HTTPS 的 URL 以https://
开头。 - HTTP 标准端口是 80,而 HTTPS 的标准端口是 443。
- HTTPS 需要到 CA 申请证书,一般免费证书较少,因而需要一定费用
- HTTP 建立连接的耗时=TCP 握手,而 HTTPS 耗时=TCP 握手+SSL 握手。
- HTTPS 的连接很简单,是无状态的;HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全。
- HTTP 是明文传输的,而 HTTPS 是加密传输的。
2、HTTPS加密算法
① 对称加密
服务器和客户端共用同一把密钥来加密解密.
- 浏览器发送它所支持的加密套件列表和一个随机数 client-random,这里的加密套件是指加密的方法,加密套件列表就是指浏览器能支持多少种加密方法列表。
- 服务器会从加密套件列表中选取一个加密套件,然后还会生成一个随机数 service-random,并将 service-random 和加密套件返回给浏览器。
- 最后浏览器和服务器分别返回确认消息。
② 非对称加密
服务器拥有私钥,把公钥发给客户端,只能实现客户端到服务端单方向的加密.
- 浏览器发送加密套件列表给服务器
- 服务器选择一个加密套件,服务器返回这个加密套件和公钥给浏览器
- 浏览器和服务器返回确认消息
③ 对称加密和非对称加密混合使用
对称加密和非对称加密混合使用的办法可以实现双方向的加密,但是解决不了DNS劫持问题.
- 首先浏览器向服务器发送对称加密套件列表、随机数 client-random和非对称加密套件列表
- 服务器保存随机数 client-random,选择对称加密和非对称加密的套件,然后生成随机数 service-random,向浏览器发送选择的加密套件、service-random 和公钥;
- 浏览器保存公钥,并生成随机数 pre-master,然后利用公钥对 pre-master 加密,并向服务器发送加密后的数据;
- 最后服务器拿出自己的私钥,解密出 pre-master 数据,并返回确认消息。
④ 加入CA证书
服务端需要向CA申请数字证书,客户端验证了这个数字证书之后才会走与服务端建立连接的过程.
- 服务器没有直接返回公钥给浏览器,而是返回了数字证书,而公钥是包含在数字证书中的;
- 在浏览器端多了一个证书验证的操作,验证了证书之后,才继续后续流程。
即
- 首先浏览器向服务器发送对称加密套件列表、随机数 client-random和非对称加密套件列表
- 服务器保存随机数 client-random,选择对称加密和非对称加密的套件,然后生成随机数 service-random,向浏览器发送选择的加密套件、service-random 和数字证书(包含公钥);
- 浏览器验证证书,保存证书中的公钥,并生成随机数 pre-master,然后利用公钥对 pre-master 加密,并向服务器发送加密后的数据;
- 最后服务器拿出自己的私钥,解密出 pre-master 数据,并返回确认消息。
再就是验证数字证书的过程
- 首先利用证书的原始信息进行哈希计算,得到信息摘要A.
- 然后利用CA的公钥解密数字签名,又得到一个信息摘要B.
- 最后判断A、B是是否相等,相等则证明合法服务器数字证书合法.
证书合法之后还要判断颁发这个证书的CA是否合法,这就涉及到了数字证书链
- 一般颁发给服务器证书的CA浏览器不会直接信任,被称为中间CA.
- 操作系统会内置一些信任的CA机构的数字证书,称为根CA。根证书是通过WebTrust认证的.所以是值得信任的.
- 验证中间CA的合法性,会找上一级中间CA,直到追溯到浏览器内置的那一个根CA.
- 只有数字证书链上所有的CA都受信任才会完成最终的数字证书认证.