学习笔记 图解HTTP 第7章 HTTPS

145 阅读5分钟

7.1 HTTP的缺点

7.1.1 通信使用明文,可能会被窃听

  • TCP/IP协议在通信线路上的任何一个地方,都可以看到传输的明文数据
    • 比如路由器
    • 比如代理服务器
  • 即使加密后的数据,也会被人看到
    • 如果别人破解了加密方法,数据也就丢了

解决之道

  • 自己给实体内容加密,但加密后的内容还是可能被整个改掉
  • SSL + TLS 可以构建一条安全的通信线路
    • 实际也是蒙蔽状态,安全通信线路是啥意思?客户端和服务器直连不走代理服务器?如果要走代理服务器,它还不是照样可以拿到你的数据

7.1.2 不验证身份,可能遭遇伪装

  • 任何人都可以发起请求,无法确认这个消息到底是来自谁的
  • 有可能被DoS攻击

解决之道

  • SSL还提供证书,用于确定通信方

7.1.3 无法验证报文完整性,可能会被篡改

  • 经过中间代理/路由器/热点的时候,信息可能会被调包
  • 导致MITM中间人攻击

解决之道

  • 使用MD5和SHA1检验,但检验码可能整个被调包,并且需要用户手动验证
  • SSL可以避免这个问题,但具体怎么避免这个问题的,我还是说不清楚

7.2 HTTPS

7.2.1 HTTP + 加密 + 认证 + 完整性保护 = HTTPS

添加了加密及认证机制的HTTP就是HTTPS

7.2.2 HTTPS是身披SSL外壳的HTTP

  • HTTPS并非应用层的一种新协议
  • 只是替换了HTTP通信接口的部分功能
    • 有点类似于在HTTP和TCP之间加了一个SSL层,但它还是属于应用层的

7.2.3 加密技术

为了解决报文明文传输的问题,就出现了加密技术

  • 共享加密
    • 加密和解密使用同一个密钥
    • 【问题】密钥丢了,任何人都可以解密了
    • 我加密后,如果把密钥放在内容一起发给你,别人就很容易拿到内容和钥匙...
  • 公开加密
    • 加密和解密的钥匙不一样
    • 我先定义好私钥和公钥,再把公钥发给你,你用公钥加密后把内容发给我.
    • 这样别人就只能拿到内容而没有钥匙
    • 如果想通过公钥反推内容,除非等量子计算机出来,所以相对安全
    • 【问题】但是运算速度非常慢
  • HTTPS采用的混合加密
    • 在传递共享加密密钥的时候,使用公开加密
    • 后续的内容都使用共享加密
    • 这样即保证了安全性,又在速度上得到了保障
    • 【问题】如果传输过程中,公钥被篡改了,也会导致后续通信失败

7.2.4 证明公开密钥正确性的证书

为了解决公钥被篡改的问题,就出现了证书

  • 这一切建立的前提是对证书机构的绝对信任,如果证书机构出问题了,也就不安全了

证书验证公钥正确性的流程

  • 认证机构会把自己的公钥(比如jigou001)内置到浏览器里面
  • 网站主在认证机构注册
  • 认证机构给网站主颁发一个公钥证书(比如jigou001-ranwawa001)
  • 用户访问网站,网站会把公钥(jigou001-ranwawa001)传给用户
  • 用户拿到网站公钥后,会用机构的公钥对网站的公钥加密,然后传递给认证机构
  • 认证机构验证这个网站公钥是不是在我这里注册过,如果是,返回ok
  • 用户收到认证机构的ok后,就把请求信息加密后发给服务器开始通信,反之则提示有可能被中毒了
  • 网站主收到用户发来的信息后,就用自己的私钥来解密.

证明组织真实性的EV SSL证书

  • 可以防止用户被钓鱼攻击
  • 就是360/腾讯管家搞的那些一年收几千块的认证,没卵用
    • 主要是用户对这个没什么感知

用于确认客户端身份的客户端证书,像网银的u盘证书一样

  • 一是要用户安装太麻烦
  • 再就是要付费
  • 另外也只能证明用户身份,也不能证明是不是用户本人,所以没多大用处

自签名证书

  • 使用OpenSSL开源程序,自己给自己生成证书
  • 但是这种因为根证书没内置在浏览器里,所以可能会警告,

中级认证机构的证书的价值

  • 因为只有一些小浏览器会内置他们的根证书
  • 而像Chrome这种大浏览器不会内置,所以还是可能会警告
  • 所以国内那些认证几乎可以说没啥卵用,像之前12306的证书在Chrome下面提示警告,估计就是这个原因

7.2.5 HTTPS的安全通信机制

  • 确认加密组件
    • 客户端向服务端发送握手请求,包含相关HTTPS信息
    • 服务端确认
    • 服务端返回公钥
    • 服务端确认结束
  • 确认双方公钥
    • 客户端发送公钥
    • 客户端发送加密数据
    • 客户端确认结束
  • 确认双方公钥
    • 服务端解密用户数据
    • 服务端确认结束
  • 开始HTTP交换数据
  • 结束链接

SSL速度慢且无解

  • 加密/解密的时候会消耗更多的内存和CPU资源,导致处理速度变慢
  • 握手次数增多,除了HTTP外还要进行SSL通信,导致通信变慢

TODO

7.1.1 HTTPS建立的安全通信线路和隧道有什么异同?