浏览器上网时的知识

http 协议 1/2/3

http/2

现在的主流浏览器 HTTP/2 的实现都是基于 SSL/TLS 的,也就是说使用 HTTP/2 的网站都是 HTTPS 协议的。基于 SSL/TLS 的 HTTP/2 连接建立过程和 HTTPS 差不多。

https 协议

参考: https://blog.csdn.net/xiaopang_yan/article/details/78709574

安全通信机制流程详解:

  1. 客户端发送 https 请求,把自身支持的秘钥算法套件(SSL 指定版本、加密组件列表)发送给服务器
  2. 服务器判断自身是否支持该算法套件,如果支持则返回证书信息 (本质为公钥,包含了证书颁发机构,网址,过期时间等) ,否则断开连接,
  3. 客户端解析证书 (通过 TLS 协议来完成),验证证书是否有效。如果异常,则会提示是否安装证书,常见的就是浏览器搜索栏左侧出现“X”告警按钮等。
  4. 如果证书有效、或者是授信安装证书后,开始传送加密信息 (用证书加密后的随机值,供加解密使用)
  5. 服务端通过私钥解密加密信息,得到客户端发送来的随机值,然后把内容通过该值进行对称加密。这样一来,除非知道私钥,否则是无法获取加密内容的。
  6. 服务端返回加密后的内容
  7. 客户端通过前面提到的随机值对加密信息进行解密

数字签名和数字证书原理图解

关于证书

签名:签名就是在信息的后面再加上一段内容,可以证明信息没有被修改过,怎么样可以达到这个效果呢?一般是对信息做一个 hash 计算得到一个 hash 值,注意,这个过程是不可逆的,也就是说无法通过 hash 值得出原来的信息内容。在把信息发送出去时,把这个 hash 值加密后做为一个签名和信息一起发出去。接收方在收到信息后,会重新计算信息的 hash 值,并和信息所附带的 hash 值 (解密后)进行对比,如果一致,就说明信息的内容没有被修改过,因为这里 hash 计算可以保证不同的内容一定会得到不同的 hash 值,所以只要内容一被修改,根据信息内容计算的 hash 值就会变化。当然,不怀好意的人也可以修改信息内容的同时也修改 hash 值,从而让它们可以相匹配,为了防止这种情况,hash 值一般都会加密后 (也就是签名)再和信息一起发送,以保证这个 hash 值不被修改。至于如何让别人可以解密这个签名,这个过程涉及到数字证书等概念,我们后面在说到数字证书时再详细说明,这里您先只需先理解签名的这个概念。

如何确保证书没有被修改?

在发布证书时,发布者根据指纹算法 (一个 hash 算法)计算整个证书的hash 值 (指纹)并和证书放在一起使用者在打开证书时,自己也根据指纹算法计算一下证书的hash 值 (指纹),如果和刚开始的值对得上,就说明证书没有被修改过,因为证书的内容被修改后,根据证书的内容计算的出的**hash 值 (指纹)**是会变化的。注意,这个 hash (指纹)会使用证书发布机构的私钥用签名算法 (Signature algorithm)加密后和证书放在一起

注意:证书发布机构除了给别人发布证书外,他自己本身也有自己的证书证书的指纹和指纹算法,都会加密后再和证书放到一起发布,这里是用证书发布机构私钥进行加密的。这些证书发布机构自己的证书默认已经安装在操作系统当中了,这些证书发布机构自己持有与他自己的数字证书对应的私钥,他会用这个私钥加密所有他发布的证书的指纹作为数字签名。

数字签名

数字签名是个加密的过程,数字签名验证是个解密的过程。

原理

数字签名技术是将原文通过特定 HASH 函数得到的摘要信息用发送者的私钥加密,与原文一起传送给接收者。接收者只有用发送者的公钥才能解密被加密的摘要信息,然后用 HASH 函数对收到的原文提炼出一个摘要信息,与解密得到的摘要进行对比。哪怕只是一个字符不相同,用 HASH 函数生成的摘要就一定不同。如果比对结果一致,则说明收到的信息是完整的,在传输过程中没有被修改,否则信息一定被修改过,因此数字签名能够验证信息的完整性。

数字签名的作用

一是能确定消息的不可抵赖性,因为他人假冒不了发送方的私钥签名。发送方是用自己的私钥对信息进行加密的,只有使用发送方的公钥才能解密。

二是数字签名能保障消息的完整性。一次数字签名采用一个特定的哈希函数,它对不同文件产生的数字摘要的值也是不相同的。

为什么 burp 可以抓取 HTTPS 的流量

1)使用 BurpSuite 截取客户端发送给服务器的请求,然后伪装成客户端与服务器进行通信;

2)在这里就获取了服务器的发送给客服端的公钥,然后在 BurpSuite 上生成公私钥。再把 BurpSuite 生成的公钥发送给客户端。

3)而在之后的客户端发送的对称加密密钥,其实也是发送给 BurpSuite 的,在这里客户端就与 BurpSuite 建立了 https 连接。而 BurpSuite 则代替了客户端与服务器建立了 https 连接。

4)完成这一流程之后,客户端发送给服务器的内容,在 BurpSuite 上解密得到明文,所以我们在 BurpSuite 上看到的内容就是明文。而向服务器发送请求的时候,BurpSuite 会用服务器协商好的密钥进行加密然后传输内容。

5)同样服务器返回的内容也是,BurpSuite 会先解密,然后得到明文, BurpSuite 会伪装成服务器,再用 BurpSuite 与客户端协商好的密钥进行加密然后传输内容。

6)通过这样的手段,便可以获取客户端和服务器之间通信的所有内容。使用中间人攻击手段,必须要让客户端信任中间人的证书,如果客户端不信任,则这种攻击手段也无法发挥作用。

上网行为管理等设备可以监控 https 的流量吗?

HSTS

如果一个网站接受 HTTP 的请求,然后重定向到 HTTPS,用户可能在开始重定向前,通过没有加密的方式与服务器通信,比如,用户输入 http://foo.com 或者仅是输入 foo. com。这样为中间人攻击创造了机会。可以利用重定向将用户引导至恶意站点,而不是原始站的安全版本。网站通过 HTTP Strict Transport Security 标头通知浏览器,这个网站禁止使用 HTTP 方式加载,并且浏览器应该自动把所有尝试使用 HTTP 的请求自动替换为 HTTPS 请求。

HSTS 是 HTTP 严格传输安全(HTTP Strict Transport Security) 的缩写。这是一种网站用来声明他们只能使用安全连接(HTTPS)访问的方法。如果一个网站声明了 HSTS 策略,浏览器必须拒绝所有的 HTTP 连接并阻止用户接受不安全的 SSL 证书。目前大多数主流浏览器都支持 HSTS (只有一些移动浏览器无法使用它)。

应用原理:实施 HSTS 配置的网站一般是和服务器的 301 重定向进行配合使用,当用户第一次输入 HTTP 网站的时候,此时浏览器并没有转换成 HTTPS 网站访问;因为浏览器不知道该网站是 HTTP 还是 HTTPS(即浏览器没有该网站的STS 头部),所以浏览器发出的是 HTTP 请求。服务器收到 HTTP 请求后,重定向到 HTTPS 网站,再输出 HSTS 头部,接下来的 HTTP 请求,浏览器就会转换成 HTTPS 请求进行访问。

Strict-Transport-Security: max-age=172800STS 头部声明。参数含义是在 172800 秒内(48 小时),浏览器只要再向百度或其子域名发送 HTTP 请求时,由浏览器自动转成 HTTPS 来发起连接。这样可以减少服务器重定向的处理和被中间人截获请求的风险。

参考: 火狐文档 什么是 HSTS,为什么要使用它?