文章目录
HTTPS 简介
HTTPS (Hypertext Transfer Protocol Secure) 是一种安全的通信协议,以安全为目标的HTTP通道,简单讲是HTTP的安全版。
HTTPS 通过在 HTTP 协议的基础上添加 SSL/TLS 来提供加密通信和身份验证,HTTPS的安全基础是 SSL/TLS。
这意味着,当使用 HTTPS 访问一个网站时,与该网站之间的所有通信都是加密的,从而保护数据免受中间人攻击和其他形式的网络攻击。现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。
TLS/SSL
TLS/SSL全称安全传输层协议(Transport Layer Security), 是介于TCP和HTTP之间的一层安全协议,不影响原有的TCP协议和HTTP协议,所以使用HTTPS基本上不需要对HTTP页面进行太多的改造。
TLS/SSL具有身份验证、信息加密和完整性校验的功能,主要职责就是对发起的HTTP请求的数据进行加密操作和对接收到的HTTP的内容进行解密操作。
-
SSL:
HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。 -
TLS:
它是 SSL (Secure Sockets Layer) 的继任者,因为 SSL 在过去的几个版本中存在已知的安全漏洞,所以 SSL 3.0 之后的版本被重新命名为 TLS,并且后续的改进和发展都在 TLS 的名下进行。
HTTPS 的作用:
- 建立一个信息安全通道,来保证数据传输的安全;
- 确认网站的真实性。
HTTPS 特点
-
安全性:
HTTPS在HTTP协议的基础上加入了安全层(SSL/TLS),对数据进行加密传输
保护了数据在传输过程中的安全,防止被第三方截获和窃取(Cookie都会通过加密的方式传输)
HTTPS连接在数据传输过程中始终保持加密状态,即使连接被截断,也不会影响数据的加密状态。
-
可信性:
HTTPS需要使用CA(证书颁发机构)颁发的证书来进行加密和解密操作,来验证服务端的身份
客户端在与服务端建立连接时会验证证书的真实性和合法性,确保通信双方的身份可信(防止了中间人攻击)
使用HTTPS协议可以提升用户对网站的信任度
-
完整性:
HTTPS 使用加密哈希算法来验证数据的完整性,一旦数据在传输过程中被篡改,接收方就会发现数据的完整性校验失败,从而拒绝接收被篡改的数据。
-
搜索引擎优化:
搜索引擎如 Google 已经将网站是否使用 HTTPS 作为搜索排名的一个因素,使用 HTTPS 可以提高网站在搜索结果中的排名。
HTTPS 缺点
-
性能开销
HTTPS协议需要在服务器和客户端之间建立加密连接,相对于HTTP协议需要进行更多的握手和加密解密操作,这可能会增加网络延迟和服务器负载。
-
实现难度
HTTPS协议涉及到加密算法和证书管理等复杂技术,实现难度较大,需要专业的技术支持和维护。
-
兼容性问题
虽然大多数现代浏览器都支持HTTPS协议,但仍有一些较旧的浏览器或设备可能无法很好地支持HTTPS协议,导致页面无法正常加载或出现安全警告。
-
成本问题
使用HTTPS协议需要购买SSL证书等额外的成本,对于一些小型网站或个人网站来说可能是一个负担。此外,连接服务器会占用较高的资源,增加带宽和服务器投入成本。
与 HTTP 的区别
特性/区别 | HTTP | HTTPS |
---|---|---|
安全性 | 明文传输,数据可见,不安全 | 使用SSL/TLS加密,数据安全 |
连接方式 | 无加密连接 | 加密连接,使用SSL/TLS协议 |
端口号 | 默认80 | 默认443 |
证书管理 | 不需要证书 | 需要CA颁发的SSL证书 |
连接状态 | 传输过程中可能被窃取或篡改 | 传输过程中始终保持加密状态 |
资源消耗 | 较少,无需加密解密 | 较多,需要进行加密解密操作 |
费用 | 无额外费用 | 需要购买和配置SSL证书的费用 |
兼容性 | 广泛兼容 | 可能与某些软件或设备存在兼容性问题 |
浏览器地址展示 | 无安全锁标志 | 有绿色安全锁标志 |
搜索引擎优化(SEO) | 可能排名较低(取决于搜索引擎) | 可能排名较高(取决于搜索引擎) |
HTTPS 工作流程
1. 服务端生成密钥对
在HTTPS通信中,服务端首先生成一对密钥:私钥和公钥
-
私钥:
私钥是密钥对所有者(服务端)持有的,必须严格保密,不可公布给任何人。
私钥用于解密由公钥加密的数据,以及用于对需要传输的文本的摘要进行加密,生成签名。
-
公钥:
公钥是密钥对持有者(服务端)公布给他人的,用于给数据加密。
用公钥加密的数据只能使用对应的私钥进行解密。
在签名验证过程中,接收方会使用公钥对签名进行解密,获取文本的摘要,然后与自己计算得到的摘要进行对比,以验证数据的完整性和发送者的身份。
私钥可以看成钥匙,只能自己拿着,可以解开对应的锁头
公钥可以看成锁头,给别人加密重要数据的,只有对应的钥匙才能打开
.
2. 服务端申请数字证书
采用HTTPS协议的服务端必须要有一套数字证书,可以向证书颁发机构CA提出购买申请:
常见的证书颁发机构包括Symantec、GeoTrust、Thawte等。
-
提交申请:
准备申请材料 => 线上购买 => 缴纳费用
服务端向CA提交数字证书的申请(申请包括:该实体的公钥以及相关的身份信息)
-
验证申请:
证书颁发机构将对服务端的申请进行审核,验证这个申请的真实性(如:确认申请者是否真的拥有所提交的公钥)
可能还需要服务端配合完成实名认证、域名验证等环节。
-
颁发证书:
验证通过后证书颁发机构将为服务端颁发CA数字证书
证书通常以电子文件的形式提供,服务端需要根据颁发机构的指引下载、安装和使用证书。
数字证书包含:
-
申请者的公钥:
用于在HTTPS通信中加密数据,确保数据只能被具有相应私钥的服务端解密
-
数字签名:
证书颁发机构会使用自己的私钥对证书的内容(包括申请者的公钥和一些其他信息)进行加密,生成一个数字签名(哈希值)
这个签名是证书颁发机构对证书内容的认可,确保证书没有被篡改
-
其他信息:
申请者的身份信息(如域名)
证书信息:包括证书的有效期、证书持有者的名称(域名)、证书链等信息
HTTPS的数字证书并不直接包含私钥,但它确实与私钥紧密相关。
.
3. 服务端发送数字证书
服务端收到数字证书后,当客户端发起HTTPS请求时,服务器会发送数字证书给客户端
.
4. 客户端验证数字证书
-
获取证书链:
客户端收到数字证书后就会从中获取证书链
证书链:数字证书中包含整个证书链,证书链是由一系列证书构成的链条,从服务端证书开始到中间证书,直到根证书结束。
. -
解析证书链:
客户端解析证书链中的每个证书,获取证书的各种属性(颁发者、有效期、域名等)
. -
检查证书域名:
在解析证书链后,客户端会检查证书中的域名是否与请求的域名一致
这是为了防止“中间人攻击(MITM)”,即攻击者拦截并篡改通信内容,或者冒充服务端与客户端进行通信,确保客户端与预期的服务端进行通信。
. -
验证证书的有效性:
在确认域名匹配后,客户端会验证证书的有效性(是否已过期、被吊销)
- 检查证书是否在有效期内(即证书的开始时间和结束时间)
- 检查证书是否已被吊销(通过证书吊销列表CRL或在线证书状态协议OCSP)。
.
-
验证证书链:
接下来,客户端会验证证书链的完整性(使用公钥来验证证书的数字签名)
客户端会按照顺序验证证书链中的每个证书,从服务端证书开始,使用颁发者的公钥来验证证书的数字签名,并重复此过程,直到到达受信任的根证书。
如果任何一个证书的签名验证失败,那么整个证书链将被视为无效,客户端将不会信任服务端证书,从而阻止与服务端的安全通信。
以确保证书是由受信任的证书颁发机构签发的,并且整个信任链是完整和未被篡改的。
. -
验证根证书:
最后,客户端会验证服务端证书的合法性(客户端在预置的信任机构列表中查找根证书,找到即合法)
- 根证书在列表中:那么客户端就会信任这个根证书,并认为整个证书链是有效的。
- 根证书不在列表中:那么证书链将被视为无效。
.
5. 客户端解析证书内容
数字证书被验证为有效后,客户端开始解析数字证书中的内容
数字证书中包含了许多关于服务端的信息:如服务端的公钥、证书的有效期、颁发者信息等。
.
6. 客户端传送加密信息
当客户端解析数字证书后,就会向服务端传送加密信息
这个过程通常包括以下几个步骤:
-
生成会话密钥:
客户端会生成一个随机的会话密钥(通常是一个对称密钥)
这个密钥将用于后续的加密和解密操作
-
加密会话密钥:
客户端使用服务端证书中的公钥对生成的会话密钥进行加密
这就像使用一个锁(公钥)将密钥(会话密钥)锁住,只有持有相应钥匙(私钥)的人才能打开这个锁
-
传送加密信息:
客户端将加密后的会话密钥(以及可能的其他加密参数或信息)通过HTTPS连接发送给服务端
这个过程中,由于会话密钥已经被服务端的公钥加密,因此即使数据在传输过程中被截获,攻击者也无法直接获取到会话密钥的内容
.
7. 服务端解密信息
当服务端接收到客户端发送的加密信息后,服务端使用自己的私钥来解密会话密钥
这就像服务端使用自己的钥匙打开了客户端锁上的锁,从而获取到了会话密钥。
这样,双方就都拥有了相同的会话密钥,而第三方无法知道这个密钥。
.
8. 双方协商生成会话密钥并交换
上面的 客户端传送加密信息 和 服务端解密信息 就是 双方协商生成会话密钥并交换 的过程
以上过程的加密方式称为非对称加密
.
9. 使用会话密钥进行通信
一旦会话密钥被成功协商和交换,服务端和客户端双方就可以使用这个会话密钥来对后续的HTTP请求和响应进行加密和解密了
具体来说:
-
客户端会使用会话密钥来加密其发送给服务端的HTTP请求,而服务端则使用相同的会话密钥来解密这些请求。
-
服务端也会使用会话密钥来加密其发送给客户端的HTTP响应,而客户端则使用相同的会话密钥来解密这些响应。
这种加密方式通常被称为对称加密,因为它使用同一个密钥(会话密钥)来进行加密和解密操作。
确保了通信过程中数据的安全性和机密性。因为只有拥有会话密钥的双方才能对消息进行正确的加密和解密,而第三方无法知道这个密钥,因此无法窃取或篡改通信内容。
总结⚡️
申请数字证书
- 服务端首先生成一对密钥:私钥和公钥
- 服务端向证书颁发机构提交数字证书的申请(申请包括:该实体的公钥以及相关的身份信息)
- 证书颁发机构验证申请的真实性(如:确认申请者是否真的拥有所提交的公钥)
- 验证通过后证书颁发机构将为服务端颁发CA数字证书
验证数字证书
- 客户端发起HTTPS请求后,服务器会发送其数字证书给客户端
- 客户端收到数字证书后就会从中获取证书链
- 客户端解析证书链中的每个证书,获取证书的各种属性(颁发者、有效期、域名等)
- 客户端检查证书中的域名是否与请求的域名一致
- 客户端验证证书的有效性(是否已过期、被吊销)
- 客户端验证证书链的完整性(使用公钥来验证证书的数字签名)
- 客户端验证服务器证书的合法性(在预置的信任机构列表中查找根证书,找到即合法)
生成会话密钥
- 客户端解析数字证书中的内容(得到服务器的公钥、证书的有效期等)
- 客户端会生成一个随机的会话密钥
- 客户端使用服务器证书中的公钥对生成的会话密钥进行加密
- 客户端将加密后的会话密钥发送给服务器
- 服务端用自己的私钥来解密加密后的会话密钥,从而得到会话密钥的明文
- 至此,服务端和客户端双方协商生产会话密钥并交换,以上过程为非对称加密
用会话密钥来加密和解密后续的请求
- 一旦客户端和服务器都拥有了相同的会话密钥(通过非对称加密安全地交换),它们双方就可以使用这个会话密钥来对后续的HTTP请求和响应进行加密和解密了,这个过程为对称加密
对称加密的特点是只有一个密钥(即会话密钥),用于加密和解密通信中的所有数据。这使得通信过程中的数据加密和解密速度更快,因为不需要像非对称加密那样进行复杂的数学运算。
通过非对称加密来安全地交换会话密钥
通过对称加密来进行后续的加密会话中传输实际数据
这种结合使用非对称加密和对称加密的方式,既保证了通信的安全性,又提高了加密和解密的速度。