开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情
一、简介
HTTPS (全称:Hypertext Transfer Protocol Secure ),是以安全为目标的 HTTP 通道,在HTTP的基础上通过传输加密和身份认证)保证了传输过程的安全性 。
HTTPS 在HTTP 的基础下加入SSL,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL。 HTTPS 存在不同于 HTTP 的默认端口及一个加密/身份验证层(在 HTTP与 TCP之间)。这个系统提供了身份验证与加密通讯方法。
HTTPS 协议是由 HTTP 加上 TLS/SSL 协议构建的可进行加密传输、身份认证的网络协议,主要通[数字证书、加密算法、非对称密钥等技术完成互联网数据传输加密,实现互联网传输安全保护
1.1 SSL/TLS
大家可以看下阮一峰的文章图解SSL/TLS协议
SSL/TLS协议的基本思路是采用公钥加密法,也就是说,客户端先向服务器端索要公钥,然后用公钥加密信息,服务器收到密文后,用自己的私钥解密。
它是为了解决以下问题而设计的:
- 所有信息都是加密传播,第三方无法窃听。
- 具有校验机制,一旦被篡改,通信双方会立刻发现。
- 配备身份证书,防止身份被冒充。
TLS/SSL的功能实现主要依赖三类基本算法:散列函数hash、对称加密、非对称加密。这三类算法的作用如下:
- 基于散列函数验证信息的完整性
- 对称加密算法采用协商的秘钥对数据加密
- 非对称加密实现身份认证和秘钥协商
1.1.1 散列函数Hash
将任意长度的信息转换为较短的固定长度的值,通常其长度要比信息小得多,且算法不可逆。
例如:MD5、SHA-1、SHA-2、SHA-256 等
特点: 在信息传输过程中,散列函数不能单独实现信息防篡改,由于传输是明文传输,中间人可以修改信息后重新计算信息的摘要,所以需要对传输的信息和信息摘要进行加密。
1.1.2 对称加密
有流式、分组两种,加密和解密都是使用的同一个密钥。
例如:DES、DES、3DES、AES、Blowfish、IDEA、RC5、RC6 , AES-GCM、ChaCha20-Poly1305等。相同的秘钥可以用于信息的加密和解密。掌握秘钥才能获取信息,防止信息窃听,其通讯方式是一对一。
优点: 性能高
缺点: 密钥泄露风险高,因为大家共享一个密钥,假如一方泄露这个密码,就没有安全可言。
特点: 对称加密的优势就是信息传输使用一对一,需要共享相同的密码,密码的安全是保证信息安全的基础,服务器和N个客户端通信,需要维持N个密码记录且不能修改密码。
1.1.3 非对称加密
加密使用的密钥和解密使用的密钥是不相同的,分别称为:公钥、私钥,公钥和算法都是公开的,私钥是保密的。用私钥加密的数据,只有对应的公钥才能解密,用公钥加密的数据,只有对应的私钥才能解密。
非对称加密算法性能较低,但是安全性超强,由于其加密特性,非对称加密算法能加密的数据长度也是有限的。
例如: RSA、DSA、ECDSA、 DH、ECDHE
优点: 知道了公钥,也无法计算出来私钥
缺点: 计算量大,需要消耗大量的系统资源,性能低。
特点: 非对称加密的特点就是信息一对多,服务器只需要维持一个私钥就可以和多个客户端进行通信,但服务器发出的信息能够被所有的客户端解密,且该算法的计算复杂,加密的速度慢。
1.2 CA证书
上述我们介绍了SSL/TLS在HTTP中的就角色,我们知道通过非对称加密与服务端通信,那么我们想一下,服务端与客户端需要使用同一个公钥,那么这个公钥是怎么传递给客户端的呢?
如果服务端直接向客户端发送公钥,那么公钥有可能被中间人调包。
上述问题的而解决是依靠数字签名和数字证书。
1.2.1 CA
CA(Certificate Authority)是客户端与服务器都可信赖的第三方权威机构,负责发放和管理数字证书,承担公钥的合法性检验的责任。
数字证书由CA的数字签名和服务器的公钥组成 派发给客户端的数字证书 会被CA的私钥加密,只有CA的公钥才能解密。
首先使用一种 Hash 算法来对公钥和其他信息进行加密,生成一个信息摘要,然后让有公信力的认证中心(简称 CA )用它的私钥对消息摘要加密,形成签名。最后将原始的信息和签名合在一起,称为数字证书。当接收方收到数字证书的时候,先根据原始信息使用同样的 Hash 算法生成一个摘要,然后使用公证处的公钥来对数字证书中的摘要进行解密,最后将解密的摘要和生成的摘要进行对比,就能发现得到的信息是否被更改了。
1.3 TLS/SSL 握手过程
握手过程涉及4次通信,通信都是明文的。
-
ClientHello消息 :客户端(通常是浏览器)先向服务器发出加密通信的请求,这被叫做ClientHello请求。主要提供如下消息
- 支持的协议版本,例如:TLS 1.0 版,TLS1.3版
- 客户端生存的随机数,稍后用于生成对话密钥
- 支持的加密算法,例如:RSA公钥
- 支持的压缩算法
-
SeverHello消息:服务器收到客户端请求后,向客户端发出回应,这叫做SeverHello。服务器的回应包含以下内容:
- 确认使用的加密通信协议版本,比如TLS 1.0版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。
- 一个服务器生成的随机数,稍后用于生成"对话密钥"。
- 确认使用的加密方法,比如RSA公钥加密。
- 服务器证书。
-
客户端回应:首先要验证证书的合法性,验证通过后,向服务端发送消息
-
证书合法性:
- 检查数字签名
- 验证证书链
- 检查证书有效期,证书是否在有效时间范围
- 检查证书撤回状态(撤回的证书证明无效)
-
向服务端发送消息
- 一个随机数Pre-master。该随机数用服务器公钥加密(只有对应的私钥才能解密),防止被窃听。
- 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
- 客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供服务器校验。
-
-
服务器的最后回应:服务器收到客户端的第三个随机数pre-master key之后,计算生成本次会话所用的"会话密钥"
- 服务器用私钥解密加密的 Pre-master 数据,基于之前交换的两个明文随机数 random_C 和 random_S,计算得到协商密钥:enc_key = Function(random_C, random_S, Pre-Master);
- 计算之前接收的hash值,然后解密客户端发送的数据,验证数据和密钥正确性
- 验证正确后,编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
- 服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供客户端校验。
二、HTTPS与HTTP的区别
区别 | HTTP | HTTPS |
---|---|---|
安全性 | HTTP 明文传输,数据都是未加密的,安全性较差 | HTTPS(SSL+HTTP) 数据传输过程是加密的,安全性较好 |
端口号 | 默认80 | 默认443 |
URL | http:// | https:// |
用途 | 主要用于信息共享等网站,如博客等 | 用于保护性要求较高的网站, |
数据保护 | HTTP在传输前,数据未加以保护,因此传输过程中易收到攻击 | HTTPS在数据传输前对数据加以保护,接收者则需要恢复源数据,传输过程中的保护性较高 |
协议 | TCP/IP | HTTPS是基于HTTP的,但额外添加了TLS/SSL连接加密 |
CA证书 | 不需要 | 需要, CA申请证,,一般免费证书较少,因而需要一定费用。证书颁发机构如:Symantec、Comodo、GoDaddy 和 GlobalSign 等 |
搜索排名 | 无关 | 有易于搜索排名 |
响应速度 | 快, HTTP 使用 TCP 三次握手建立连接,客户端和服务器需要交换 3 个包 | 较慢与HTTP,HTTPS除了 TCP 的三个包,还要加上 ssl 握手需要的 9 个包,所以一共是 12 个包 |