HTTP 与 HTTPS 有哪些区别?

1. 安全性:HTTP 是超⽂本传输协议,信息是明⽂传输,存在安全⻛险的问题。HTTPS 则解决 HTTP 不安全的缺陷,在 TCP 和 HTTP ⽹络层之间加⼊了 SSL/TLS 安全协议,使得报⽂能够加密传输。
2. 建立连接过程:HTTP 连接建⽴相对简单, TCP 三次握⼿之后便可进⾏ HTTP 的报⽂传输。⽽ HTTPS 在 TCP 三次握⼿之 后,还需进⾏ SSL/TLS 的握⼿过程,才可进⼊加密报⽂传输。
3. 端口号:HTTP 的端⼝号是 80,HTTPS 的端⼝号是 443。
4. 证书:HTTPS 协议需要向 CA(证书权威机构)申请p,来保证服务器的身份是可信的。

微信
nginx
lets encrypt

HTTP 的问题

HTTP 由于是明⽂传输,所以安全上存在以下三个⻛险:

  1. 可能会听:窃听⻛险。
    1. 通信使用明文(不加密),内容可能会被窃听。
  2. 不仅听还可能改:篡改⻛险。
    1. 无法证明报文的完整性,所以有可能以篡改。
    2. 像这样,请求或响应在传输途中,遭攻击者拦截并篡改内容的攻击称为中间人攻击。(Man-In-The-Middle attack, MITM)
  3. 不仅可以改,甚至可以自己生成:伪装⻛险。
    1. 不验证通信方的身份,因此有可能遭遇伪装。服务端和客户端都有可能遭到伪装。
    2. 存在隐患:
      1. web服务器可能被伪装
      2. 客户端可能被伪装
      3. 无法确定对方是否具备访问权限
      4. 无法判定请求是来自何方,出自谁手
      5. 无意义的请求也会照单全收,可能遭到DoS攻击

如何解决问题

  1. 听不懂:加密
    1. 通信的加密
      1. SSL或TLS组合使用,加密HTTP内容。与SSL组合使用的HTTP被称为HTTPS
    2. 内容的加密
      1. 对内容本身进行加密。要求客户端和服务端同时具备加密和解密机制。但内容仍有被篡改的风险。
  2. 能判断是否被篡改:完整性保护
    1. HTTP协议下可使用MD5SHA-1等散列值校验的方法,以及用来确认文件的数字签名方法。但这需要客户端用户本人亲自验证,浏览器无法自动帮用户检查
    2. HTTPS中,SSL提供认证和加密处理以及摘要功能。
  3. 能识别是不是真的:证书
    1. SSL提供了证书这一手段,可用于确定通信方。证书由值得信赖的第三方提供。
    2. 客户端持有证书即可完成个人身份的确认,也可用于对Web网站的认证环节。

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

HTTPS

HTTPS并非是应用层的一种新协议。只是HTTP通信接口部分使用SSL(Secure Socket Layer)和TLS(Transport Layer Security)协议代替而已。在HTTP和TCP之间加了SSL。
采用SSL后,HTTP就有了加密,证书和完整性保护这些功能。

加密

  1. 密钥加密技术
    1. 对称加密(共享密钥加密):加密和解密同用一个密钥。需要先传输共享密钥给对方(不安全)。处理速度快。(公钥加密私钥解密,或私钥数字签名(也是加密)公钥验证签名(也是解密))
    2. 非对称加密(公开密钥加密):公钥加密(公钥随便公开),私钥密。处理速度慢。
  2. HTTPS采用共享密钥加密和公开密钥加密两者并用的混合加密机制
    1. 采用公开密钥加密方式,来交换共享密钥
    2. 再采用共享密钥加密的方式进行后续的通信。
    3. https://www.zhihu.com/answer/1600962734

数字签名

数字签名就是使用私钥对数据摘要进行签名,并附带和数据一起发送。

可以起到防篡改、防伪装、防否认的作用。

非对称加密,所有人都可以用公钥发送信息,一个发送者可以伪装成另一个发送者。

假设有一个接受者Alice。如何证明发送者Bob是他自己,不是别人?

Bob 用自己的私钥对邮件内容计算一个「签名」,将「签名」和邮件内容一起发送出去,接受者 Alice 可以使用 Bob 的公钥验证这个签名是否正确,这就叫「验签」。

所以使用数字签名,我们能够鉴别消息的发送者,也就是说黑客无法伪装发送者进行发送数据,也无法篡改。

一般而言,我们不会直接对数据本身直接计算数字签名。如果数据量大的时候计算数字签名将会比较耗时,所以一般做法是先将原数据进行 Hash 运算,得到的 Hash 值就叫做「摘要」。

数字证书

数字证书就是由 CA 机构使用自己私钥,对证书申请者的公钥进行签名认证。

数字证书解决了如何安全分发公钥的问题,也奠定了信任链的基础。

Bob 和 Alice 现在可以依赖于对称加密进行保密通信,也可以依赖于数字签名验证消息是否是对方发送的。

但是这一切的根基是建立在 Alice 持有的公钥确实是 Bob的,反之亦然。

试想,Eve 如果将自己的公钥冒充 Bob 发送给 Alice,然后 Alice 保存了下来,那以后凡是 Bob 发送的消息,反而会验证签名失败,被当做冒充者。

所以,我们这里也需要一个第三方帮 Bob证明 「Bob 的公钥就是 Bob 的公钥」

数字证书叫做「公钥的数字签名」

第三方来帮我们签名,即证书颁布机构(CA),CA 会将:证书的颁布机构、有效期、公钥、持有者(subject)等信息用 CA 的私钥进行签名

并且将签名结果和这些信息放在一起,这就叫做「数字证书」。

这样,Bob 就可以去 CA 申请一个证书,然后将自己的证书发给 Alice,那么 Alice 如何验证这个证书确实是 Bob的呢? 当然是使用 CA 的公钥进行验签

注意: CA 的公钥也是需要使用证书来分发的,所以 Alice 的电脑必须安装 CA 的证书,证书里包含了 CA 的公钥

收到 Bob 发过来的数字证书后,Alice 使用 CA 的公钥进行验证,验证通过即证明这确实是 Bob 证书,也就可以使用证书中包含的 Bob 的公钥,按照之前讨论的流程进行通信。

SSL 为什么慢

  1. 通信慢。需要额外的SSL通信。
  2. 处理速度慢。需要CPU加密解密。