HTTPS
HTTP 的缺点
明文传输,不安全。
HTTPS
HTTPS 主要解决了 HTTP 明文传输带来的数据安全问题,解决方式是通过加密(防止消息窃听)以及身份验证(防止中间人攻击)。
加密
采用了非对称加密和对称加密结合的方式,在通信开始先使用非对称加密来分发对称加密使用的秘钥,然后再使用对称加密进行消息发送。
非对称加密主要是 RSA 算法。
身份验证
身份验证主要是为了预防中间人攻击。引入证书颁发机构CA,将公共信息(比如域名)和公钥通过哈希算法计算消息摘要,然后使用CA的私钥对消息摘要进行加密,生成数字签名;通过数字签名和公共信息共同组成证书。
接收端到证书之后,先使用CA的公钥对数字签名进行解密得到原消息摘要,然后使用同样的哈希算法对公共信息计算消息摘要,对比两次消息摘要是否一致即可判断证书是否有效。
CA 采用分层设计,上层CA可以给下层CA做背书,而操作系统和浏览器通常会内置并信任一些顶级证书,来保证验证机制的执行。
SSL/TLS
保证机密性、完整性和端点鉴别。位于运输层和应用层之间,技术上属于应用层,但是从研发者的角度讲它属于运输层。
三个阶段:握手、秘钥导出和数据传输
握手
1. ClientHello
客户端发送内容:
支持的协议版本,比如TLS 1.0版。
一个客户端生成的随机数,稍后用于生成"对话密钥"
支持的加密方法,对称加密算法、公钥加密算法和MAC(报文鉴别码)算法
2. ServerHello
服务器响应:
确认使用的加密通信协议版本,比如TLS 1.0版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。
一个服务器生成的随机数,稍后用于生成"对话密钥"
确认使用的加密方法
服务器证书
如果服务器需要确认客户端的身份,就会再包含一项请求,要求客户端提供"客户端证书"。比如,金融机构往往只允许认证客户连入自己的网络,就会向正式客户提供USB密钥,里面就包含了一张客户端证书。
3. 客户端回应
客户端收到服务器回应以后,首先验证服务器证书。如果证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信。
如果证书没有问题,客户端就会从证书中取出服务器的公钥。然后,向服务器发送下面三项信息:
一个随机数(pre-master key)。该随机数用服务器公钥加密,防止被窃听。
编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值(MAC),用来供服务器校验。
有了pre-master key以后,客户端和服务器就同时有了三个随机数,接着双方就用事先商定的加密方法,各自生成本次会话所用的同一把"会话密钥"。
4. 服务器回应
服务器收到客户端的第三个随机数pre-master key之后,计算生成本次会话所用的"会话密钥"。然后,向客户端最后发送下面信息:
编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送
服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供客户端校验。
RSA
相关问题
为什么最后要发送所有报文的 hash 来互相校验?
防止握手过程中信息被篡改。例如在发送客户端算法列表时,攻击者可能会删除安全性强的算法,迫使双方选择较弱的算法,通过对握手过程中消息进行验证可以避免这个问题。
HTTPS 抓包工具原理
中间人攻击,需要先信任证书才可以。
参考
最后更新于
这有帮助吗?