文章目录
- HTTPS 简介
- HTTPS 特点
- 与 HTTP 的区别
- HTTPS 工作流程
- 1. 服务端生成密钥对
- 2. 服务端申请数字证书
- 3. 服务端发送数字证书
- 4. 客户端验证数字证书
- 5. 客户端解析证书内容
- 6. 客户端传送加密信息
- 7. 服务端解密信息
- 8. 双方协商生成会话密钥并交换
- 9. 使用会话密钥进行通信
- 总结
浅谈 HTTP
HTTPS 简介
HTTPS (Hypertext Transfer Protocol Secure) 是一种安全的通信协议,以安全为目标的HTTP通道,简单讲是HTTP的安全版。
HTTPS 通过在 HTTP 协议的基础上添加 SSL/TLS 来提供加密通信和身份验证,HTTPS的安全基础是 SSL/TLS。
这意味着,当使用 HTTPS 访问一个网站时,与该网站之间的所有通信都是加密的,从而保护数据免受中间人攻击和其他形式的网络攻击。现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。
-
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协议使用MAC(消息认证码)来确保数据的完整性。
与 HTTP 的区别
-
HTTP 是明文传输,HTTPS 通过 SSL/TLS 进行了加密
HTTPS连接在数据传输过程中始终保持加密状态,即使连接被截断,也不会影响数据的加密状态。
而HTTP的连接是明文的,一旦被截断,数据就可能被窃取或篡改。 -
HTTP 的端口号是 80,HTTPS 是 443
-
HTTPS 需要到 CA 申请证书,一般免费证书很少,需要交费
-
HTTP 的连接很简单,是无状态的;HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全。
HTTPS 工作流程
1. 服务端生成密钥对
在HTTPS通信中,服务端首先生成一对密钥:私钥和公钥
-
私钥:
私钥是密钥对所有者(服务端)持有的,必须严格保密,不可公布给任何人。
私钥用于解密由公钥加密的数据,以及用于对需要传输的文本的摘要进行加密,生成签名。
-
公钥:
公钥是密钥对持有者(服务端)公布给他人的,用于给数据加密。
用公钥加密的数据只能使用对应的私钥进行解密。
在签名验证过程中,接收方会使用公钥对签名进行解密,获取文本的摘要,然后与自己计算得到的摘要进行对比,以验证数据的完整性和发送者的身份。
私钥可以看成钥匙,只能自己拿着,可以解开对应的锁头
公钥可以看成锁头,给别人加密重要数据的,只有对应的钥匙才能打开
.
2. 服务端申请数字证书
采用HTTPS协议的服务端必须要有一套数字证书,可以向证书颁发机构CA提出购买申请:
常见的证书颁发机构包括Symantec、GeoTrust、Thawte等。
-
提交申请:
准备申请材料 => 线上购买 => 缴纳费用
服务端向CA提交数字证书的申请(申请包括:该实体的公钥以及相关的身份信息)
-
验证申请:
证书颁发机构将对服务端的申请进行审核,验证这个申请的真实性(如:确认申请者是否真的拥有所提交的公钥)
可能还需要服务端配合完成实名认证、域名验证等环节。
-
颁发证书:
验证通过后证书颁发机构将为服务端颁发CA数字证书
证书通常以电子文件的形式提供,服务端需要根据颁发机构的指引下载、安装和使用证书。
数字证书包含:
-
申请者的公钥:
用于在HTTPS通信中加密数据,确保数据只能被具有相应私钥的服务端解密
-
数字签名:
证书颁发机构会使用自己的私钥对证书的内容(包括申请者的公钥和一些其他信息)进行加密,生成一个数字签名(哈希值)
这个签名是证书颁发机构对证书内容的认可,确保证书没有被篡改
-
其他信息:
申请者的身份信息(如域名)
证书信息:包括证书的有效期、证书持有者的名称(域名)、证书链等信息
HTTPS的数字证书并不直接包含私钥,但它确实与私钥紧密相关。
.
3. 服务端发送数字证书
服务端收到数字证书后,会在HTTPS通信的TLS/SSL握手过程中主动向客户端发送数字证书
.
4. 客户端验证数字证书
-
获取证书链:
客户端收到数字证书后就会从中获取证书链
证书链:数字证书中包含整个证书链,证书链是由一系列证书构成的链条,从服务端证书开始到中间证书,直到根证书结束。
. -
解析证书链:
客户端解析证书链中的每个证书,获取证书的各种属性(颁发者、有效期、域名等)
. -
检查证书域名:
在解析证书链后,客户端会检查证书中的域名是否与请求的域名一致
这是为了防止“中间人攻击(MITM)”,即攻击者拦截并篡改通信内容,或者冒充服务端与客户端进行通信,确保客户端与预期的服务端进行通信。
. -
验证证书的有效性:
在确认域名匹配后,客户端会验证证书的有效性(是否已过期、被吊销)
- 检查证书是否在有效期内(即证书的开始时间和结束时间)
- 检查证书是否已被吊销(通过证书吊销列表CRL或在线证书状态协议OCSP)。
.
-
验证证书链:
接下来,客户端会验证证书链的完整性(使用公钥来验证证书的数字签名)
客户端会按照顺序验证证书链中的每个证书,从服务端证书开始,使用颁发者的公钥来验证证书的数字签名,并重复此过程,直到到达受信任的根证书。
如果任何一个证书的签名验证失败,那么整个证书链将被视为无效,客户端将不会信任服务端证书,从而阻止与服务端的安全通信。
以确保证书是由受信任的证书颁发机构签发的,并且整个信任链是完整和未被篡改的。
. -
验证根证书:
最后,客户端会验证服务端证书的合法性(客户端在预置的信任机构列表中查找根证书,找到即合法)
- 根证书在列表中:那么客户端就会信任这个根证书,并认为整个证书链是有效的。
- 根证书不在列表中:那么证书链将被视为无效。
.
5. 客户端解析证书内容
数字证书被验证为有效后,客户端开始解析数字证书中的内容
数字证书中包含了许多关于服务端的信息:如服务端的公钥、证书的有效期、颁发者信息等。
.
6. 客户端传送加密信息
当客户端解析数字证书后,就会向服务端传送加密信息
这个过程通常包括以下几个步骤:
-
生成会话密钥:
客户端会生成一个随机的会话密钥(通常是一个对称密钥)
这个密钥将用于后续的加密和解密操作
-
加密会话密钥:
客户端使用服务端证书中的公钥对生成的会话密钥进行加密
这就像使用一个锁(公钥)将密钥(会话密钥)锁住,只有持有相应钥匙(私钥)的人才能打开这个锁
-
传送加密信息:
客户端将加密后的会话密钥(以及可能的其他加密参数或信息)通过HTTPS连接发送给服务端
这个过程中,由于会话密钥已经被服务端的公钥加密,因此即使数据在传输过程中被截获,攻击者也无法直接获取到会话密钥的内容
.
7. 服务端解密信息
当服务端接收到客户端发送的加密信息后,服务端使用自己的私钥来解密会话密钥
这就像服务端使用自己的钥匙打开了客户端锁上的锁,从而获取到了会话密钥。
这样,双方就都拥有了相同的会话密钥,而第三方无法知道这个密钥。
.
8. 双方协商生成会话密钥并交换
上面的客户端传送加密信息 和 服务端解密信息就是 双方协商生成会话密钥并交换 的过程
.
9. 使用会话密钥进行通信
一旦会话密钥被成功协商和交换,服务端和客户端双方就可以使用这个会话密钥来对后续的HTTP请求和响应进行加密和解密了
具体来说,客户端会使用会话密钥来加密其发送给服务端的HTTP请求,而服务端则使用相同的会话密钥来解密这些请求。
同样地,服务端也会使用会话密钥来加密其发送给客户端的HTTP响应,而客户端则使用相同的会话密钥来解密这些响应。
这种加密方式通常被称为对称加密,因为它使用同一个密钥(会话密钥)来进行加密和解密操作。确保了通信过程中数据的安全性和机密性。因为只有拥有会话密钥的双方才能对消息进行正确的加密和解密,而第三方无法知道这个密钥,因此无法窃取或篡改通信内容。
总结
-
服务端首先生成一对密钥:私钥和公钥
-
服务端向证书颁发机构提交数字证书的申请(申请包括:该实体的公钥以及相关的身份信息)
-
证书颁发机构验证申请的真实性(如:确认申请者是否真的拥有所提交的公钥)
-
验证通过后证书颁发机构将为服务端颁发CA数字证书
-
服务端主动向客户端发送数字证书
-
客户端收到数字证书后就会从中获取证书链
-
客户端解析证书链中的每个证书,获取证书的各种属性(颁发者、有效期、域名等)
-
客户端检查证书中的域名是否与请求的域名一致
-
客户端验证证书的有效性(是否已过期、被吊销)
-
客户端验证证书链的完整性(使用公钥来验证证书的数字签名)
-
客户端验证服务器证书的合法性(在预置的信任机构列表中查找根证书,找到即合法)
-
客户端解析数字证书中的内容(得到服务器的公钥、证书的有效期等)
-
客户端会生成一个随机的会话密钥
-
客户端使用服务器证书中的公钥对生成的会话密钥进行加密
-
客户端将加密后的会话密钥发送给服务器
-
服务端使用自己的私钥来解密会话密钥
-
服务端和客户端双方协商生产会话密钥并交换
-
服务端和客户端双方就可以使用这个会话密钥来对后续的HTTP请求和响应进行加密和解密了